diff options
-rw-r--r-- | lib/socket.h | 1 | ||||
-rw-r--r-- | proto/ospf/dbdes.c | 6 | ||||
-rw-r--r-- | proto/ospf/iface.c | 17 | ||||
-rw-r--r-- | proto/ospf/neighbor.c | 2 | ||||
-rw-r--r-- | sysdep/unix/io.c | 14 |
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) { |