I am on vacation(2 more weeks :) and have a hard time to remember the details 
after several months. I do recall thinking this patch(s) need some more work. 
To start with, just add normal unnumbered ppp support without any special ptp 
over ethernet.
ATM, this is all I can rember (I do not have access to anything as I am 
traveling).

   Jocke

Den 30 jun 2016 16:39 skrev Paul Jakma <[email protected]>:
Hi,

This is queued for consideration for round-8.

Joakim had noted this was not compatible with existing Quagga setups. Is
there any way to address his concerns. He knows his stuff on this - it'd
be really good to learn from his patches and/or comments and introduce
unnumbered in a way that doesn't break existing setups, if at all
possible.

regards,

Paul

On Fri, 11 Dec 2015, Donald Sharp wrote:

> From: James Li <[email protected]>
>
> Allow ospf to use unnumbered links by utilizing the loopback interface IP
> address.
>
> Example Config:
>
> interface lo:1
>  address 10.2.1.3/32
>
> int swp1
>  ip ospf network point-to-point
>
> int swp2
>  ip ospf network point-to-point
>
> router ospf
>  ospf router-id 10.2.1.3
>  network 10.2.1.3/32 area 0.0.0.0
>
> Signed-off-by: James Li <[email protected]>
> Signed-off-by: Dinesh Dutt <[email protected]>
> Reviewed-by: JR Rivers <[email protected]>
> Signed-off-by: Donald Sharp <[email protected]>
> ---
> ospfd/ospf_interface.c | 13 +++++++++---
> ospfd/ospf_lsa.c       | 39 ++++++++++++++++++++++++-----------
> ospfd/ospf_route.c     |  2 +-
> ospfd/ospf_vty.c       | 55 ++++++++++++++++++++++++++++----------------------
> ospfd/ospf_zebra.c     | 25 +++++++++++++++++++++--
> 5 files changed, 92 insertions(+), 42 deletions(-)
>
> diff --git a/ospfd/ospf_interface.c b/ospfd/ospf_interface.c
> index f41c4f1..85494f4 100644
> --- a/ospfd/ospf_interface.c
> +++ b/ospfd/ospf_interface.c
> @@ -351,7 +351,12 @@ ospf_if_is_configured (struct ospf *ospf, struct in_addr 
> *address)
>   for (ALL_LIST_ELEMENTS (ospf->oiflist, node, nnode, oi))
>     if (oi->type != OSPF_IFTYPE_VIRTUALLINK)
>       {
> -        if (oi->type == OSPF_IFTYPE_POINTOPOINT)
> +        if (CHECK_FLAG(oi->connected->flags, ZEBRA_IFA_UNNUMBERED))
> +          {
> +            if (htonl(oi->ifp->ifindex) == address->s_addr)
> +              return oi;
> +          }
> +        else if (oi->type == OSPF_IFTYPE_POINTOPOINT)
>          {
>            /* special leniency: match if addr is anywhere on peer subnet */
>            if (prefix_match(CONNECTED_PREFIX(oi->connected),
> @@ -475,8 +480,10 @@ ospf_if_lookup_recv_if (struct ospf *ospf, struct 
> in_addr src,
>       if (if_is_loopback (oi->ifp))
>         continue;
>
> -      if (prefix_match (CONNECTED_PREFIX(oi->connected),
> -                              (struct prefix *) &addr))
> +      if (CHECK_FLAG(oi->connected->flags, ZEBRA_IFA_UNNUMBERED))
> +        match = oi;
> +      else if (prefix_match (CONNECTED_PREFIX(oi->connected),
> +                             (struct prefix *) &addr))
>        {
>          if ( (match == NULL) ||
>               (match->address->prefixlen < oi->address->prefixlen)
> diff --git a/ospfd/ospf_lsa.c b/ospfd/ospf_lsa.c
> index 05587e8..8d18120 100644
> --- a/ospfd/ospf_lsa.c
> +++ b/ospfd/ospf_lsa.c
> @@ -543,7 +543,7 @@ lsa_link_ptop_set (struct stream *s, struct 
> ospf_interface *oi)
> {
>   int links = 0;
>   struct ospf_neighbor *nbr;
> -  struct in_addr id, mask;
> +  struct in_addr id, mask, data;
>   u_int16_t cost = ospf_link_cost (oi);
>
>   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
> @@ -552,19 +552,34 @@ lsa_link_ptop_set (struct stream *s, struct 
> ospf_interface *oi)
>   if ((nbr = ospf_nbr_lookup_ptop (oi)))
>     if (nbr->state == NSM_Full)
>       {
> -     /* For unnumbered point-to-point networks, the Link Data field
> -        should specify the interface's MIB-II ifIndex value. */
> -     links += link_info_set (s, nbr->router_id, oi->address->u.prefix4,
> -                             LSA_LINK_TYPE_POINTOPOINT, 0, cost);
> +        if (CHECK_FLAG(oi->connected->flags, ZEBRA_IFA_UNNUMBERED))
> +          {
> +            /* For unnumbered point-to-point networks, the Link Data field
> +               should specify the interface's MIB-II ifIndex value. */
> +            data.s_addr = htonl(oi->ifp->ifindex);
> +            links += link_info_set (s, nbr->router_id, data,
> +                                    LSA_LINK_TYPE_POINTOPOINT, 0, cost);
> +          }
> +        else
> +          {
> +            links += link_info_set (s, nbr->router_id,
> +                                    oi->address->u.prefix4,
> +                                    LSA_LINK_TYPE_POINTOPOINT, 0, cost);
> +          }
>       }
>
> -  /* Regardless of the state of the neighboring router, we must
> -     add a Type 3 link (stub network).
> -     N.B. Options 1 & 2 share basically the same logic. */
> -  masklen2ip (oi->address->prefixlen, &mask);
> -  id.s_addr = CONNECTED_PREFIX(oi->connected)->u.prefix4.s_addr & 
> mask.s_addr;
> -  links += link_info_set (s, id, mask, LSA_LINK_TYPE_STUB, 0,
> -                       oi->output_cost);
> +  /* no need for a stub link for unnumbered interfaces */
> +  if (!CHECK_FLAG(oi->connected->flags, ZEBRA_IFA_UNNUMBERED))
> +    {
> +      /* Regardless of the state of the neighboring router, we must
> +         add a Type 3 link (stub network).
> +         N.B. Options 1 & 2 share basically the same logic. */
> +      masklen2ip (oi->address->prefixlen, &mask);
> +      id.s_addr = CONNECTED_PREFIX(oi->connected)->u.prefix4.s_addr & 
> mask.s_addr;
> +      links += link_info_set (s, id, mask, LSA_LINK_TYPE_STUB, 0,
> +                              oi->output_cost);
> +    }
> +
>   return links;
> }
>
> diff --git a/ospfd/ospf_route.c b/ospfd/ospf_route.c
> index eb7829a..51e6eba 100644
> --- a/ospfd/ospf_route.c
> +++ b/ospfd/ospf_route.c
> @@ -783,7 +783,7 @@ ospf_route_copy_nexthops_from_vertex (struct ospf_route 
> *to,
>              path = ospf_path_new ();
>              path->nexthop = nexthop->router;
>              path->ifindex = nexthop->oi->ifp->ifindex;
> -           listnode_add (to->paths, path);
> +            listnode_add (to->paths, path);
>            }
>        }
>     }
> diff --git a/ospfd/ospf_vty.c b/ospfd/ospf_vty.c
> index d9038c8..7f8ff0e 100644
> --- a/ospfd/ospf_vty.c
> +++ b/ospfd/ospf_vty.c
> @@ -3011,30 +3011,37 @@ show_ip_ospf_interface_sub (struct vty *vty, struct 
> ospf *ospf,
>       if (oi == NULL)
>        continue;
>
> -      /* Show OSPF interface information. */
> -      vty_out (vty, "  Internet Address %s/%d,",
> -            inet_ntoa (oi->address->u.prefix4), oi->address->prefixlen);
> -
> -      if (oi->connected->destination || oi->type == OSPF_IFTYPE_VIRTUALLINK)
> +      if (CHECK_FLAG(oi->connected->flags, ZEBRA_IFA_UNNUMBERED))
>         {
> -          struct in_addr *dest;
> -          const char *dstr;
> -
> -       if (CONNECTED_PEER(oi->connected)
> -           || oi->type == OSPF_IFTYPE_VIRTUALLINK)
> -            dstr = "Peer";
> -          else
> -            dstr = "Broadcast";
> -
> -          /* For Vlinks, showing the peer address is probably more
> -           * informative than the local interface that is being used
> -           */
> -          if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
> -            dest = &oi->vl_data->peer_addr;
> -          else
> -            dest = &oi->connected->destination->u.prefix4;
> -
> -       vty_out (vty, " %s %s,", dstr, inet_ntoa (*dest));
> +          vty_out (vty, "  This interface is UNNUMBERED,");
> +        }
> +      else
> +        {
> +          /* Show OSPF interface information. */
> +          vty_out (vty, "  Internet Address %s/%d,",
> +                   inet_ntoa (oi->address->u.prefix4), 
> oi->address->prefixlen);
> +
> +          if (oi->connected->destination || oi->type == 
> OSPF_IFTYPE_VIRTUALLINK)
> +            {
> +              struct in_addr *dest;
> +              const char *dstr;
> +
> +              if (CONNECTED_PEER(oi->connected)
> +                  || oi->type == OSPF_IFTYPE_VIRTUALLINK)
> +                dstr = "Peer";
> +              else
> +                dstr = "Broadcast";
> +
> +              /* For Vlinks, showing the peer address is probably more
> +               * informative than the local interface that is being used
> +               */
> +              if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
> +                dest = &oi->vl_data->peer_addr;
> +              else
> +                dest = &oi->connected->destination->u.prefix4;
> +
> +              vty_out (vty, " %s %s,", dstr, inet_ntoa (*dest));
> +            }
>         }
>
>       vty_out (vty, " Area %s%s", ospf_area_desc_string (oi->area),
> @@ -3086,7 +3093,7 @@ show_ip_ospf_interface_sub (struct vty *vty, struct 
> ospf *ospf,
>                       inet_ntoa (nbr->address.u.prefix4), VTY_NEWLINE);
>            }
>        }
> -
> +
>       /* Next network-LSA sequence number we'll use, if we're elected DR */
>       if (oi->params && ntohl (oi->params->network_lsa_seqnum)
>                           != OSPF_INITIAL_SEQUENCE_NUMBER)
> diff --git a/ospfd/ospf_zebra.c b/ospfd/ospf_zebra.c
> index 83a0ba2..790a4c1 100644
> --- a/ospfd/ospf_zebra.c
> +++ b/ospfd/ospf_zebra.c
> @@ -379,6 +379,26 @@ ospf_zebra_add (struct prefix_ipv4 *p, struct ospf_route 
> *or)
>       /* Nexthop, ifindex, distance and metric information. */
>       for (ALL_LIST_ELEMENTS_RO (or->paths, node, path))
>         {
> +       if ((path->nexthop.s_addr != INADDR_ANY &&
> +            path->ifindex != 0))
> +         {
> +           stream_putc (s, ZEBRA_NEXTHOP_IPV4_IFINDEX);
> +           stream_put_in_addr (s, &path->nexthop);
> +           stream_putl (s, path->ifindex);
> +         }
> +       else if (path->nexthop.s_addr != INADDR_ANY)
> +         {
> +           stream_putc (s, ZEBRA_NEXTHOP_IPV4);
> +           stream_put_in_addr (s, &path->nexthop);
> +         }
> +       else
> +         {
> +           stream_putc (s, ZEBRA_NEXTHOP_IFINDEX);
> +           if (path->ifindex)
> +             stream_putl (s, path->ifindex);
> +           else
> +             stream_putl (s, 0);
> +         }
>           if (path->nexthop.s_addr != INADDR_ANY &&
>              path->ifindex != 0)
>             {
> @@ -403,12 +423,13 @@ ospf_zebra_add (struct prefix_ipv4 *p, struct 
> ospf_route *or)
>           if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE))
>             {
>              char buf[2][INET_ADDRSTRLEN];
> -           zlog_debug("Zebra: Route add %s/%d nexthop %s",
> +           zlog_debug("Zebra: Route add %s/%d nexthop %s, ifindex=%d",
>                         inet_ntop(AF_INET, &p->prefix,
>                                   buf[0], sizeof(buf[0])),
>                         p->prefixlen,
>                         inet_ntop(AF_INET, &path->nexthop,
> -                                buf[1], sizeof(buf[1])));
> +                                buf[1], sizeof(buf[1])),
> +                      path->ifindex);
>             }
>         }
>
>

--
Paul Jakma | [email protected] | @pjakma | Key ID: 0xD86BF79464A2FF6A
Fortune:
"My life is a soap opera, but who has the rights?"
         -- MadameX

_______________________________________________
Quagga-dev mailing list
[email protected]
https://lists.quagga.net/mailman/listinfo/quagga-dev

Reply via email to