summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/socket.h1
-rw-r--r--proto/ospf/dbdes.c6
-rw-r--r--proto/ospf/iface.c17
-rw-r--r--proto/ospf/neighbor.c2
-rw-r--r--sysdep/unix/io.c14
5 files changed, 38 insertions, 2 deletions
diff --git a/lib/socket.h b/lib/socket.h
index bc4525f7..ab932b31 100644
--- a/lib/socket.h
+++ b/lib/socket.h
@@ -45,6 +45,7 @@ sock *sk_new(pool *); /* Allocate new socket */
int sk_open(sock *); /* Open socket */
int sk_send(sock *, unsigned len); /* Send data, <0=err, >0=ok, 0=sleep */
int sk_send_to(sock *, unsigned len, ip_addr to, unsigned port); /* sk_send to given destination */
+void sk_reallocate(sock *); /* Free and allocate tbuf & rbuf */
void sk_dump_all(void);
static inline int
diff --git a/proto/ospf/dbdes.c b/proto/ospf/dbdes.c
index f591955b..3cc263cd 100644
--- a/proto/ospf/dbdes.c
+++ b/proto/ospf/dbdes.c
@@ -119,6 +119,12 @@ ospf_dbdes_send(struct ospf_neighbor *n)
case NEIGHBOR_FULL:
length = ntohs(((struct ospf_packet *)n)->length);
+ if(!length)
+ {
+ OSPF_TRACE(D_PACKETS, "No packet in my buffer for repeating");
+ ospf_neigh_sm(n, INM_KILLNBR);
+ }
+
memcpy(ifa->ip_sk->tbuf, n->ldbdes, length);
/* Copy last sent packet again */
diff --git a/proto/ospf/iface.c b/proto/ospf/iface.c
index 30eb40b6..d08fa8b6 100644
--- a/proto/ospf/iface.c
+++ b/proto/ospf/iface.c
@@ -430,8 +430,23 @@ ospf_if_notify(struct proto *p, unsigned flags, struct iface *iface)
{
if((ifa=find_iface((struct proto_ospf *)p, iface))!=NULL)
{
+ struct ospf_packet *op;
+ struct ospf_neighbor *n;
OSPF_TRACE(D_EVENTS, "Changing MTU on interface %s.", iface->name);
- /* FIXME: change MTU */
+ sk_reallocate(ifa->hello_sk);
+ sk_reallocate(ifa->dr_sk);
+ sk_reallocate(ifa->ip_sk);
+
+ WALK_LIST(n,ifa->neigh_list)
+ {
+ op = (struct ospf_packet *)n->ldbdes;
+ n->ldbdes = mb_allocz(n->pool, iface->mtu);
+
+ if(ntohs(op->length) <= iface->mtu) /* If the packet in old buffer is bigger, let it filled by zeros */
+ memcpy(n->ldbdes, op, iface->mtu); /* If the packet is old is same or smaller, copy it */
+
+ rfree(op);
+ }
}
}
}
diff --git a/proto/ospf/neighbor.c b/proto/ospf/neighbor.c
index 6ba3282d..a45ed2dc 100644
--- a/proto/ospf/neighbor.c
+++ b/proto/ospf/neighbor.c
@@ -38,7 +38,7 @@ ospf_neighbor_new(struct ospf_iface *ifa)
n->ifa = ifa;
add_tail(&ifa->neigh_list, NODE n);
n->adj = 0;
- n->ldbdes=mb_alloc(pool, ifa->iface->mtu);
+ n->ldbdes=mb_allocz(pool, ifa->iface->mtu);
n->state=NEIGHBOR_DOWN;
n->inactim = tm_new(pool);
diff --git a/sysdep/unix/io.c b/sysdep/unix/io.c
index bf97e53e..b216e63b 100644
--- a/sysdep/unix/io.c
+++ b/sysdep/unix/io.c
@@ -599,6 +599,20 @@ sk_alloc_bufs(sock *s)
s->tpos = s->ttx = s->tbuf;
}
+void
+sk_reallocate(sock *s)
+{
+ if(!s) return;
+
+ if (s->rbuf_alloc)
+ xfree(s->rbuf_alloc);
+ s->rbuf = NULL;
+ if (s->tbuf_alloc)
+ xfree(s->tbuf_alloc);
+ s->tbuf = NULL;
+ sk_alloc_bufs(s);
+}
+
static void
sk_tcp_connected(sock *s)
{