diff options
| -rw-r--r-- | ospfd/ChangeLog | 9 | ||||
| -rw-r--r-- | ospfd/ospf_interface.c | 19 | ||||
| -rw-r--r-- | ospfd/ospf_interface.h | 3 | ||||
| -rw-r--r-- | ospfd/ospf_zebra.c | 12 | ||||
| -rw-r--r-- | zebra/ChangeLog | 9 | ||||
| -rw-r--r-- | zebra/rt_netlink.c | 3 | 
6 files changed, 54 insertions, 1 deletions
diff --git a/ospfd/ChangeLog b/ospfd/ChangeLog index fbffe6a2..98cabbd6 100644 --- a/ospfd/ChangeLog +++ b/ospfd/ChangeLog @@ -1,5 +1,14 @@  2005-03-29 Andrew J. Schorr <ajschorr@alumni.princeton.edu> +	* ospf_zebra.c: (ospf_interface_state_up) If the MTU of an operative +	  interface changes, print a debug message and call ospf_if_reset() +	  to simulate down/up on the interface. +	* ospf_interface.h: Declare new function ospf_if_reset(). +	* ospf_interface.c: (ospf_if_reset) New function to call ospf_if_down +	  and ospf_if_up for all ospf interfaces attached to an interface. + +2005-03-29 Andrew J. Schorr <ajschorr@alumni.princeton.edu> +  	* ospf_packet.c: (ospf_write_frags) Enhance error message to  	  show MTU.  Also make function static.  	  (ospf_write) Enhance error message to show interface name and MTU. diff --git a/ospfd/ospf_interface.c b/ospfd/ospf_interface.c index df71fad6..b76abe58 100644 --- a/ospfd/ospf_interface.c +++ b/ospfd/ospf_interface.c @@ -102,6 +102,25 @@ ospf_if_recalculate_output_cost (struct interface *ifp)      }  } +/* Simulate down/up on the interface.  This is needed, for example, when  +   the MTU changes. */ +void +ospf_if_reset(struct interface *ifp) +{ +  struct route_node *rn; +   +  for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn)) +    { +      struct ospf_interface *oi; +       +      if ( (oi = rn->info) == NULL) +	continue; + +      ospf_if_down(oi); +      ospf_if_up(oi); +    } +} +  void  ospf_if_reset_variables (struct ospf_interface *oi)  { diff --git a/ospfd/ospf_interface.h b/ospfd/ospf_interface.h index b49a3517..b3fb3ba3 100644 --- a/ospfd/ospf_interface.h +++ b/ospfd/ospf_interface.h @@ -234,6 +234,9 @@ int ospf_if_is_enable (struct ospf_interface *);  int ospf_if_get_output_cost (struct ospf_interface *);  void ospf_if_recalculate_output_cost (struct interface *); +/* Simulate down/up on the interface. */ +extern void ospf_if_reset (struct interface *); +  struct ospf_interface *ospf_vl_new (struct ospf *, struct ospf_vl_data *);  struct ospf_vl_data *ospf_vl_data_new (struct ospf_area *, struct in_addr);  struct ospf_vl_data *ospf_vl_lookup (struct ospf_area *, struct in_addr); diff --git a/ospfd/ospf_zebra.c b/ospfd/ospf_zebra.c index 8468aed9..300103e1 100644 --- a/ospfd/ospf_zebra.c +++ b/ospfd/ospf_zebra.c @@ -168,7 +168,6 @@ ospf_interface_state_up (int command, struct zclient *zclient,                           zebra_size_t length)  {    struct interface *ifp; -  struct interface if_tmp;    struct ospf_interface *oi;    struct route_node *rn; @@ -181,6 +180,7 @@ ospf_interface_state_up (int command, struct zclient *zclient,    if (if_is_operative (ifp))      {        /* Temporarily keep ifp values. */ +      struct interface if_tmp;        memcpy (&if_tmp, ifp, sizeof (struct interface));        zebra_interface_if_set_value (zclient->ibuf, ifp); @@ -196,6 +196,16 @@ ospf_interface_state_up (int command, struct zclient *zclient,            ospf_if_recalculate_output_cost (ifp);          } + +      if (if_tmp.mtu != ifp->mtu) +        { +          if (IS_DEBUG_OSPF (zebra, ZEBRA_INTERFACE)) +            zlog_debug ("Zebra: Interface[%s] MTU change %u -> %u.", +                       ifp->name, if_tmp.mtu, ifp->mtu); + +	  /* Must reset the interface (simulate down/up) when MTU changes. */ +          ospf_if_reset(ifp); +	}        return 0;      } diff --git a/zebra/ChangeLog b/zebra/ChangeLog index bc3c738c..59c154dd 100644 --- a/zebra/ChangeLog +++ b/zebra/ChangeLog @@ -1,3 +1,12 @@ +2005-03-29 Andrew J. Schorr <ajschorr@alumni.princeton.edu> + +	* rt_netlink.c: (netlink_link_change) If the status of an +	  operative interface changes (e.g. MTU changes), the client +	  daemons should be notified by calling zebra_interface_up_update. +	  Previously, the information was being updated in zebra's +	  interface structure, but the clients were not notified of +	  changes to an operative interface. +  2005-03-25 Jean-Mickael Guerin <jean-mickael.guerin@6wind.com>  	* interface.c, interface.h, rtadv.c, rtadv.h: modifications to   	  IPv6 Neighbor Discovery according to RFC3775, section 7: diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c index 43f687d4..7a78602e 100644 --- a/zebra/rt_netlink.c +++ b/zebra/rt_netlink.c @@ -1001,6 +1001,9 @@ netlink_link_change (struct sockaddr_nl *snl, struct nlmsghdr *h)                ifp->flags = ifi->ifi_flags & 0x0000fffff;                if (!if_is_operative (ifp))                  if_down (ifp); +	      else +		/* Must notify client daemons of new interface status. */ +	        zebra_interface_up_update (ifp);              }            else              {  | 
