]> git.puffer.fish Git - mirror/frr.git/commitdiff
zebra: Add connected with noprefixroute
authorDonald Sharp <sharpd@nvidia.com>
Wed, 6 Dec 2023 13:33:31 +0000 (08:33 -0500)
committerDonald Sharp <sharpd@nvidia.com>
Wed, 6 Dec 2023 14:27:52 +0000 (09:27 -0500)
Add ability for the connected routes to know
if they are a prefix route or not.

sharpd@eva:/work/home/sharpd/frr1$ ip addr show dev dummy1
13: dummy1: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether aa:93:ce:ce:3f:62 brd ff:ff:ff:ff:ff:ff
    inet 192.168.55.1/24 scope global noprefixroute dummy1
       valid_lft forever preferred_lft forever
    inet 192.168.56.1/24 scope global dummy1
       valid_lft forever preferred_lft forever
    inet6 fe80::a893:ceff:fece:3f62/64 scope link
       valid_lft forever preferred_lft forever

sharpd@eva:/work/home/sharpd/frr1$ sudo vtysh -c "show int dummy1"
Interface dummy1 is up, line protocol is up
  Link ups:       0    last: (never)
  Link downs:     0    last: (never)
  vrf: default
  index 13 metric 0 mtu 1500 speed 0 txqlen 1000
  flags: <UP,BROADCAST,RUNNING,NOARP>
  Type: Ethernet
  HWaddr: aa:93:ce:ce:3f:62
  inet 192.168.55.1/24 noprefixroute
  inet 192.168.56.1/24
  inet6 fe80::a893:ceff:fece:3f62/64
  Interface Type Other
  Interface Slave Type None
  protodown: off

sharpd@eva:/work/home/sharpd/frr1$ sudo vtysh -c "show ip route"
Codes: K - kernel route, C - connected, L - local, S - static,
       R - RIP, O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric, t - Table-Direct,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup
       t - trapped, o - offload failure

K>* 0.0.0.0/0 [0/100] via 192.168.119.1, enp13s0, 00:00:08
K>* 169.254.0.0/16 [0/1000] is directly connected, virbr2 linkdown, 00:00:08
L>* 192.168.44.1/32 is directly connected, dummy2, 00:00:08
L>* 192.168.55.1/32 is directly connected, dummy1, 00:00:08
C>* 192.168.56.0/24 is directly connected, dummy1, 00:00:08
L>* 192.168.56.1/32 is directly connected, dummy1, 00:00:08
L>* 192.168.119.205/32 is directly connected, enp13s0, 00:00:08

sharpd@eva:/work/home/sharpd/frr1$ ip route show
default via 192.168.119.1 dev enp13s0 proto dhcp metric 100
169.254.0.0/16 dev virbr2 scope link metric 1000 linkdown
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
192.168.45.0/24 dev virbr2 proto kernel scope link src 192.168.45.1 linkdown
192.168.56.0/24 dev dummy1 proto kernel scope link src 192.168.56.1
192.168.119.0/24 dev enp13s0 proto kernel scope link src 192.168.119.205 metric 100
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1 linkdown

sharpd@eva:/work/home/sharpd/frr1$ ip route show table 255
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
local 172.17.0.1 dev docker0 proto kernel scope host src 172.17.0.1
broadcast 172.17.255.255 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
local 192.168.44.1 dev dummy2 proto kernel scope host src 192.168.44.1
broadcast 192.168.44.255 dev dummy2 proto kernel scope link src 192.168.44.1
local 192.168.45.1 dev virbr2 proto kernel scope host src 192.168.45.1
broadcast 192.168.45.255 dev virbr2 proto kernel scope link src 192.168.45.1 linkdown
local 192.168.55.1 dev dummy1 proto kernel scope host src 192.168.55.1
broadcast 192.168.55.255 dev dummy1 proto kernel scope link src 192.168.55.1
local 192.168.56.1 dev dummy1 proto kernel scope host src 192.168.56.1
broadcast 192.168.56.255 dev dummy1 proto kernel scope link src 192.168.56.1
local 192.168.119.205 dev enp13s0 proto kernel scope host src 192.168.119.205
broadcast 192.168.119.255 dev enp13s0 proto kernel scope link src 192.168.119.205
local 192.168.122.1 dev virbr0 proto kernel scope host src 192.168.122.1
broadcast 192.168.122.255 dev virbr0 proto kernel scope link src 192.168.122.1 linkdown

Fixes: #14952
Signed-off-by: Donald Sharp <sharpd@nvidia.com>
lib/if.h
zebra/connected.c
zebra/interface.c

index 560635f7c4800a06781d85a55c8c111cd1d297d8..fd5f6f7502e611e778d521c2c890c6ab0748bdaf 100644 (file)
--- a/lib/if.h
+++ b/lib/if.h
@@ -434,6 +434,8 @@ struct connected {
 #define ZEBRA_IFA_SECONDARY    (1 << 0)
 #define ZEBRA_IFA_PEER         (1 << 1)
 #define ZEBRA_IFA_UNNUMBERED   (1 << 2)
+#define ZEBRA_IFA_NOPREFIXROUTE (1 << 3)
+
        /* N.B. the ZEBRA_IFA_PEER flag should be set if and only if
           a peer address has been configured.  If this flag is set,
           the destination field must contain the peer address.
index 297234b6afb7a11618589606cdfa5ec95e62089e..404f892f6e5c688fd3caf087b4435efcfa6480d6 100644 (file)
@@ -282,13 +282,15 @@ void connected_up(struct interface *ifp, struct connected *ifc)
                        return;
        }
 
-       rib_add(afi, SAFI_UNICAST, zvrf->vrf->vrf_id, ZEBRA_ROUTE_CONNECT, 0,
-               flags, &p, NULL, &nh, 0, zvrf->table_id, metric, 0, 0, 0,
-               false);
+       if (!CHECK_FLAG(ifc->flags, ZEBRA_IFA_NOPREFIXROUTE)) {
+               rib_add(afi, SAFI_UNICAST, zvrf->vrf->vrf_id,
+                       ZEBRA_ROUTE_CONNECT, 0, flags, &p, NULL, &nh, 0,
+                       zvrf->table_id, metric, 0, 0, 0, false);
 
-       rib_add(afi, SAFI_MULTICAST, zvrf->vrf->vrf_id, ZEBRA_ROUTE_CONNECT, 0,
-               flags, &p, NULL, &nh, 0, zvrf->table_id, metric, 0, 0, 0,
-               false);
+               rib_add(afi, SAFI_MULTICAST, zvrf->vrf->vrf_id,
+                       ZEBRA_ROUTE_CONNECT, 0, flags, &p, NULL, &nh, 0,
+                       zvrf->table_id, metric, 0, 0, 0, false);
+       }
 
        if (install_local) {
                rib_add(afi, SAFI_UNICAST, zvrf->vrf->vrf_id, ZEBRA_ROUTE_LOCAL,
@@ -481,11 +483,15 @@ void connected_down(struct interface *ifp, struct connected *ifc)
         * Same logic as for connected_up(): push the changes into the
         * head.
         */
-       rib_delete(afi, SAFI_UNICAST, zvrf->vrf->vrf_id, ZEBRA_ROUTE_CONNECT, 0,
-                  0, &p, NULL, &nh, 0, zvrf->table_id, 0, 0, false);
+       if (!CHECK_FLAG(ifc->flags, ZEBRA_IFA_NOPREFIXROUTE)) {
+               rib_delete(afi, SAFI_UNICAST, zvrf->vrf->vrf_id,
+                          ZEBRA_ROUTE_CONNECT, 0, 0, &p, NULL, &nh, 0,
+                          zvrf->table_id, 0, 0, false);
 
-       rib_delete(afi, SAFI_MULTICAST, zvrf->vrf->vrf_id, ZEBRA_ROUTE_CONNECT,
-                  0, 0, &p, NULL, &nh, 0, zvrf->table_id, 0, 0, false);
+               rib_delete(afi, SAFI_MULTICAST, zvrf->vrf->vrf_id,
+                          ZEBRA_ROUTE_CONNECT, 0, 0, &p, NULL, &nh, 0,
+                          zvrf->table_id, 0, 0, false);
+       }
 
        if (remove_local) {
                rib_delete(afi, SAFI_UNICAST, zvrf->vrf->vrf_id,
index c4a952e1a7489934b526ef94340e23523e91edf1..39d24f18838958fddb0d5364af787f2d4bc3e4b7 100644 (file)
@@ -1317,6 +1317,9 @@ static void zebra_if_addr_update_ctx(struct zebra_dplane_ctx *ctx,
        if (dplane_ctx_intf_is_secondary(ctx))
                SET_FLAG(flags, ZEBRA_IFA_SECONDARY);
 
+       if (dplane_ctx_intf_is_noprefixroute(ctx))
+               SET_FLAG(flags, ZEBRA_IFA_NOPREFIXROUTE);
+
        /* Label? */
        if (dplane_ctx_intf_has_label(ctx))
                label = dplane_ctx_get_intf_label(ctx);
@@ -2334,6 +2337,12 @@ static void connected_dump_vty(struct vty *vty, json_object *json,
        else if (CHECK_FLAG(connected->flags, ZEBRA_IFA_SECONDARY))
                vty_out(vty, " secondary");
 
+       if (json)
+               json_object_boolean_add(json_addr, "noPrefixRoute",
+                                       CHECK_FLAG(connected->flags, ZEBRA_IFA_NOPREFIXROUTE));
+       else if (CHECK_FLAG(connected->flags, ZEBRA_IFA_NOPREFIXROUTE))
+               vty_out(vty, " noprefixroute");
+
        if (json)
                json_object_boolean_add(
                        json_addr, "unnumbered",