]> 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)
committerMergify <37929162+mergify[bot]@users.noreply.github.com>
Thu, 7 Dec 2023 13:25:37 +0000 (13:25 +0000)
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>
(cherry picked from commit 8a574840a4e29d2529fb03cdeeb6a09a11b0bdf5)

lib/if.h
zebra/connected.c
zebra/interface.c

index 7b4415da45d47ca76dca542bf5230a7e54689a3b..66d1f30d9353dcbfbd48ec13ec57ede62035156c 100644 (file)
--- a/lib/if.h
+++ b/lib/if.h
@@ -420,6 +420,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 ee0823f56f458ac8ebbf7427c2ace23878af5baa..2977aebfbcd76e86bcab07c2e53935a9626ef1fc 100644 (file)
@@ -276,13 +276,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);
-
-       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 (!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);
+       }
 
        /* Schedule LSP forwarding entries for processing, if appropriate. */
        if (zvrf->vrf->vrf_id == VRF_DEFAULT) {
@@ -457,11 +459,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);
-
-       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 (!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);
+       }
 
        /* Schedule LSP forwarding entries for processing, if appropriate. */
        if (zvrf->vrf->vrf_id == VRF_DEFAULT) {
index 1afd9d5a7d8a92240af88142d6bc90fc92884df6..9864b825ee886bd1ed4a7963de514aef87648e88 100644 (file)
@@ -1331,6 +1331,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);
@@ -2407,6 +2410,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",