]> git.proxmox.com Git - mirror_frr.git/blobdiff - pbrd/pbr_zebra.c
Merge pull request #5257 from ton31337/fix/update_rib_on_bgp_distance_changes
[mirror_frr.git] / pbrd / pbr_zebra.c
index 1396d83d65fae026c178b70f78018f3c04f9c24e..719374e3b9e0c20e86f6c43d5188174a8c9e0373 100644 (file)
@@ -59,16 +59,8 @@ struct pbr_interface *pbr_if_new(struct interface *ifp)
 }
 
 /* Inteface addition message from zebra. */
-static int interface_add(int command, struct zclient *zclient,
-                              zebra_size_t length, vrf_id_t vrf_id)
+int pbr_ifp_create(struct interface *ifp)
 {
-       struct interface *ifp;
-
-       ifp = zebra_interface_add_read(zclient->ibuf, vrf_id);
-
-       if (!ifp)
-               return 0;
-
        DEBUGD(&pbr_dbg_zebra,
               "%s: %s", __PRETTY_FUNCTION__, ifp->name);
 
@@ -80,35 +72,20 @@ static int interface_add(int command, struct zclient *zclient,
        return 0;
 }
 
-static int interface_delete(int command, struct zclient *zclient,
-                           zebra_size_t length, vrf_id_t vrf_id)
+int pbr_ifp_destroy(struct interface *ifp)
 {
-       struct interface *ifp;
-       struct stream *s;
-
-       s = zclient->ibuf;
-       /* zebra_interface_state_read () updates interface structure in iflist
-        */
-       ifp = zebra_interface_state_read(s, vrf_id);
-
-       if (ifp == NULL)
-               return 0;
-
        DEBUGD(&pbr_dbg_zebra,
               "%s: %s", __PRETTY_FUNCTION__, ifp->name);
 
-       if_set_index(ifp, IFINDEX_INTERNAL);
-
        return 0;
 }
 
-static int interface_address_add(int command, struct zclient *zclient,
-                                zebra_size_t length, vrf_id_t vrf_id)
+static int interface_address_add(ZAPI_CALLBACK_ARGS)
 {
        struct connected *c;
        char buf[PREFIX_STRLEN];
 
-       c = zebra_interface_address_read(command, zclient->ibuf, vrf_id);
+       c = zebra_interface_address_read(cmd, zclient->ibuf, vrf_id);
 
        DEBUGD(&pbr_dbg_zebra,
               "%s: %s added %s", __PRETTY_FUNCTION__,
@@ -118,13 +95,12 @@ static int interface_address_add(int command, struct zclient *zclient,
        return 0;
 }
 
-static int interface_address_delete(int command, struct zclient *zclient,
-                                   zebra_size_t length, vrf_id_t vrf_id)
+static int interface_address_delete(ZAPI_CALLBACK_ARGS)
 {
        struct connected *c;
        char buf[PREFIX_STRLEN];
 
-       c = zebra_interface_address_read(command, zclient->ibuf, vrf_id);
+       c = zebra_interface_address_read(cmd, zclient->ibuf, vrf_id);
 
        if (!c)
                return 0;
@@ -133,17 +109,12 @@ static int interface_address_delete(int command, struct zclient *zclient,
               "%s: %s deleted %s", __PRETTY_FUNCTION__, c->ifp->name,
               prefix2str(c->address, buf, sizeof(buf)));
 
-       connected_free(c);
+       connected_free(&c);
        return 0;
 }
 
-static int interface_state_up(int command, struct zclient *zclient,
-                             zebra_size_t length, vrf_id_t vrf_id)
+int pbr_ifp_up(struct interface *ifp)
 {
-       struct interface *ifp;
-
-       ifp = zebra_interface_state_read(zclient->ibuf, vrf_id);
-
        DEBUGD(&pbr_dbg_zebra,
               "%s: %s is up", __PRETTY_FUNCTION__, ifp->name);
 
@@ -152,13 +123,8 @@ static int interface_state_up(int command, struct zclient *zclient,
        return 0;
 }
 
-static int interface_state_down(int command, struct zclient *zclient,
-                               zebra_size_t length, vrf_id_t vrf_id)
+int pbr_ifp_down(struct interface *ifp)
 {
-       struct interface *ifp;
-
-       ifp = zebra_interface_state_read(zclient->ibuf, vrf_id);
-
        DEBUGD(&pbr_dbg_zebra,
               "%s: %s is down", __PRETTY_FUNCTION__, ifp->name);
 
@@ -167,8 +133,7 @@ static int interface_state_down(int command, struct zclient *zclient,
        return 0;
 }
 
-static int route_notify_owner(int command, struct zclient *zclient,
-                             zebra_size_t length, vrf_id_t vrf_id)
+static int route_notify_owner(ZAPI_CALLBACK_ARGS)
 {
        struct prefix p;
        enum zapi_route_notify_owner note;
@@ -213,8 +178,7 @@ static int route_notify_owner(int command, struct zclient *zclient,
        return 0;
 }
 
-static int rule_notify_owner(int command, struct zclient *zclient,
-                            zebra_size_t length, vrf_id_t vrf_id)
+static int rule_notify_owner(ZAPI_CALLBACK_ARGS)
 {
        uint32_t seqno, priority, unique;
        enum zapi_rule_notify_owner note;
@@ -357,6 +321,11 @@ void route_add(struct pbr_nexthop_group_cache *pnhgc, struct nexthop_group nhg,
                       "%s: Asked to install unsupported route type: L2VPN",
                       __PRETTY_FUNCTION__);
                break;
+       case AFI_UNSPEC:
+               DEBUGD(&pbr_dbg_zebra,
+                      "%s: Asked to install unspecified route type",
+                      __PRETTY_FUNCTION__);
+               break;
        }
 }
 
@@ -399,11 +368,15 @@ void route_delete(struct pbr_nexthop_group_cache *pnhgc, afi_t afi)
                       "%s: Asked to delete unsupported route type: L2VPN",
                       __PRETTY_FUNCTION__);
                break;
+       case AFI_UNSPEC:
+               DEBUGD(&pbr_dbg_zebra,
+                      "%s: Asked to delete unspecified route type",
+                      __PRETTY_FUNCTION__);
+               break;
        }
 }
 
-static int pbr_zebra_nexthop_update(int command, struct zclient *zclient,
-                                   zebra_size_t length, vrf_id_t vrf_id)
+static int pbr_zebra_nexthop_update(ZAPI_CALLBACK_ARGS)
 {
        struct zapi_route nhr;
        char buf[PREFIX2STR_BUFFER];
@@ -446,10 +419,6 @@ void pbr_zebra_init(void)
 
        zclient_init(zclient, ZEBRA_ROUTE_PBR, 0, &pbr_privs);
        zclient->zebra_connected = zebra_connected;
-       zclient->interface_add = interface_add;
-       zclient->interface_delete = interface_delete;
-       zclient->interface_up = interface_state_up;
-       zclient->interface_down = interface_state_down;
        zclient->interface_address_add = interface_address_add;
        zclient->interface_address_delete = interface_address_delete;
        zclient->route_notify_owner = route_notify_owner;
@@ -481,6 +450,12 @@ void pbr_send_rnh(struct nexthop *nhop, bool reg)
                p.family = AF_INET6;
                memcpy(&p.u.prefix6, &nhop->gate.ipv6, 16);
                p.prefixlen = 128;
+               if (IN6_IS_ADDR_LINKLOCAL(&nhop->gate.ipv6))
+                       /*
+                        * Don't bother tracking link locals, just track their
+                        * interface state.
+                        */
+                       return;
                break;
        }
 
@@ -525,7 +500,7 @@ static void pbr_encode_pbr_map_sequence(struct stream *s,
        stream_putw(s, 0);  /* src port */
        pbr_encode_pbr_map_sequence_prefix(s, pbrms->dst, family);
        stream_putw(s, 0);  /* dst port */
-       stream_putl(s, 0);  /* fwmark */
+       stream_putl(s, pbrms->mark);
        if (pbrms->nhgrp_name)
                stream_putl(s, pbr_nht_get_table(pbrms->nhgrp_name));
        else if (pbrms->nhg)