]> git.puffer.fish Git - matthieu/frr.git/commitdiff
2003-09-29 Paul Jakma <paul@dishone.st>
authorpaul <paul>
Mon, 29 Sep 2003 19:54:53 +0000 (19:54 +0000)
committerpaul <paul>
Mon, 29 Sep 2003 19:54:53 +0000 (19:54 +0000)
* zebra/connected.c: revert the 'generic PtP' patch as it causes
far too many problems. People who use FreeSWAN should investigate
native linux ipsec.
* zebra/rt_netlink.c: ditto
* lib/if.c: ditto
* ripd/ripd.h: ditto
* ripd/ripd.c: ditto
* ripd/rip_interface.c: ditto
* ospfd/ospfd.c: ditto
* ospfd/ospf_snmp.c: ditto
* bgpd/bgp_nexthop.c: ditto

bgpd/bgp_nexthop.c
lib/if.c
ospfd/ospf_snmp.c
ospfd/ospfd.c
ripd/rip_interface.c
ripd/ripd.c
ripd/ripd.h
zebra/connected.c
zebra/rt_netlink.c

index 77b024e5ecd6f066f9359f1c4b816be8d80e1eb3..3b91373b9aa0aae5a18def83419111f11d92b11f 100644 (file)
@@ -663,7 +663,7 @@ bgp_connected_add (struct connected *ifc)
       p.family = AF_INET;
       p.prefixlen = addr->prefixlen;
 
-      if (ifc_pointopoint (ifc))
+      if (if_is_pointopoint (ifp))
        p.u.prefix4 = dest->u.prefix4;
       else
        p.u.prefix4 = addr->u.prefix4;
@@ -694,7 +694,7 @@ bgp_connected_add (struct connected *ifc)
       p.family = AF_INET6;
       p.prefixlen = addr->prefixlen;
 
-      if (ifc_pointopoint (ifc))
+      if (if_is_pointopoint (ifp))
        p.u.prefix6 = dest->u.prefix6;
       else
        p.u.prefix6 = addr->u.prefix6;
@@ -748,7 +748,7 @@ bgp_connected_delete (struct connected *ifc)
       p.family = AF_INET;
       p.prefixlen = addr->prefixlen;
 
-      if (ifc_pointopoint (ifc))
+      if (if_is_pointopoint (ifp))
        p.u.prefix4 = dest->u.prefix4;
       else
        p.u.prefix4 = addr->u.prefix4;
@@ -779,7 +779,7 @@ bgp_connected_delete (struct connected *ifc)
       p.family = AF_INET6;
       p.prefixlen = addr->prefixlen;
 
-      if (ifc_pointopoint (ifc))
+      if (if_is_pointopoint (ifp))
        p.u.prefix6 = dest->u.prefix6;
       else
        p.u.prefix6 = addr->u.prefix6;
index 68e6e4a086474e5904a417a2abb17b4cb1bba35c..524869b9c8d24a6f0a4c1e288e5c9b41fa523420 100644 (file)
--- a/lib/if.c
+++ b/lib/if.c
@@ -245,13 +245,11 @@ if_lookup_address (struct in_addr src)
   listnode node;
   struct prefix addr;
   struct prefix best;
-  struct prefix peer;
   listnode cnode;
   struct interface *ifp;
   struct prefix *p;
   struct connected *c;
   struct interface *match;
-  int prefixlen;
 
   /* Zero structures - get rid of rubbish from stack */
   memset(&addr, 0, sizeof(addr));
@@ -270,24 +268,34 @@ if_lookup_address (struct in_addr src)
       for (cnode = listhead (ifp->connected); cnode; nextnode (cnode))
        {
          c = getdata (cnode);
-         p = c->address;
 
-         if (p->family == AF_INET)
+         if (if_is_pointopoint (ifp))
            {
-             prefixlen = p->prefixlen;
+             p = c->address;
 
-             if (if_is_pointopoint (ifp) ||
-                 prefixlen >= IPV4_MAX_PREFIXLEN - 1)
+             if (p && p->family == AF_INET)
                {
-                 peer = *c->destination;
-                 peer.prefixlen = prefixlen;
-                 p = &peer;
+#ifdef OLD_RIB  /* PTP  links are conventionally identified 
+                    by the address of the far end - MAG */
+                 if (IPV4_ADDR_SAME (&p->u.prefix4, &src))
+                   return ifp;
+#endif
+                 p = c->destination;
+                 if (p && IPV4_ADDR_SAME (&p->u.prefix4, &src))
+                   return ifp;
                }
+           }
+         else
+           {
+             p = c->address;
 
-             if (prefix_match (p, &addr) && prefixlen > best.prefixlen)
+             if (p->family == AF_INET)
                {
-                 best = *p;
-                 match = ifp;
+                 if (prefix_match (p, &addr) && p->prefixlen > best.prefixlen)
+                   {
+                     best = *p;
+                     match = ifp;
+                   }
                }
            }
        }
index 41955ba5400f8108285c27e98c900ee7b78c3359..e3d01fb6314bef76045e2a96aac1b419ec08db26 100644 (file)
@@ -1440,7 +1440,7 @@ ospf_snmp_if_update (struct interface *ifp)
   /* Lookup first IPv4 address entry. */
   LIST_LOOP (ifp->connected, ifc, nn)
     {
-      if (ifc_pointopoint (ifc))
+      if (if_is_pointopoint (ifp))
        p = ifc->destination;
       else
        p = ifc->address;
index aeae8e131b9318f7d205879edef16db5012c37e4..77bb6a479e9ec833116b34be70a35e4feb173f26 100644 (file)
@@ -714,7 +714,7 @@ ospf_network_match_iface(struct connected *co, struct prefix *net)
    *   PtP special case: network specified == iface peer addr -> ospf
    */
   return (
-          ((ifc_pointopoint (co) && 
+          ((if_is_pointopoint (co) && 
             IPV4_ADDR_SAME ( &(co->destination->u.prefix4), &(net->u.prefix4)))
                  || prefix_match (net, co->address)) 
                  ? 1 : 0
@@ -756,7 +756,7 @@ ospf_network_run (struct ospf *ospf, struct prefix *p, struct ospf_area *area)
           if (CHECK_FLAG(co->flags,ZEBRA_IFA_SECONDARY))
             continue;
 
-         if (ifc_pointopoint (co))
+         if (if_is_pointopoint (co))
            addr = co->destination;
          else 
            addr = co->address;
index b47252253d4726df1915dfd48bb9913f69b7b247..2668e7dcb7ecdb9961928eff2a232c1cf668aad4 100644 (file)
@@ -396,6 +396,106 @@ rip_if_ipv4_address_check (struct interface *ifp)
                                                
   return count;
 }
+                                               
+                                               
+                                               
+
+/* Does this address belongs to me ? */
+int
+if_check_address (struct in_addr addr)
+{
+  listnode node;
+
+  for (node = listhead (iflist); node; nextnode (node))
+    {
+      listnode cnode;
+      struct interface *ifp;
+
+      ifp = getdata (node);
+
+      for (cnode = listhead (ifp->connected); cnode; nextnode (cnode))
+       {
+         struct connected *connected;
+         struct prefix_ipv4 *p;
+
+         connected = getdata (cnode);
+         p = (struct prefix_ipv4 *) connected->address;
+
+         if (p->family != AF_INET)
+           continue;
+
+         if (IPV4_ADDR_CMP (&p->prefix, &addr) == 0)
+           return 1;
+       }
+    }
+  return 0;
+}
+
+/* is this address from a valid neighbor? (RFC2453 - Sec. 3.9.2) */
+int
+if_valid_neighbor (struct in_addr addr)
+{
+  listnode node;
+  struct connected *connected = NULL;
+  struct prefix_ipv4 *p;
+
+  for (node = listhead (iflist); node; nextnode (node))
+    {
+      listnode cnode;
+      struct interface *ifp;
+
+      ifp = getdata (node);
+
+      for (cnode = listhead (ifp->connected); cnode; nextnode (cnode))
+       {
+         struct prefix *pxn = NULL; /* Prefix of the neighbor */
+         struct prefix *pxc = NULL; /* Prefix of the connected network */
+
+         connected = getdata (cnode);
+
+         if (if_is_pointopoint (ifp))
+           {
+             p = (struct prefix_ipv4 *) connected->address;
+
+             if (p && p->family == AF_INET)
+               {
+                 if (IPV4_ADDR_SAME (&p->prefix, &addr))
+                   return 1;
+
+                 p = (struct prefix_ipv4 *) connected->destination;
+                 if (p && IPV4_ADDR_SAME (&p->prefix, &addr))
+                   return 1;
+               }
+           }
+         else
+           {
+             p = (struct prefix_ipv4 *) connected->address;
+
+             if (p->family != AF_INET)
+               continue;
+
+             pxn = prefix_new();
+             pxn->family = AF_INET;
+             pxn->prefixlen = 32;
+             pxn->u.prefix4 = addr;
+             
+             pxc = prefix_new();
+             prefix_copy(pxc, (struct prefix *) p);
+             apply_mask(pxc);
+         
+             if (prefix_match (pxc, pxn)) 
+               {
+                 prefix_free (pxn);
+                 prefix_free (pxc);
+                 return 1;
+               }
+             prefix_free(pxc);
+             prefix_free(pxn);
+           }
+       }
+    }
+  return 0;
+}
 
 /* Inteface link down message processing. */
 int
index d2a6b4d4b8c5da6ea5151aad96de2b89934d3cf8..68f49ac223bc77b311c148eb0c93666e7a2a087b 100644 (file)
@@ -1017,7 +1017,7 @@ rip_response_process (struct rip_packet *packet, int size,
   /* The datagram's IPv4 source address should be checked to see
      whether the datagram is from a valid neighbor; the source of the
      datagram must be on a directly connected network  */
-  if (if_lookup_address (from->sin_addr) == NULL)
+  if (! if_valid_neighbor (from->sin_addr)) 
     {
       zlog_info ("This datagram doesn't came from a valid neighbor: %s",
                 inet_ntoa (from->sin_addr));
@@ -1602,7 +1602,7 @@ rip_read (struct thread *t)
     }
 
   /* Check is this packet comming from myself? */
-  if (if_lookup_exact_address (from.sin_addr)) 
+  if (if_check_address (from.sin_addr)) 
     {
       if (IS_RIP_DEBUG_PACKET)
        zlog_warn ("ignore packet comes from myself");
index c414c76dd46d08cf85cadfa99a4278514b14d14b..dc2f64d04931cb3e5d3f2d3cd5f0f87b3aaa8048 100644 (file)
@@ -374,6 +374,8 @@ void rip_zclient_init ();
 void rip_zclient_start ();
 void rip_zclient_reset ();
 void rip_offset_init ();
+int if_check_address (struct in_addr addr);
+int if_valid_neighbor (struct in_addr addr);
 
 int rip_request_send (struct sockaddr_in *, struct interface *, u_char);
 int rip_neighbor_lookup (struct sockaddr_in *);
index 280e423e7cec265735e57c5fbf36cf7a4cf8796c..1d19258f95e5a88cd686629a9149a5e3a71bff69 100644 (file)
@@ -69,7 +69,7 @@ connected_up_ipv4 (struct interface *ifp, struct connected *ifc)
   p.prefixlen = addr->prefixlen;
 
   /* Point-to-point check. */
-  if (ifc_pointopoint (ifc) && dest)
+  if (if_is_pointopoint (ifc) && dest)
     p.prefix = dest->prefix;
   else
     p.prefix = addr->prefix;
@@ -163,7 +163,7 @@ connected_down_ipv4 (struct interface *ifp, struct connected *ifc)
   p.prefixlen = addr->prefixlen;
 
   /* Point-to-point check. */
-  if (dest && ifc_pointopoint (ifc))
+  if (dest && if_is_pointopoint (ifc))
     p.prefix = dest->prefix;
   else
     p.prefix = addr->prefix;
@@ -250,7 +250,7 @@ connected_up_ipv6 (struct interface *ifp, struct connected *ifc)
   p.family = AF_INET6;
   p.prefixlen = addr->prefixlen;
 
-  if (ifc_pointopoint (ifc) && dest)
+  if (if_is_pointopoint (ifp) && dest)
     {
       if (IN6_IS_ADDR_UNSPECIFIED (&dest->prefix))
        p.prefix = addr->prefix;
@@ -343,7 +343,7 @@ connected_down_ipv6 (struct interface *ifp, struct connected *ifc)
   p.family = AF_INET6;
   p.prefixlen = addr->prefixlen;
 
-  if (ifc_pointopoint (ifc) && dest)
+  if (if_is_pointopoint (ifp) && dest)
     {
       if (IN6_IS_ADDR_UNSPECIFIED (&dest->prefix))
        p.prefix = addr->prefix;
index a2efa17ac472852aa54f72b0d3ede369fb6ed0a9..02cae6ee7282adf77ec296853a70b9b22c023b96 100644 (file)
@@ -487,7 +487,6 @@ netlink_interface_addr (struct sockaddr_nl *snl, struct nlmsghdr *h)
   void *broad = NULL;
   u_char flags = 0;
   char *label = NULL;
-  int peeronly = 0;
 
   ifa = NLMSG_DATA (h);
 
@@ -539,40 +538,41 @@ netlink_interface_addr (struct sockaddr_nl *snl, struct nlmsghdr *h)
       if (tb[IFA_LABEL] && strcmp (ifp->name, RTA_DATA (tb[IFA_LABEL])))
         zlog_info ("  IFA_LABEL     %s", RTA_DATA (tb[IFA_LABEL]));
     }
-
-  /* peer or broadcast network? */
-  if (ifa->ifa_family == AF_INET)
-    peeronly = if_is_pointopoint (ifp) ||
-      ifa->ifa_prefixlen >= IPV4_MAX_PREFIXLEN - 1;
-#ifdef HAVE_IPV6
-  if (ifa->ifa_family == AF_INET6)
+  
+  if (tb[IFA_ADDRESS] == NULL)
+    tb[IFA_ADDRESS] = tb[IFA_LOCAL];
+  
+  if (ifp->flags & IFF_POINTOPOINT)
     {
-      peeronly = if_is_pointopoint (ifp) ||
-        ifa->ifa_prefixlen >= IPV6_MAX_PREFIXLEN - 1;
+      if (tb[IFA_LOCAL])
+        {
+          addr = RTA_DATA (tb[IFA_LOCAL]);
+          if (tb[IFA_ADDRESS])
+            broad = RTA_DATA (tb[IFA_ADDRESS]);
+          else
+            broad = NULL;
+        }
+      else
+        {
+          if (tb[IFA_ADDRESS])
+            addr = RTA_DATA (tb[IFA_ADDRESS]);
+          else
+            addr = NULL;
+        }
     }
-#endif /* HAVE_IPV6 */
-  if (!(tb[IFA_LOCAL] && tb[IFA_ADDRESS]))
+  else
     {
-      /* FIXME: IPv6 Appears to have only IFA_ADDRESS */
-      peeronly = 0;
+      if (tb[IFA_ADDRESS])
+        addr = RTA_DATA (tb[IFA_ADDRESS]);
+      else
+        addr = NULL;
+      
+      if (tb[IFA_BROADCAST])
+        broad = RTA_DATA(tb[IFA_BROADCAST]);
+      else
+        broad = NULL;
     }
 
-  /* network. prefixlen applies to IFA_ADDRESS rather than IFA_LOCAL */
-  if (tb[IFA_ADDRESS] && !peeronly)
-    addr = RTA_DATA (tb[IFA_ADDRESS]);
-  else if (tb[IFA_LOCAL])
-    addr = RTA_DATA (tb[IFA_LOCAL]);
-  else
-    addr = NULL;
-
-  /* broadcast/peer */
-  if (tb[IFA_BROADCAST])
-    broad = RTA_DATA (tb[IFA_BROADCAST]);
-  else if (tb[IFA_ADDRESS] && peeronly)
-    broad = RTA_DATA (tb[IFA_ADDRESS]); /* peer address specified */
-  else
-    broad = NULL;
-
   /* Flags. */
   if (ifa->ifa_flags & IFA_F_SECONDARY)
     SET_FLAG (flags, ZEBRA_IFA_SECONDARY);