]> git.puffer.fish Git - matthieu/frr.git/commitdiff
ospfd Point-to-Multipoint support
authorpaul <paul>
Fri, 13 Dec 2002 20:59:45 +0000 (20:59 +0000)
committerpaul <paul>
Fri, 13 Dec 2002 20:59:45 +0000 (20:59 +0000)
ospfd/ospf_lsa.c
ospfd/ospf_packet.c
ospfd/ospf_spf.c

index 5b63a76dd80fc971dfc0868d0a28935fd07b4ac7..6d7af0580f3225d7310f149fc79c62247989e3bd 100644 (file)
@@ -589,6 +589,44 @@ lsa_link_virtuallink_set (struct stream *s, struct ospf_interface *oi)
 
 #define lsa_link_nbma_set(S,O)  lsa_link_broadcast_set (S, O)
 
+/* this function add for support point-to-multipoint ,see rfc2328 
+12.4.1.4.*/
+/* from "edward rrr" <edward_rrr@hotmail.com>
+   http://marc.theaimsgroup.com/?l=zebra&m=100739222210507&w=2 */
+int lsa_link_ptomultip_set (struct stream *s, struct ospf_interface *oi)
+{
+  int links = 0;
+  struct route_node *rn;
+  struct ospf_neighbor *nbr = NULL;
+  struct in_addr id, mask;
+
+  mask.s_addr = 0xffffffff;
+  id.s_addr = oi->address->u.prefix4.s_addr;
+  link_info_set (s, id, mask, LSA_LINK_TYPE_STUB, 0, 0);
+  links++;
+
+  zlog_info ("PointToMultipoint: running ptomultip_set");
+
+  /* Search neighbor, */
+  for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
+    if ((nbr = rn->info) != NULL)
+      /* Ignore myself. */
+      if (!IPV4_ADDR_SAME (&nbr->router_id, &ospf_top->router_id))
+       if (nbr->state == NSM_Full)
+
+         {
+           
+           link_info_set (s, nbr->router_id, oi->address->u.prefix4,
+                          LSA_LINK_TYPE_POINTOPOINT, 0, oi->output_cost);
+           links++;
+           zlog_info ("PointToMultipoint: set link to %s",
+                      inet_ntoa(oi->address->u.prefix4));
+         }
+  
+  return links;
+  
+}
+
 /* Set router-LSA link information. */
 int
 router_lsa_link_set (struct stream *s, struct ospf_area *area)
@@ -619,7 +657,7 @@ router_lsa_link_set (struct stream *s, struct ospf_area *area)
                  links += lsa_link_nbma_set (s, oi);
                  break;
                case OSPF_IFTYPE_POINTOMULTIPOINT:
-                 /* Not supproted yet. */
+                 links += lsa_link_ptomultip_set (s, oi);
                  break;
                case OSPF_IFTYPE_VIRTUALLINK:
                  links += lsa_link_virtuallink_set (s, oi);
index 62b93fef2491f1a7083394c6040c943b609c011a..d2338fffda98df76f78f237c2ee01379e6920f9c 100644 (file)
@@ -3137,6 +3137,8 @@ ospf_ls_upd_send (struct ospf_neighbor *nbr, list update, int flag)
   else if ((oi->type == OSPF_IFTYPE_POINTOPOINT) 
           && (flag == OSPF_SEND_PACKET_INDIRECT))
      p.prefix.s_addr = htonl (OSPF_ALLSPFROUTERS);
+  else if (oi->type == OSPF_IFTYPE_POINTOMULTIPOINT)
+     p.prefix.s_addr = htonl (OSPF_ALLSPFROUTERS);
   else
      p.prefix.s_addr = htonl (OSPF_ALLDROUTERS);
 
index d6254717058595e7092512fab225508c81da5901..6e92bb2051e2fad0c6522af14a1e5ba4df5de8f6 100644 (file)
@@ -365,18 +365,39 @@ ospf_nexthop_calculation (struct ospf_area *area,
              
              if (l->m[0].type == LSA_LINK_TYPE_POINTOPOINT)
                {
-                 while ((l2 = ospf_get_next_link (w, v, l2)))
+                 /* check for PtMP, signified by PtP link V->W with link_data our PtMP interface */
+                  oi = ospf_if_is_configured(&l->link_data);
+                  if (oi && oi->type == OSPF_IFTYPE_POINTOMULTIPOINT)
                    {
-                     oi = ospf_if_is_configured (&(l2->link_data));
+                   
+                     struct prefix_ipv4 * la = prefix_ipv4_new();
+                     la->prefixlen = oi->address->prefixlen;
                      
-                     if (oi == NULL)
-                       continue;
-                     
-                     if (! IPV4_ADDR_SAME (&oi->address->u.prefix4,
-                                           &l->link_data))
-                       continue;
-                     
-                     break;
+                     /* we link to them on PtMP interface - find the interface on w */
+                     while ((l2 = ospf_get_next_link (w, v, l2)))
+                       {
+                         la->prefix = l2->link_data;
+                         
+                         if (prefix_cmp((struct prefix *)la, oi->address) == 0)
+                           /* link_data is on our PtMP network */
+                           break;
+                         
+                       }
+                   }
+                 else
+                   {                                
+                     while ((l2 = ospf_get_next_link (w, v, l2)))
+                       {
+                         oi = ospf_if_is_configured (&(l2->link_data));
+                         
+                         if (oi == NULL)
+                           continue;
+                         
+                         if (!IPV4_ADDR_SAME (&oi->address->u.prefix4, &l->link_data))
+                           continue;
+                         
+                         break;
+                      }
                    }
                  
                  if (oi && l2)