]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
OSPF is ready for changing MTU.
authorOndrej Filip <feela@network.cz>
Fri, 4 Jun 2004 18:51:29 +0000 (18:51 +0000)
committerOndrej Filip <feela@network.cz>
Fri, 4 Jun 2004 18:51:29 +0000 (18:51 +0000)
lib/socket.h
proto/ospf/dbdes.c
proto/ospf/iface.c
proto/ospf/neighbor.c
sysdep/unix/io.c

index bc4525f7f4f5a30ff7ab12d88d394e2aedfc37f1..ab932b31a3b7eaedaace95e6123211843433ed4b 100644 (file)
@@ -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
index f591955b592af8707d410f123a2f43a8fb8ba793..3cc263cdf3e7671c047552401255ca4186fcaa81 100644 (file)
@@ -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 */
 
index 30eb40b64365c0d58b7f477968273e27d8cfb3f7..d08fa8b65d88dabb258135818747a356fe8208f1 100644 (file)
@@ -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);
+      }
     }
   }
 }
index 6ba3282db7bef79ecb55423d505a56962224a063..a45ed2dc82f16de4b438fd6084839dfbe7409cde 100644 (file)
@@ -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);
index bf97e53e354f6b581a7de60f30f5f1ebf74eda09..b216e63b1b90761371051f91509018440cd9dbdf 100644 (file)
@@ -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)
 {