]> git.proxmox.com Git - mirror_frr.git/commitdiff
Merge pull request #3081 from donaldsharp/table_table_table
authorRenato Westphal <renato@openbsd.org>
Tue, 25 Sep 2018 02:32:50 +0000 (23:32 -0300)
committerGitHub <noreply@github.com>
Tue, 25 Sep 2018 02:32:50 +0000 (23:32 -0300)
bgpd, lib, zebra: Wrapper get/set of table->info pointer

48 files changed:
bgpd/bgp_aspath.c
bgpd/bgp_nexthop.c
bgpd/bgp_nexthop.h
bgpd/bgp_nht.c
bgpd/bgp_open.c
bgpd/bgp_vty.c
doc/user/bgp.rst
eigrpd/eigrp_interface.c
eigrpd/eigrp_network.c
eigrpd/eigrp_structs.h
eigrpd/eigrp_topology.c
eigrpd/eigrp_topology.h
eigrpd/eigrpd.c
lib/libfrr.c
lib/pid_output.c
lib/routemap.c
ospfd/ospf_opaque.c
ospfd/ospf_ri.c
ospfd/ospf_te.c
pimd/pim_instance.c
pimd/pim_upstream.c
pimd/pim_zebra.c
pimd/pim_zlookup.c
zebra/debug.c
zebra/debug.h
zebra/if_netlink.c
zebra/interface.c
zebra/interface.h
zebra/kernel_netlink.c
zebra/kernel_netlink.h
zebra/rt.h
zebra/rt_netlink.c
zebra/rt_socket.c
zebra/rtadv.c
zebra/rule_netlink.c
zebra/rule_socket.c
zebra/subdir.am
zebra/zebra_dplane.c [new file with mode: 0644]
zebra/zebra_dplane.h [new file with mode: 0644]
zebra/zebra_fpm_netlink.c
zebra/zebra_mpls.c
zebra/zebra_mpls_netlink.c
zebra/zebra_mpls_null.c
zebra/zebra_mpls_openbsd.c
zebra/zebra_netns_id.c
zebra/zebra_pbr.c
zebra/zebra_pbr.h
zebra/zebra_rib.c

index 1f8a910f2f2ad345c86a29359c83b618e6d50411..0924223ddc9a2414e93970b6b2b318a62cf57090 100644 (file)
@@ -900,7 +900,7 @@ size_t aspath_put(struct stream *s, struct aspath *as, int use32bit)
                        while ((seg->length - written) > AS_SEGMENT_MAX) {
                                assegment_header_put(s, seg->type,
                                                     AS_SEGMENT_MAX);
-                               assegment_data_put(s, seg->as, AS_SEGMENT_MAX,
+                               assegment_data_put(s, (seg->as + written), AS_SEGMENT_MAX,
                                                   use32bit);
                                written += AS_SEGMENT_MAX;
                                bytes += ASSEGMENT_SIZE(AS_SEGMENT_MAX,
index 15f42e26dabbf8449aaef084a698fc8b41d03bae..64453987d543dc8cb446bd84e793fc17f9a3d47d 100644 (file)
@@ -171,20 +171,62 @@ void bgp_tip_del(struct bgp *bgp, struct in_addr *tip)
        }
 }
 
+/* BGP own address structure */
+struct bgp_addr {
+       struct in_addr addr;
+       struct list *ifp_name_list;
+};
+
+static void show_address_entry(struct hash_backet *backet, void *args)
+{
+       struct vty *vty = (struct vty *)args;
+       struct bgp_addr *addr = (struct bgp_addr *)backet->data;
+       char *name;
+       struct listnode *node;
+
+       vty_out(vty, "addr: %s, count: %d : ", inet_ntoa(addr->addr),
+               addr->ifp_name_list->count);
+
+       for (ALL_LIST_ELEMENTS_RO(addr->ifp_name_list, node, name)) {
+               vty_out(vty, " %s,", name);
+       }
+
+       vty_out(vty, "\n");
+}
+
+void bgp_nexthop_show_address_hash(struct vty *vty, struct bgp *bgp)
+{
+       hash_iterate(bgp->address_hash,
+                    (void (*)(struct hash_backet *, void *))show_address_entry,
+                    vty);
+}
+
+static void bgp_address_hash_string_del(void *val)
+{
+       char *data = val;
+
+       XFREE(MTYPE_TMP, data);
+}
+
 static void *bgp_address_hash_alloc(void *p)
 {
        const struct in_addr *val = (const struct in_addr *)p;
        struct bgp_addr *addr;
 
        addr = XMALLOC(MTYPE_BGP_ADDR, sizeof(struct bgp_addr));
-       addr->refcnt = 0;
        addr->addr.s_addr = val->s_addr;
 
+       addr->ifp_name_list = list_new();
+       addr->ifp_name_list->del = bgp_address_hash_string_del;
+
        return addr;
 }
 
-static void bgp_address_hash_free(void *addr)
+static void bgp_address_hash_free(void *data)
 {
+       struct bgp_addr *addr = data;
+
+       list_delete_and_null(&addr->ifp_name_list);
        XFREE(MTYPE_BGP_ADDR, addr);
 }
 
@@ -219,24 +261,35 @@ void bgp_address_destroy(struct bgp *bgp)
        bgp->address_hash = NULL;
 }
 
-static void bgp_address_add(struct bgp *bgp, struct prefix *p)
+static void bgp_address_add(struct bgp *bgp, struct connected *ifc,
+                           struct prefix *p)
 {
        struct bgp_addr tmp;
        struct bgp_addr *addr;
+       struct listnode *node;
+       char *name;
 
        tmp.addr = p->u.prefix4;
 
        addr = hash_get(bgp->address_hash, &tmp, bgp_address_hash_alloc);
-       if (!addr)
-               return;
 
-       addr->refcnt++;
+       for (ALL_LIST_ELEMENTS_RO(addr->ifp_name_list, node, name)) {
+               if (strcmp(ifc->ifp->name, name) == 0)
+                       break;
+       }
+       if (!node) {
+               name = XSTRDUP(MTYPE_TMP, ifc->ifp->name);
+               listnode_add(addr->ifp_name_list, name);
+       }
 }
 
-static void bgp_address_del(struct bgp *bgp, struct prefix *p)
+static void bgp_address_del(struct bgp *bgp, struct connected *ifc,
+                           struct prefix *p)
 {
        struct bgp_addr tmp;
        struct bgp_addr *addr;
+       struct listnode *node;
+       char *name;
 
        tmp.addr = p->u.prefix4;
 
@@ -245,10 +298,17 @@ static void bgp_address_del(struct bgp *bgp, struct prefix *p)
        if (addr == NULL)
                return;
 
-       addr->refcnt--;
+       for (ALL_LIST_ELEMENTS_RO(addr->ifp_name_list, node, name)) {
+               if (strcmp(ifc->ifp->name, name) == 0)
+                       break;
+       }
 
-       if (addr->refcnt == 0) {
+       if (node)
+               list_delete_node(addr->ifp_name_list, node);
+
+       if (addr->ifp_name_list->count == 0) {
                hash_release(bgp->address_hash, addr);
+               list_delete_and_null(&addr->ifp_name_list);
                XFREE(MTYPE_BGP_ADDR, addr);
        }
 }
@@ -276,7 +336,7 @@ void bgp_connected_add(struct bgp *bgp, struct connected *ifc)
                if (prefix_ipv4_any((struct prefix_ipv4 *)&p))
                        return;
 
-               bgp_address_add(bgp, addr);
+               bgp_address_add(bgp, ifc, addr);
 
                rn = bgp_node_get(bgp->connected_table[AFI_IP],
                                  (struct prefix *)&p);
@@ -340,7 +400,7 @@ void bgp_connected_delete(struct bgp *bgp, struct connected *ifc)
                if (prefix_ipv4_any((struct prefix_ipv4 *)&p))
                        return;
 
-               bgp_address_del(bgp, addr);
+               bgp_address_del(bgp, ifc, addr);
 
                rn = bgp_node_lookup(bgp->connected_table[AFI_IP], &p);
        } else if (addr->family == AF_INET6) {
index a771bead230126778244e81c52a87f993420c5a7..1cb05bc853efab0df569928f9bd561601e8ac8e8 100644 (file)
@@ -68,12 +68,6 @@ struct bgp_nexthop_cache {
        struct bgp *bgp;
 };
 
-/* BGP own address structure */
-struct bgp_addr {
-       struct in_addr addr;
-       int refcnt;
-};
-
 /* Own tunnel-ip address structure */
 struct tip_addr {
        struct in_addr addr;
@@ -103,4 +97,5 @@ extern void bgp_tip_del(struct bgp *bgp, struct in_addr *tip);
 extern void bgp_tip_hash_init(struct bgp *bgp);
 extern void bgp_tip_hash_destroy(struct bgp *bgp);
 
+extern void bgp_nexthop_show_address_hash(struct vty *vty, struct bgp *bgp);
 #endif /* _QUAGGA_BGP_NEXTHOP_H */
index 7eba0eda44d94ca172804db20382a68ac7d9b057..dd1ffe9f3bd4540132c3d42d1ee24b742e9adcf4 100644 (file)
@@ -415,6 +415,8 @@ void bgp_parse_nexthop_update(int command, vrf_id_t vrf_id)
                bnc->change_flags |= BGP_NEXTHOP_CHANGED;
 
        if (nhr.nexthop_num) {
+               struct peer *peer = bnc->nht_info;
+
                /* notify bgp fsm if nbr ip goes from invalid->valid */
                if (!bnc->nexthop_num)
                        UNSET_FLAG(bnc->flags, BGP_NEXTHOP_PEER_NOTIFIED);
@@ -430,6 +432,22 @@ void bgp_parse_nexthop_update(int command, vrf_id_t vrf_id)
 
                        nexthop = nexthop_from_zapi_nexthop(&nhr.nexthops[i]);
 
+                       /*
+                        * Turn on RA for the v6 nexthops
+                        * we receive from bgp.  This is to allow us
+                        * to work with v4 routing over v6 nexthops
+                        */
+                       if (peer &&
+                           CHECK_FLAG(peer->flags, PEER_FLAG_CAPABILITY_ENHE)
+                           && nhr.prefix.family == AF_INET6) {
+                               struct interface *ifp;
+
+                               ifp = if_lookup_by_index(nexthop->ifindex,
+                                                        nexthop->vrf_id);
+                               zclient_send_interface_radv_req(
+                                       zclient, nexthop->vrf_id, ifp, true,
+                                       BGP_UNNUM_DEFAULT_RA_INTERVAL);
+                       }
                        /* There is at least one label-switched path */
                        if (nexthop->nh_label &&
                                nexthop->nh_label->num_labels) {
index 62b412af0ca58077bf39d01bf6319e32c0993e8b..cf5901df5a4a619b4abaadd006ca28ceebe45d67 100644 (file)
@@ -1331,7 +1331,6 @@ void bgp_open_capability(struct stream *s, struct peer *peer)
                         */
                        if (CHECK_FLAG(peer->flags, PEER_FLAG_CAPABILITY_ENHE)
                            && peer->su.sa.sa_family == AF_INET6
-                           && IN6_IS_ADDR_LINKLOCAL(&peer->su.sin6.sin6_addr)
                            && afi == AFI_IP
                            && (safi == SAFI_UNICAST
                                || safi == SAFI_LABELED_UNICAST)) {
index e6d44c1a2c500b6fed62ba77c6f43c67b702030a..58f23fd2f4338d16f1c12f07def034bfa32464d9 100644 (file)
@@ -7451,14 +7451,6 @@ DEFUN (show_bgp_vrfs,
        return CMD_SUCCESS;
 }
 
-static void show_address_entry(struct hash_backet *backet, void *args)
-{
-       struct vty *vty = (struct vty *)args;
-       struct bgp_addr *addr = (struct bgp_addr *)backet->data;
-
-       vty_out(vty, "addr: %s, count: %d\n", inet_ntoa(addr->addr),
-               addr->refcnt);
-}
 
 static void show_tip_entry(struct hash_backet *backet, void *args)
 {
@@ -7472,9 +7464,7 @@ static void show_tip_entry(struct hash_backet *backet, void *args)
 static void bgp_show_martian_nexthops(struct vty *vty, struct bgp *bgp)
 {
        vty_out(vty, "self nexthop database:\n");
-       hash_iterate(bgp->address_hash,
-                    (void (*)(struct hash_backet *, void *))show_address_entry,
-                    vty);
+       bgp_nexthop_show_address_hash(vty, bgp);
 
        vty_out(vty, "Tunnel-ip database:\n");
        hash_iterate(bgp->tip_hash,
index 14f2c8dc9ad26876e32f6b251773138a0f8e053f..d9d496f7fc0092fde4f6b1580ea7a38a2b708bef 100644 (file)
@@ -845,6 +845,15 @@ Configuring Peers
    specified number of hops away will be allowed to become neighbors. This
    command is mutually exclusive with *ebgp-multihop*.
 
+.. index:: [no] neighbor PEER capability extended-nexthop
+.. clicmd:: [no] neighbor PEER capability extended-nexthop
+
+   Allow bgp to negotiate the extended-nexthop capability with it's peer.
+   If you are peering over a v6 LL address then this capability is turned
+   on automatically.  If you are peering over a v6 Global Address then
+   turning on this command will allow BGP to install v4 routes with
+   v6 nexthops if you do not have v4 configured on interfaces.
+
 .. index:: [no] bgp fast-external-failover
 .. clicmd:: [no] bgp fast-external-failover
 
index cd62811fdfdadf34da3698590019f8974155b998..913db684c1c3cc15e3ae2394293918a2fba4adeb 100644 (file)
@@ -183,9 +183,7 @@ int eigrp_if_up(struct eigrp_interface *ei)
 
        struct prefix dest_addr;
 
-       dest_addr.family = AF_INET;
-       dest_addr.u.prefix4 = ei->connected->address->u.prefix4;
-       dest_addr.prefixlen = ei->connected->address->prefixlen;
+       dest_addr = *ei->address;
        apply_mask(&dest_addr);
        pe = eigrp_topology_table_lookup_ipv4(eigrp->topology_table,
                                              &dest_addr);
@@ -344,7 +342,7 @@ void eigrp_if_free(struct eigrp_interface *ei, int source)
                eigrp_hello_send(ei, EIGRP_HELLO_GRACEFUL_SHUTDOWN, NULL);
        }
 
-       dest_addr = *ei->connected->address;
+       dest_addr = *ei->address;
        apply_mask(&dest_addr);
        pe = eigrp_topology_table_lookup_ipv4(eigrp->topology_table,
                                              &dest_addr);
index 8eaf1e82a31ed55d7f87971d30c1358734c4da38..35b45288b80f2bedebcbd90cbc03e641dc2a56ee 100644 (file)
@@ -48,8 +48,8 @@
 #include "eigrpd/eigrp_vty.h"
 #include "eigrpd/eigrp_network.h"
 
-static int eigrp_network_match_iface(const struct connected *,
-                                    const struct prefix *);
+static int eigrp_network_match_iface(const struct prefix *connected_prefix,
+                                    const struct prefix *prefix);
 static void eigrp_network_run_interface(struct eigrp *, struct prefix *,
                                        struct interface *);
 
@@ -241,11 +241,11 @@ int eigrp_network_set(struct eigrp *eigrp, struct prefix *p)
 /* Check whether interface matches given network
  * returns: 1, true. 0, false
  */
-static int eigrp_network_match_iface(const struct connected *co,
+static int eigrp_network_match_iface(const struct prefix *co_prefix,
                                     const struct prefix *net)
 {
        /* new approach: more elegant and conceptually clean */
-       return prefix_match_network_statement(net, CONNECTED_PREFIX(co));
+       return prefix_match_network_statement(net, co_prefix);
 }
 
 static void eigrp_network_run_interface(struct eigrp *eigrp, struct prefix *p,
@@ -263,10 +263,9 @@ static void eigrp_network_run_interface(struct eigrp *eigrp, struct prefix *p,
                        continue;
 
                if (p->family == co->address->family && !ifp->info
-                   && eigrp_network_match_iface(co, p)) {
+                   && eigrp_network_match_iface(co->address, p)) {
 
                        ei = eigrp_if_new(eigrp, ifp, co->address);
-                       ei->connected = co;
 
                        /* Relate eigrp interface to eigrp instance. */
                        ei->eigrp = eigrp;
@@ -328,21 +327,20 @@ int eigrp_network_unset(struct eigrp *eigrp, struct prefix *p)
 
        /* Find interfaces that not configured already.  */
        for (ALL_LIST_ELEMENTS(eigrp->eiflist, node, nnode, ei)) {
-               int found = 0;
-               struct connected *co = ei->connected;
+               bool found = false;
 
                for (rn = route_top(eigrp->networks); rn; rn = route_next(rn)) {
                        if (rn->info == NULL)
                                continue;
 
-                       if (eigrp_network_match_iface(co, &rn->p)) {
-                               found = 1;
+                       if (eigrp_network_match_iface(ei->address, &rn->p)) {
+                               found = true;
                                route_unlock_node(rn);
                                break;
                        }
                }
 
-               if (found == 0) {
+               if (!found) {
                        eigrp_if_free(ei, INTERFACE_DOWN_BY_VTY);
                }
        }
index 95bcfe50e72e0f13089835f200d6989f02be8d61..ce03a21fbaeb7a4e796c731cabf9b75df6641138 100644 (file)
@@ -178,7 +178,6 @@ struct eigrp_interface {
        uint8_t type;
 
        struct prefix *address;      /* Interface prefix */
-       struct connected *connected; /* Pointer to connected */
 
        /* Neighbor information. */
        struct list *nbrs; /* EIGRP Neighbor List */
index 80814d6d367da49488a6422c20f7ae94a9dca812..3520972731b646911dca7f040912685582e3176e 100644 (file)
@@ -118,16 +118,9 @@ struct eigrp_nexthop_entry *eigrp_nexthop_entry_new()
  * Freeing topology table list
  */
 void eigrp_topology_free(struct route_table *table)
-{
-       route_table_finish(table);
-}
-
-/*
- * Deleting all topology nodes in table
- */
-void eigrp_topology_cleanup(struct route_table *table)
 {
        eigrp_topology_delete_all(table);
+       route_table_finish(table);
 }
 
 /*
@@ -181,6 +174,8 @@ void eigrp_prefix_entry_delete(struct route_table *table,
                               struct eigrp_prefix_entry *pe)
 {
        struct eigrp *eigrp = eigrp_lookup();
+       struct eigrp_nexthop_entry *ne;
+       struct listnode *node, *nnode;
        struct route_node *rn;
 
        if (!eigrp)
@@ -196,9 +191,12 @@ void eigrp_prefix_entry_delete(struct route_table *table,
         */
        listnode_delete(eigrp->topology_changes_internalIPV4, pe);
 
+       for (ALL_LIST_ELEMENTS(pe->entries, node, nnode, ne))
+               eigrp_nexthop_entry_delete(pe, ne);
        list_delete_and_null(&pe->entries);
        list_delete_and_null(&pe->rij);
        eigrp_zebra_route_delete(pe->destination);
+       prefix_free(pe->destination);
 
        rn->info = NULL;
        route_unlock_node(rn); // Lookup above
@@ -237,18 +235,6 @@ void eigrp_topology_delete_all(struct route_table *topology)
        }
 }
 
-/*
- * Return 0 if topology is not empty
- * otherwise return 1
- */
-unsigned int eigrp_topology_table_isempty(struct list *topology)
-{
-       if (topology->count)
-               return 1;
-       else
-               return 0;
-}
-
 struct eigrp_prefix_entry *
 eigrp_topology_table_lookup_ipv4(struct route_table *table,
                                 struct prefix *address)
index af39f7f1aa03d678fe5710f0f1f1dbcd7e694435..16bf2261ccb9484e576b6ff5ae51de56f80f1086 100644 (file)
@@ -38,7 +38,6 @@ extern void eigrp_topology_init(struct route_table *table);
 extern struct eigrp_prefix_entry *eigrp_prefix_entry_new(void);
 extern struct eigrp_nexthop_entry *eigrp_nexthop_entry_new(void);
 extern void eigrp_topology_free(struct route_table *table);
-extern void eigrp_topology_cleanup(struct route_table *table);
 extern void eigrp_prefix_entry_add(struct route_table *table,
                                   struct eigrp_prefix_entry *pe);
 extern void eigrp_nexthop_entry_add(struct eigrp_prefix_entry *,
@@ -48,7 +47,6 @@ extern void eigrp_prefix_entry_delete(struct route_table *table,
 extern void eigrp_nexthop_entry_delete(struct eigrp_prefix_entry *,
                                       struct eigrp_nexthop_entry *);
 extern void eigrp_topology_delete_all(struct route_table *table);
-extern unsigned int eigrp_topology_table_isempty(struct list *);
 extern struct eigrp_prefix_entry *
 eigrp_topology_table_lookup_ipv4(struct route_table *table, struct prefix *p);
 extern struct list *eigrp_topology_get_successor(struct eigrp_prefix_entry *);
index b30f14f748f15c2fcc6b9fb2167169d7e65c9d7f..e9f81fc1c566c277de7b4e4e0c0cd83aab8beeef 100644 (file)
@@ -62,9 +62,7 @@ static struct eigrp_master eigrp_master;
 
 struct eigrp_master *eigrp_om;
 
-static void eigrp_delete(struct eigrp *);
 static struct eigrp *eigrp_new(const char *);
-static void eigrp_add(struct eigrp *);
 
 extern struct zclient *zclient;
 extern struct in_addr router_id_zebra;
@@ -203,16 +201,6 @@ static struct eigrp *eigrp_new(const char *AS)
        return eigrp;
 }
 
-static void eigrp_add(struct eigrp *eigrp)
-{
-       listnode_add(eigrp_om->eigrp, eigrp);
-}
-
-static void eigrp_delete(struct eigrp *eigrp)
-{
-       listnode_delete(eigrp_om->eigrp, eigrp);
-}
-
 struct eigrp *eigrp_get(const char *AS)
 {
        struct eigrp *eigrp;
@@ -220,7 +208,7 @@ struct eigrp *eigrp_get(const char *AS)
        eigrp = eigrp_lookup();
        if (eigrp == NULL) {
                eigrp = eigrp_new(AS);
-               eigrp_add(eigrp);
+               listnode_add(eigrp_om->eigrp, eigrp);
        }
 
        return eigrp;
@@ -281,7 +269,6 @@ void eigrp_finish_final(struct eigrp *eigrp)
        list_delete_and_null(&eigrp->eiflist);
        list_delete_and_null(&eigrp->oi_write_q);
 
-       eigrp_topology_cleanup(eigrp->topology_table);
        eigrp_topology_free(eigrp->topology_table);
 
        eigrp_nbr_delete(eigrp->neighbor_self);
@@ -289,8 +276,9 @@ void eigrp_finish_final(struct eigrp *eigrp)
        list_delete_and_null(&eigrp->topology_changes_externalIPV4);
        list_delete_and_null(&eigrp->topology_changes_internalIPV4);
 
-       eigrp_delete(eigrp);
+       listnode_delete(eigrp_om->eigrp, eigrp);
 
+       stream_free(eigrp->ibuf);
        XFREE(MTYPE_EIGRP_TOP, eigrp);
 }
 
index 69e6882617d60118a345feb8c4e89526a3d47d0c..2bce4766d3d44af059c2b5068a65b18fdeb611ab 100644 (file)
@@ -262,34 +262,6 @@ bool frr_zclient_addr(struct sockaddr_storage *sa, socklen_t *sa_len,
 
 static struct frr_daemon_info *di = NULL;
 
-static void frr_guard_daemon(void)
-{
-       int fd;
-       struct flock lock;
-       const char *path = di->pid_file;
-
-       fd = open(path, O_RDWR);
-       if (fd != -1) {
-               memset(&lock, 0, sizeof(lock));
-               lock.l_type = F_WRLCK;
-               lock.l_whence = SEEK_SET;
-               if (fcntl(fd, F_GETLK, &lock) < 0) {
-                       flog_err_sys(
-                               EC_LIB_SYSTEM_CALL,
-                               "Could not do F_GETLK pid_file %s (%s), exiting",
-                               path, safe_strerror(errno));
-                       exit(1);
-               } else if (lock.l_type == F_WRLCK) {
-                       flog_err_sys(
-                               EC_LIB_SYSTEM_CALL,
-                               "Process %d has a write lock on file %s already! Error: (%s)",
-                               lock.l_pid, path, safe_strerror(errno));
-                       exit(1);
-               }
-               close(fd);
-       }
-}
-
 void frr_preinit(struct frr_daemon_info *daemon, int argc, char **argv)
 {
        di = daemon;
@@ -619,9 +591,6 @@ struct thread_master *frr_init(void)
 
        zprivs_init(di->privs);
 
-       /* Guard to prevent a second instance of this daemon */
-       frr_guard_daemon();
-
        master = thread_master_create(NULL);
        signal_init(master, di->n_signals, di->signals);
 
index b0643c4fe289c463207879c497714cb12ff477ef..f5f7b1d17172bc822ac8ed5339c69526d9db28dd 100644 (file)
@@ -60,7 +60,7 @@ pid_t pid_output(const char *path)
 
                if (fcntl(fd, F_SETLK, &lock) < 0) {
                        flog_err_sys(EC_LIB_SYSTEM_CALL,
-                                    "Could not lock pid_file %s (%s), exiting",
+                                    "Could not lock pid_file %s (%s), exiting.  Please ensure that the daemon is not already running",
                                     path, safe_strerror(errno));
                        exit(1);
                }
index 66c15b9f2bd456ad8de135d466714a1594af3606..bec6d389e534298d66db39fe83940f9e1af40e43 100644 (file)
@@ -1759,8 +1759,19 @@ void route_map_upd8_dependency(route_map_event_t type, const char *arg,
 {
        struct hash *upd8_hash = NULL;
 
-       if ((upd8_hash = route_map_get_dep_hash(type)))
+       if ((upd8_hash = route_map_get_dep_hash(type))) {
                route_map_dep_update(upd8_hash, arg, rmap_name, type);
+
+               if (type == RMAP_EVENT_CALL_ADDED) {
+                       /* Execute hook. */
+                       if (route_map_master.add_hook)
+                               (*route_map_master.add_hook)(rmap_name);
+               } else if (type == RMAP_EVENT_CALL_DELETED) {
+                       /* Execute hook. */
+                       if (route_map_master.delete_hook)
+                               (*route_map_master.delete_hook)(rmap_name);
+               }
+       }
 }
 
 void route_map_notify_dependencies(const char *affected_name,
index bbc559ca371d821885b199565bcd499a4c0aea28..e3c830d71b16d64a9f26ed5e81c373a8aeea6ae4 100644 (file)
@@ -438,10 +438,6 @@ void ospf_delete_opaque_functab(uint8_t lsa_type, uint8_t opaque_type)
                                /* Dequeue listnode entry from the list. */
                                listnode_delete(funclist, functab);
 
-                               /* Avoid misjudgement in the next lookup. */
-                               if (listcount(funclist) == 0)
-                                       funclist->head = funclist->tail = NULL;
-
                                XFREE(MTYPE_OSPF_OPAQUE_FUNCTAB, functab);
                                break;
                        }
@@ -2122,10 +2118,6 @@ void ospf_opaque_lsa_flush_schedule(struct ospf_lsa *lsa0)
        /* Dequeue listnode entry from the list. */
        listnode_delete(oipt->id_list, oipi);
 
-       /* Avoid misjudgement in the next lookup. */
-       if (listcount(oipt->id_list) == 0)
-               oipt->id_list->head = oipt->id_list->tail = NULL;
-
        /* Disassociate internal control information with the given lsa. */
        free_opaque_info_per_id((void *)oipi);
 
index e95fc43aabe3916ccfe2c89d4377023ad1f07bcf..22262c804f91b35b6b8b0744b82160dcdee2c71c 100644 (file)
@@ -380,10 +380,6 @@ static void unset_pce_domain(uint16_t type, uint32_t domain,
        if (found) {
                listnode_delete(pce->pce_domain, old);
 
-               /* Avoid misjudgement in the next lookup. */
-               if (listcount(pce->pce_domain) == 0)
-                       pce->pce_domain->head = pce->pce_domain->tail = NULL;
-
                /* Finally free the old domain */
                XFREE(MTYPE_OSPF_PCE_PARAMS, old);
        }
@@ -430,11 +426,6 @@ static void unset_pce_neighbor(uint16_t type, uint32_t domain,
        if (found) {
                listnode_delete(pce->pce_neighbor, old);
 
-               /* Avoid misjudgement in the next lookup. */
-               if (listcount(pce->pce_neighbor) == 0)
-                       pce->pce_neighbor->head = pce->pce_neighbor->tail =
-                               NULL;
-
                /* Finally free the old domain */
                XFREE(MTYPE_OSPF_PCE_PARAMS, old);
        }
index f45682c770b05821231dc29998a0d6f782485527..12122e76467c512cfdda5da92f9815c367cc9407 100644 (file)
@@ -897,10 +897,6 @@ static int ospf_mpls_te_del_if(struct interface *ifp)
                /* Dequeue listnode entry from the list. */
                listnode_delete(iflist, lp);
 
-               /* Avoid misjudgement in the next lookup. */
-               if (listcount(iflist) == 0)
-                       iflist->head = iflist->tail = NULL;
-
                XFREE(MTYPE_OSPF_MPLS_TE, lp);
        }
 
index bf8d05d1e117671e1cb946a9bcd53bf193089d40..c592a2c047fbc7e910ed716919c7ae3f1b79494f 100644 (file)
@@ -44,10 +44,10 @@ static void pim_instance_terminate(struct pim_instance *pim)
        if (pim->static_routes)
                list_delete_and_null(&pim->static_routes);
 
-       pim_rp_free(pim);
-
        pim_upstream_terminate(pim);
 
+       pim_rp_free(pim);
+
        /* Traverse and cleanup rpf_hash */
        if (pim->rpf_hash) {
                hash_clean(pim->rpf_hash, (void *)pim_rp_list_hash_clean);
index cc255a51e26840e491d3b99dcb5963276ee8a506..4adfde677582f3ed3aaf5b389514c4f74b6604ed 100644 (file)
@@ -19,8 +19,6 @@
 
 #include <zebra.h>
 
-#include "zebra/rib.h"
-
 #include "log.h"
 #include "zclient.h"
 #include "memory.h"
@@ -1536,12 +1534,13 @@ unsigned int pim_upstream_hash_key(void *arg)
 
 void pim_upstream_terminate(struct pim_instance *pim)
 {
-       struct listnode *node, *nnode;
        struct pim_upstream *up;
 
        if (pim->upstream_list) {
-               for (ALL_LIST_ELEMENTS(pim->upstream_list, node, nnode, up))
+               while (pim->upstream_list->count) {
+                       up = listnode_head(pim->upstream_list);
                        pim_upstream_del(pim, up, __PRETTY_FUNCTION__);
+               }
 
                list_delete_and_null(&pim->upstream_list);
        }
index 4ff9bd6bdc65863519ecf89c723fa9f479aca068..23001031e350ece1b3db07b94a91c0caf6f9e8b7 100644 (file)
@@ -19,8 +19,6 @@
 
 #include <zebra.h>
 
-#include "zebra/rib.h"
-
 #include "if.h"
 #include "log.h"
 #include "prefix.h"
index 48a228c744fdad502f8d00f713916b463a4c9d40..6e703521043b823bd1d6c1eb5e143d024f04a8c8 100644 (file)
@@ -18,7 +18,6 @@
  */
 
 #include <zebra.h>
-#include "zebra/rib.h"
 
 #include "log.h"
 #include "prefix.h"
index 85be620bff0992c38bccbdd918b283fc8ce19485..19582bb0904afc11a84aaa9c157854152636b2a5 100644 (file)
@@ -33,6 +33,7 @@ unsigned long zebra_debug_nht;
 unsigned long zebra_debug_mpls;
 unsigned long zebra_debug_vxlan;
 unsigned long zebra_debug_pw;
+unsigned long zebra_debug_dplane;
 
 DEFINE_HOOK(zebra_debug_show_debugging, (struct vty *vty), (vty));
 
@@ -89,6 +90,10 @@ DEFUN_NOSH (show_debugging_zebra,
                vty_out(vty, "  Zebra VXLAN debugging is on\n");
        if (IS_ZEBRA_DEBUG_PW)
                vty_out(vty, "  Zebra pseudowire debugging is on\n");
+       if (IS_ZEBRA_DEBUG_DPLANE_DETAIL)
+               vty_out(vty, "  Zebra detailed dataplane debugging is on\n");
+       else if (IS_ZEBRA_DEBUG_DPLANE)
+               vty_out(vty, "  Zebra dataplane debugging is on\n");
 
        hook_call(zebra_debug_show_debugging, vty);
        return CMD_SUCCESS;
@@ -261,6 +266,23 @@ DEFUN (debug_zebra_fpm,
        return CMD_SUCCESS;
 }
 
+DEFUN (debug_zebra_dplane,
+       debug_zebra_dplane_cmd,
+       "debug zebra dplane [detailed]",
+       DEBUG_STR
+       "Zebra configuration\n"
+       "Debug zebra dataplane events\n"
+       "Detailed debug information\n")
+{
+       int idx = 0;
+       SET_FLAG(zebra_debug_dplane, ZEBRA_DEBUG_DPLANE);
+
+       if (argv_find(argv, argc, "detailed", &idx))
+               SET_FLAG(zebra_debug_dplane, ZEBRA_DEBUG_DPLANE_DETAILED);
+
+       return CMD_SUCCESS;
+}
+
 DEFUN (no_debug_zebra_events,
        no_debug_zebra_events_cmd,
        "no debug zebra events",
@@ -376,6 +398,18 @@ DEFUN (no_debug_zebra_fpm,
        return CMD_SUCCESS;
 }
 
+DEFUN (no_debug_zebra_dplane,
+       no_debug_zebra_dplane_cmd,
+       "no debug zebra dplane",
+       NO_STR
+       DEBUG_STR
+       "Zebra configuration\n"
+       "Debug zebra dataplane events\n")
+{
+       zebra_debug_dplane = 0;
+       return CMD_SUCCESS;
+}
+
 /* Debug node. */
 struct cmd_node debug_node = {DEBUG_NODE, "", /* Debug node has no interface. */
                              1};
@@ -449,6 +483,15 @@ static int config_write_debug(struct vty *vty)
                vty_out(vty, "debug zebra pseudowires\n");
                write++;
        }
+
+       if (CHECK_FLAG(zebra_debug_dplane, ZEBRA_DEBUG_DPLANE_DETAILED)) {
+               vty_out(vty, "debug zebra dplane detailed\n");
+               write++;
+       } else if (CHECK_FLAG(zebra_debug_dplane, ZEBRA_DEBUG_DPLANE)) {
+               vty_out(vty, "debug zebra dplane\n");
+               write++;
+       }
+
        return write;
 }
 
@@ -462,6 +505,7 @@ void zebra_debug_init(void)
        zebra_debug_mpls = 0;
        zebra_debug_vxlan = 0;
        zebra_debug_pw = 0;
+       zebra_debug_dplane = 0;
 
        install_node(&debug_node, config_write_debug);
 
@@ -477,6 +521,7 @@ void zebra_debug_init(void)
        install_element(ENABLE_NODE, &debug_zebra_kernel_msgdump_cmd);
        install_element(ENABLE_NODE, &debug_zebra_rib_cmd);
        install_element(ENABLE_NODE, &debug_zebra_fpm_cmd);
+       install_element(ENABLE_NODE, &debug_zebra_dplane_cmd);
        install_element(ENABLE_NODE, &no_debug_zebra_events_cmd);
        install_element(ENABLE_NODE, &no_debug_zebra_nht_cmd);
        install_element(ENABLE_NODE, &no_debug_zebra_mpls_cmd);
@@ -486,6 +531,7 @@ void zebra_debug_init(void)
        install_element(ENABLE_NODE, &no_debug_zebra_kernel_msgdump_cmd);
        install_element(ENABLE_NODE, &no_debug_zebra_rib_cmd);
        install_element(ENABLE_NODE, &no_debug_zebra_fpm_cmd);
+       install_element(ENABLE_NODE, &no_debug_zebra_dplane_cmd);
 
        install_element(CONFIG_NODE, &debug_zebra_events_cmd);
        install_element(CONFIG_NODE, &debug_zebra_nht_cmd);
@@ -497,6 +543,7 @@ void zebra_debug_init(void)
        install_element(CONFIG_NODE, &debug_zebra_kernel_msgdump_cmd);
        install_element(CONFIG_NODE, &debug_zebra_rib_cmd);
        install_element(CONFIG_NODE, &debug_zebra_fpm_cmd);
+       install_element(CONFIG_NODE, &debug_zebra_dplane_cmd);
        install_element(CONFIG_NODE, &no_debug_zebra_events_cmd);
        install_element(CONFIG_NODE, &no_debug_zebra_nht_cmd);
        install_element(CONFIG_NODE, &no_debug_zebra_mpls_cmd);
@@ -506,4 +553,5 @@ void zebra_debug_init(void)
        install_element(CONFIG_NODE, &no_debug_zebra_kernel_msgdump_cmd);
        install_element(CONFIG_NODE, &no_debug_zebra_rib_cmd);
        install_element(CONFIG_NODE, &no_debug_zebra_fpm_cmd);
+       install_element(CONFIG_NODE, &no_debug_zebra_dplane_cmd);
 }
index e74afe476bc6f1e9a7e05822c80c426dea2082a7..cd15441ec8a446142d9cef5957d9458db0ad7430 100644 (file)
@@ -48,6 +48,9 @@
 
 #define ZEBRA_DEBUG_PW      0x01
 
+#define ZEBRA_DEBUG_DPLANE           0x01
+#define ZEBRA_DEBUG_DPLANE_DETAILED  0x02
+
 /* Debug related macro. */
 #define IS_ZEBRA_DEBUG_EVENT  (zebra_debug_event & ZEBRA_DEBUG_EVENT)
 
 #define IS_ZEBRA_DEBUG_VXLAN (zebra_debug_vxlan & ZEBRA_DEBUG_VXLAN)
 #define IS_ZEBRA_DEBUG_PW  (zebra_debug_pw & ZEBRA_DEBUG_PW)
 
+#define IS_ZEBRA_DEBUG_DPLANE (zebra_debug_dplane & ZEBRA_DEBUG_DPLANE)
+#define IS_ZEBRA_DEBUG_DPLANE_DETAIL \
+       (zebra_debug_dplane & ZEBRA_DEBUG_DPLANE_DETAILED)
+
 extern unsigned long zebra_debug_event;
 extern unsigned long zebra_debug_packet;
 extern unsigned long zebra_debug_kernel;
@@ -81,6 +88,7 @@ extern unsigned long zebra_debug_nht;
 extern unsigned long zebra_debug_mpls;
 extern unsigned long zebra_debug_vxlan;
 extern unsigned long zebra_debug_pw;
+extern unsigned long zebra_debug_dplane;
 
 extern void zebra_debug_init(void);
 
index bf5d834278220171f9e60c1a6c9f681219a09157..e7ddf68c19500debbe791057a24ca7f2509a80f0 100644 (file)
@@ -705,8 +705,8 @@ static int netlink_interface(struct nlmsghdr *h, ns_id_t ns_id, int startup)
 }
 
 /* Request for specific interface or address information from the kernel */
-static int netlink_request_intf_addr(struct zebra_ns *zns, int family, int type,
-                                    uint32_t filter_mask)
+static int netlink_request_intf_addr(struct nlsock *netlink_cmd, int family,
+                                    int type, uint32_t filter_mask)
 {
        struct {
                struct nlmsghdr n;
@@ -724,39 +724,44 @@ static int netlink_request_intf_addr(struct zebra_ns *zns, int family, int type,
        if (filter_mask)
                addattr32(&req.n, sizeof(req), IFLA_EXT_MASK, filter_mask);
 
-       return netlink_request(&zns->netlink_cmd, &req.n);
+       return netlink_request(netlink_cmd, &req.n);
 }
 
 /* Interface lookup by netlink socket. */
 int interface_lookup_netlink(struct zebra_ns *zns)
 {
        int ret;
+       struct zebra_dplane_info dp_info;
+       struct nlsock *netlink_cmd = &zns->netlink_cmd;
+
+       /* Capture key info from ns struct */
+       zebra_dplane_info_from_zns(&dp_info, zns, true /*is_cmd*/);
 
        /* Get interface information. */
-       ret = netlink_request_intf_addr(zns, AF_PACKET, RTM_GETLINK, 0);
+       ret = netlink_request_intf_addr(netlink_cmd, AF_PACKET, RTM_GETLINK, 0);
        if (ret < 0)
                return ret;
-       ret = netlink_parse_info(netlink_interface, &zns->netlink_cmd, zns, 0,
+       ret = netlink_parse_info(netlink_interface, netlink_cmd, &dp_info, 0,
                                 1);
        if (ret < 0)
                return ret;
 
        /* Get interface information - for bridge interfaces. */
-       ret = netlink_request_intf_addr(zns, AF_BRIDGE, RTM_GETLINK,
+       ret = netlink_request_intf_addr(netlink_cmd, AF_BRIDGE, RTM_GETLINK,
                                        RTEXT_FILTER_BRVLAN);
        if (ret < 0)
                return ret;
-       ret = netlink_parse_info(netlink_interface, &zns->netlink_cmd, zns, 0,
+       ret = netlink_parse_info(netlink_interface, netlink_cmd, &dp_info, 0,
                                 0);
        if (ret < 0)
                return ret;
 
        /* Get interface information - for bridge interfaces. */
-       ret = netlink_request_intf_addr(zns, AF_BRIDGE, RTM_GETLINK,
+       ret = netlink_request_intf_addr(netlink_cmd, AF_BRIDGE, RTM_GETLINK,
                                        RTEXT_FILTER_BRVLAN);
        if (ret < 0)
                return ret;
-       ret = netlink_parse_info(netlink_interface, &zns->netlink_cmd, zns, 0,
+       ret = netlink_parse_info(netlink_interface, netlink_cmd, &dp_info, 0,
                                 0);
        if (ret < 0)
                return ret;
@@ -765,19 +770,19 @@ int interface_lookup_netlink(struct zebra_ns *zns)
        zebra_if_update_all_links();
 
        /* Get IPv4 address of the interfaces. */
-       ret = netlink_request_intf_addr(zns, AF_INET, RTM_GETADDR, 0);
+       ret = netlink_request_intf_addr(netlink_cmd, AF_INET, RTM_GETADDR, 0);
        if (ret < 0)
                return ret;
-       ret = netlink_parse_info(netlink_interface_addr, &zns->netlink_cmd, zns,
+       ret = netlink_parse_info(netlink_interface_addr, netlink_cmd, &dp_info,
                                 0, 1);
        if (ret < 0)
                return ret;
 
        /* Get IPv6 address of the interfaces. */
-       ret = netlink_request_intf_addr(zns, AF_INET6, RTM_GETADDR, 0);
+       ret = netlink_request_intf_addr(netlink_cmd, AF_INET6, RTM_GETADDR, 0);
        if (ret < 0)
                return ret;
-       ret = netlink_parse_info(netlink_interface_addr, &zns->netlink_cmd, zns,
+       ret = netlink_parse_info(netlink_interface_addr, netlink_cmd, &dp_info,
                                 0, 1);
        if (ret < 0)
                return ret;
index 8e492b8069153fe553a3c5e9db66b90f08d3ed4e..96b244635df98c7f3c7117285adce4914604d939 100644 (file)
@@ -51,6 +51,8 @@
 #include "zebra/zebra_vxlan.h"
 #include "zebra/zebra_errors.h"
 
+DEFINE_MTYPE_STATIC(ZEBRA, ZINFO, "Zebra Interface Information")
+
 #define ZEBRA_PTM_SUPPORT
 
 DEFINE_HOOK(zebra_if_extra_info, (struct vty * vty, struct interface *ifp),
@@ -99,7 +101,7 @@ static int if_zebra_new_hook(struct interface *ifp)
 {
        struct zebra_if *zebra_if;
 
-       zebra_if = XCALLOC(MTYPE_TMP, sizeof(struct zebra_if));
+       zebra_if = XCALLOC(MTYPE_ZINFO, sizeof(struct zebra_if));
 
        zebra_if->multicast = IF_ZEBRA_MULTICAST_UNSPEC;
        zebra_if->shutdown = IF_ZEBRA_SHUTDOWN_OFF;
@@ -136,6 +138,8 @@ static int if_zebra_new_hook(struct interface *ifp)
        }
 #endif /* HAVE_RTADV */
 
+       memset(&zebra_if->neigh_mac[0], 0, 6);
+
        /* Initialize installed address chains tree. */
        zebra_if->ipv4_subnets =
                route_table_init_with_delegate(&zebra_if_table_delegate);
@@ -175,7 +179,7 @@ static int if_zebra_delete_hook(struct interface *ifp)
 
                THREAD_OFF(zebra_if->speed_update);
 
-               XFREE(MTYPE_TMP, zebra_if);
+               XFREE(MTYPE_ZINFO, zebra_if);
        }
 
        return 0;
@@ -802,19 +806,32 @@ static void ipv6_ll_address_to_mac(struct in6_addr *address, uint8_t *mac)
        mac[5] = address->s6_addr[15];
 }
 
-void if_nbr_ipv6ll_to_ipv4ll_neigh_update(struct interface *ifp,
-                                         struct in6_addr *address, int add)
+static bool mac_is_same(char *mac1, char *mac2)
+{
+       if (mac1[0] == mac2[0] &&
+           mac1[1] == mac2[1] &&
+           mac1[2] == mac2[2] &&
+           mac1[3] == mac2[3] &&
+           mac1[4] == mac2[4] &&
+           mac1[5] == mac2[5])
+               return true;
+       else
+               return false;
+}
+
+void if_nbr_mac_to_ipv4ll_neigh_update(struct interface *ifp,
+                                      char mac[6],
+                                      struct in6_addr *address,
+                                      int add)
 {
        struct zebra_vrf *zvrf = vrf_info_lookup(ifp->vrf_id);
        struct zebra_if *zif = ifp->info;
        char buf[16] = "169.254.0.1";
        struct in_addr ipv4_ll;
-       char mac[6];
        ns_id_t ns_id;
 
        inet_pton(AF_INET, buf, &ipv4_ll);
 
-       ipv6_ll_address_to_mac(address, (uint8_t *)mac);
        ns_id = zvrf->zns->ns_id;
 
        /*
@@ -823,10 +840,16 @@ void if_nbr_ipv6ll_to_ipv4ll_neigh_update(struct interface *ifp,
         *
         * supported message types are RTM_NEWNEIGH and RTM_DELNEIGH
         */
-       kernel_neigh_update(0, ifp->ifindex, ipv4_ll.s_addr, mac, 6, ns_id);
+       if (!mac_is_same(zif->neigh_mac, mac)) {
+               kernel_neigh_update(0, ifp->ifindex, ipv4_ll.s_addr,
+                                   mac, 6, ns_id);
 
-       /* Add arp record */
-       kernel_neigh_update(add, ifp->ifindex, ipv4_ll.s_addr, mac, 6, ns_id);
+               /* Add arp record */
+               kernel_neigh_update(add, ifp->ifindex, ipv4_ll.s_addr,
+                                   mac, 6, ns_id);
+       }
+
+       memcpy(&zif->neigh_mac[0], &mac[0], 6);
 
        /*
         * We need to note whether or not we originated a v6
@@ -840,6 +863,16 @@ void if_nbr_ipv6ll_to_ipv4ll_neigh_update(struct interface *ifp,
        zvrf->neigh_updates++;
 }
 
+void if_nbr_ipv6ll_to_ipv4ll_neigh_update(struct interface *ifp,
+                                         struct in6_addr *address, int add)
+{
+
+       char mac[6];
+
+       ipv6_ll_address_to_mac(address, (uint8_t *)mac);
+       if_nbr_mac_to_ipv4ll_neigh_update(ifp, mac, address, add);
+}
+
 static void if_nbr_ipv6ll_to_ipv4ll_neigh_add_all(struct interface *ifp)
 {
        if (listhead(ifp->nbr_connected)) {
index c6d8b24b019a23f0259bceabee81191a8c4db22b..e4c05e8dc47136847ecbf9dbcf8d1d1284d63429 100644 (file)
@@ -279,6 +279,7 @@ struct zebra_if {
         * for bgp unnumbered?
         */
        bool v6_2_v4_ll_neigh_entry;
+       char neigh_mac[6];
        struct in6_addr v6_2_v4_ll_addr6;
 };
 
@@ -332,6 +333,10 @@ extern struct interface *if_link_per_ns(struct zebra_ns *, struct interface *);
 extern const char *ifindex2ifname_per_ns(struct zebra_ns *, unsigned int);
 
 extern void if_unlink_per_ns(struct interface *);
+extern void if_nbr_mac_to_ipv4ll_neigh_update(struct interface *fip,
+                                             char mac[6],
+                                             struct in6_addr *address,
+                                             int add);
 extern void if_nbr_ipv6ll_to_ipv4ll_neigh_update(struct interface *ifp,
                                                 struct in6_addr *address,
                                                 int add);
index d35230d7bd416fc034bc8d6a590c74d67c015b26..c8ea8ae4450394a1190082f3103a08da1595f45d 100644 (file)
@@ -373,7 +373,13 @@ static long netlink_read_file(char *buf, const char *fname)
 static int kernel_read(struct thread *thread)
 {
        struct zebra_ns *zns = (struct zebra_ns *)THREAD_ARG(thread);
-       netlink_parse_info(netlink_information_fetch, &zns->netlink, zns, 5, 0);
+       struct zebra_dplane_info dp_info;
+
+       /* Capture key info from ns struct */
+       zebra_dplane_info_from_zns(&dp_info, zns, false);
+
+       netlink_parse_info(netlink_information_fetch, &zns->netlink, &dp_info,
+                          5, 0);
        zns->t_netlink = NULL;
        thread_add_read(zebrad.master, kernel_read, zns, zns->netlink.sock,
                        &zns->t_netlink);
@@ -672,8 +678,8 @@ static void netlink_parse_extended_ack(struct nlmsghdr *h)
  *            the filter.
  */
 int netlink_parse_info(int (*filter)(struct nlmsghdr *, ns_id_t, int),
-                      struct nlsock *nl, struct zebra_ns *zns, int count,
-                      int startup)
+                      struct nlsock *nl, struct zebra_dplane_info *zns,
+                      int count, int startup)
 {
        int status;
        int ret = 0;
@@ -811,7 +817,7 @@ int netlink_parse_info(int (*filter)(struct nlmsghdr *, ns_id_t, int),
 
                                /* Deal with errors that occur because of races
                                 * in link handling */
-                               if (nl == &zns->netlink_cmd
+                               if (zns->is_cmd
                                    && ((msg_type == RTM_DELROUTE
                                         && (-errnum == ENODEV
                                             || -errnum == ESRCH))
@@ -838,8 +844,7 @@ int netlink_parse_info(int (*filter)(struct nlmsghdr *, ns_id_t, int),
                                 * so do not log these as an error.
                                 */
                                if (msg_type == RTM_DELNEIGH
-                                   || (nl == &zns->netlink_cmd
-                                       && msg_type == RTM_NEWROUTE
+                                   || (zns->is_cmd && msg_type == RTM_NEWROUTE
                                        && (-errnum == ESRCH
                                            || -errnum == ENETUNREACH))) {
                                        /* This is known to happen in some
@@ -935,6 +940,7 @@ int netlink_talk(int (*filter)(struct nlmsghdr *, ns_id_t, int startup),
        struct iovec iov;
        struct msghdr msg;
        int save_errno = 0;
+       struct zebra_dplane_info dp_info;
 
        memset(&snl, 0, sizeof snl);
        memset(&iov, 0, sizeof iov);
@@ -981,7 +987,8 @@ int netlink_talk(int (*filter)(struct nlmsghdr *, ns_id_t, int startup),
         * Get reply from netlink socket.
         * The reply should either be an acknowlegement or an error.
         */
-       return netlink_parse_info(filter, nl, zns, 0, startup);
+       zebra_dplane_info_from_zns(&dp_info, zns, (nl == &(zns->netlink_cmd)));
+       return netlink_parse_info(filter, nl, &dp_info, 0, startup);
 }
 
 /* Issue request message to kernel via netlink socket. GET messages
index af0cc83f4ab99bc68dc34198bcbfd49c4c371a47..d78958d72e5777554266429b823b34cc3bb3da67 100644 (file)
@@ -52,7 +52,7 @@ extern bool netlink_read;
 extern void netlink_read_init(const char *fname);
 #endif /* HANDLE_NETLINK_FUZZING */
 extern int netlink_parse_info(int (*filter)(struct nlmsghdr *, ns_id_t, int),
-                             struct nlsock *nl, struct zebra_ns *zns,
+                             struct nlsock *nl, struct zebra_dplane_info *zns,
                              int count, int startup);
 extern int netlink_talk_filter(struct nlmsghdr *h, ns_id_t ns, int startup);
 extern int netlink_talk(int (*filter)(struct nlmsghdr *, ns_id_t, int startup),
index 95b48a9a5387bc0809f3eb8eebe90bd34e5e392b..dbea298584354578f610d47f0ce4954f0768fc11 100644 (file)
 #include "zebra/rib.h"
 #include "zebra/zebra_ns.h"
 #include "zebra/zebra_mpls.h"
-
-/*
- * Philosophy Note:
- *
- * Flags being SET/UNSET do not belong in the South Bound
- * Interface.  This Setting belongs at the calling level
- * because we can and will have multiple different interfaces
- * and we will have potentially multiple different
- * modules/filters to call.  As such Setting/Unsetting
- * success failure should be handled by the caller.
- */
-
-
-enum dp_results {
-       DP_INSTALL_SUCCESS,
-       DP_INSTALL_FAILURE,
-       DP_DELETE_SUCCESS,
-       DP_DELETE_FAILURE,
-};
-
-enum dp_req_result {
-       DP_REQUEST_QUEUED,
-       DP_REQUEST_SUCCESS,
-       DP_REQUEST_FAILURE,
-};
+#include "zebra/zebra_dplane.h"
 
 /*
  * Install/delete the specified prefix p from the kernel
@@ -66,11 +42,11 @@ enum dp_req_result {
  * semantics so we will end up with a delete than
  * a re-add.
  */
-extern enum dp_req_result kernel_route_rib(struct route_node *rn,
-                                          const struct prefix *p,
-                                          const struct prefix *src_p,
-                                          struct route_entry *old,
-                                          struct route_entry *new);
+extern enum zebra_dplane_result kernel_route_rib(struct route_node *rn,
+                                                const struct prefix *p,
+                                                const struct prefix *src_p,
+                                                struct route_entry *old,
+                                                struct route_entry *new);
 
 /*
  * So route install/failure may not be immediately known
@@ -80,7 +56,7 @@ extern enum dp_req_result kernel_route_rib(struct route_node *rn,
 extern void kernel_route_rib_pass_fail(struct route_node *rn,
                                       const struct prefix *p,
                                       struct route_entry *re,
-                                      enum dp_results res);
+                                      enum zebra_dplane_status res);
 
 extern int kernel_address_add_ipv4(struct interface *, struct connected *);
 extern int kernel_address_delete_ipv4(struct interface *, struct connected *);
@@ -91,9 +67,9 @@ extern int kernel_neigh_update(int cmd, int ifindex, uint32_t addr, char *lla,
 extern int kernel_interface_set_master(struct interface *master,
                                       struct interface *slave);
 
-extern enum dp_req_result kernel_add_lsp(zebra_lsp_t *lsp);
-extern enum dp_req_result kernel_upd_lsp(zebra_lsp_t *lsp);
-extern enum dp_req_result kernel_del_lsp(zebra_lsp_t *lsp);
+extern enum zebra_dplane_result kernel_add_lsp(zebra_lsp_t *lsp);
+extern enum zebra_dplane_result kernel_upd_lsp(zebra_lsp_t *lsp);
+extern enum zebra_dplane_result kernel_del_lsp(zebra_lsp_t *lsp);
 
 /*
  * Add the ability to pass back up the lsp install/delete
@@ -104,7 +80,7 @@ extern enum dp_req_result kernel_del_lsp(zebra_lsp_t *lsp);
  * the install/failure to set/unset flags and to notify
  * as needed.
  */
-extern void kernel_lsp_pass_fail(zebra_lsp_t *lsp, enum dp_results res);
+extern void kernel_lsp_pass_fail(zebra_lsp_t *lsp, enum zebra_dplane_status res);
 
 extern int mpls_kernel_init(void);
 
index 9e02193dfd53cba99327b3d00718c5a0739fab83..040de379e1f5d08457810faf1f04901bd266779f 100644 (file)
@@ -890,13 +890,16 @@ static int netlink_request_route(struct zebra_ns *zns, int family, int type)
 int netlink_route_read(struct zebra_ns *zns)
 {
        int ret;
+       struct zebra_dplane_info dp_info;
+
+       zebra_dplane_info_from_zns(&dp_info, zns, true /*is_cmd*/);
 
        /* Get IPv4 routing table. */
        ret = netlink_request_route(zns, AF_INET, RTM_GETROUTE);
        if (ret < 0)
                return ret;
        ret = netlink_parse_info(netlink_route_change_read_unicast,
-                                &zns->netlink_cmd, zns, 0, 1);
+                                &zns->netlink_cmd, &dp_info, 0, 1);
        if (ret < 0)
                return ret;
 
@@ -905,7 +908,7 @@ int netlink_route_read(struct zebra_ns *zns)
        if (ret < 0)
                return ret;
        ret = netlink_parse_info(netlink_route_change_read_unicast,
-                                &zns->netlink_cmd, zns, 0, 1);
+                                &zns->netlink_cmd, &dp_info, 0, 1);
        if (ret < 0)
                return ret;
 
@@ -1818,11 +1821,11 @@ int kernel_get_ipmr_sg_stats(struct zebra_vrf *zvrf, void *in)
        return suc;
 }
 
-enum dp_req_result kernel_route_rib(struct route_node *rn,
-                                   const struct prefix *p,
-                                   const struct prefix *src_p,
-                                   struct route_entry *old,
-                                   struct route_entry *new)
+enum zebra_dplane_result kernel_route_rib(struct route_node *rn,
+                                         const struct prefix *p,
+                                         const struct prefix *src_p,
+                                         struct route_entry *old,
+                                         struct route_entry *new)
 {
        int ret = 0;
 
@@ -1852,20 +1855,20 @@ enum dp_req_result kernel_route_rib(struct route_node *rn,
                                                      new, 0);
                }
                kernel_route_rib_pass_fail(rn, p, new,
-                                          (!ret) ? DP_INSTALL_SUCCESS
-                                                 : DP_INSTALL_FAILURE);
-               return DP_REQUEST_SUCCESS;
+                                          (!ret) ? ZEBRA_DPLANE_INSTALL_SUCCESS
+                                                 : ZEBRA_DPLANE_INSTALL_FAILURE);
+               return ZEBRA_DPLANE_REQUEST_SUCCESS;
        }
 
        if (old) {
                ret = netlink_route_multipath(RTM_DELROUTE, p, src_p, old, 0);
 
                kernel_route_rib_pass_fail(rn, p, old,
-                                          (!ret) ? DP_DELETE_SUCCESS
-                                                 : DP_DELETE_FAILURE);
+                                          (!ret) ? ZEBRA_DPLANE_DELETE_SUCCESS
+                                                 : ZEBRA_DPLANE_DELETE_FAILURE);
        }
 
-       return DP_REQUEST_SUCCESS;
+       return ZEBRA_DPLANE_REQUEST_SUCCESS;
 }
 
 int kernel_neigh_update(int add, int ifindex, uint32_t addr, char *lla,
@@ -2102,8 +2105,8 @@ static int netlink_macfdb_table(struct nlmsghdr *h, ns_id_t ns_id, int startup)
 }
 
 /* Request for MAC FDB information from the kernel */
-static int netlink_request_macs(struct zebra_ns *zns, int family, int type,
-                               ifindex_t master_ifindex)
+static int netlink_request_macs(struct nlsock *netlink_cmd, int family,
+                               int type, ifindex_t master_ifindex)
 {
        struct {
                struct nlmsghdr n;
@@ -2119,7 +2122,7 @@ static int netlink_request_macs(struct zebra_ns *zns, int family, int type,
        if (master_ifindex)
                addattr32(&req.n, sizeof(req), IFLA_MASTER, master_ifindex);
 
-       return netlink_request(&zns->netlink_cmd, &req.n);
+       return netlink_request(netlink_cmd, &req.n);
 }
 
 /*
@@ -2129,15 +2132,19 @@ static int netlink_request_macs(struct zebra_ns *zns, int family, int type,
 int netlink_macfdb_read(struct zebra_ns *zns)
 {
        int ret;
+       struct zebra_dplane_info dp_info;
+
+       zebra_dplane_info_from_zns(&dp_info, zns, true /*is_cmd*/);
 
        /* Get bridge FDB table. */
-       ret = netlink_request_macs(zns, AF_BRIDGE, RTM_GETNEIGH, 0);
+       ret = netlink_request_macs(&zns->netlink_cmd, AF_BRIDGE, RTM_GETNEIGH,
+                                  0);
        if (ret < 0)
                return ret;
        /* We are reading entire table. */
        filter_vlan = 0;
-       ret = netlink_parse_info(netlink_macfdb_table, &zns->netlink_cmd, zns,
-                                0, 1);
+       ret = netlink_parse_info(netlink_macfdb_table, &zns->netlink_cmd,
+                                &dp_info, 0, 1);
 
        return ret;
 }
@@ -2152,8 +2159,10 @@ int netlink_macfdb_read_for_bridge(struct zebra_ns *zns, struct interface *ifp,
        struct zebra_if *br_zif;
        struct zebra_if *zif;
        struct zebra_l2info_vxlan *vxl;
+       struct zebra_dplane_info dp_info;
        int ret = 0;
 
+       zebra_dplane_info_from_zns(&dp_info, zns, true /*is_cmd*/);
 
        /* Save VLAN we're filtering on, if needed. */
        br_zif = (struct zebra_if *)br_if->info;
@@ -2164,12 +2173,12 @@ int netlink_macfdb_read_for_bridge(struct zebra_ns *zns, struct interface *ifp,
 
        /* Get bridge FDB table for specific bridge - we do the VLAN filtering.
         */
-       ret = netlink_request_macs(zns, AF_BRIDGE, RTM_GETNEIGH,
+       ret = netlink_request_macs(&zns->netlink_cmd, AF_BRIDGE, RTM_GETNEIGH,
                                   br_if->ifindex);
        if (ret < 0)
                return ret;
-       ret = netlink_parse_info(netlink_macfdb_table, &zns->netlink_cmd, zns,
-                                0, 0);
+       ret = netlink_parse_info(netlink_macfdb_table, &zns->netlink_cmd,
+                                &dp_info, 0, 0);
 
        /* Reset VLAN filter. */
        filter_vlan = 0;
@@ -2419,8 +2428,8 @@ static int netlink_neigh_table(struct nlmsghdr *h, ns_id_t ns_id, int startup)
 }
 
 /* Request for IP neighbor information from the kernel */
-static int netlink_request_neigh(struct zebra_ns *zns, int family, int type,
-                                ifindex_t ifindex)
+static int netlink_request_neigh(struct nlsock *netlink_cmd, int family,
+                                int type, ifindex_t ifindex)
 {
        struct {
                struct nlmsghdr n;
@@ -2436,7 +2445,7 @@ static int netlink_request_neigh(struct zebra_ns *zns, int family, int type,
        if (ifindex)
                addattr32(&req.n, sizeof(req), NDA_IFINDEX, ifindex);
 
-       return netlink_request(&zns->netlink_cmd, &req.n);
+       return netlink_request(netlink_cmd, &req.n);
 }
 
 /*
@@ -2446,13 +2455,17 @@ static int netlink_request_neigh(struct zebra_ns *zns, int family, int type,
 int netlink_neigh_read(struct zebra_ns *zns)
 {
        int ret;
+       struct zebra_dplane_info dp_info;
+
+       zebra_dplane_info_from_zns(&dp_info, zns, true /*is_cmd*/);
 
        /* Get IP neighbor table. */
-       ret = netlink_request_neigh(zns, AF_UNSPEC, RTM_GETNEIGH, 0);
+       ret = netlink_request_neigh(&zns->netlink_cmd, AF_UNSPEC, RTM_GETNEIGH,
+                                   0);
        if (ret < 0)
                return ret;
-       ret = netlink_parse_info(netlink_neigh_table, &zns->netlink_cmd, zns, 0,
-                                1);
+       ret = netlink_parse_info(netlink_neigh_table, &zns->netlink_cmd,
+                                &dp_info, 0, 1);
 
        return ret;
 }
@@ -2464,13 +2477,16 @@ int netlink_neigh_read(struct zebra_ns *zns)
 int netlink_neigh_read_for_vlan(struct zebra_ns *zns, struct interface *vlan_if)
 {
        int ret = 0;
+       struct zebra_dplane_info dp_info;
+
+       zebra_dplane_info_from_zns(&dp_info, zns, true /*is_cmd*/);
 
-       ret = netlink_request_neigh(zns, AF_UNSPEC, RTM_GETNEIGH,
+       ret = netlink_request_neigh(&zns->netlink_cmd, AF_UNSPEC, RTM_GETNEIGH,
                                    vlan_if->ifindex);
        if (ret < 0)
                return ret;
-       ret = netlink_parse_info(netlink_neigh_table, &zns->netlink_cmd, zns, 0,
-                                0);
+       ret = netlink_parse_info(netlink_neigh_table, &zns->netlink_cmd,
+                                &dp_info, 0, 0);
 
        return ret;
 }
index e733b4b26e6b92fa58152e0f654232aa640ee231..e8d0b71605405824312673471243acbef13308eb 100644 (file)
@@ -391,18 +391,18 @@ static int kernel_rtm(int cmd, const struct prefix *p, struct route_entry *re)
        return 0;
 }
 
-enum dp_req_result kernel_route_rib(struct route_node *rn,
-                                   const struct prefix *p,
-                                   const struct prefix *src_p,
-                                   struct route_entry *old,
-                                   struct route_entry *new)
+enum zebra_dplane_result kernel_route_rib(struct route_node *rn,
+                                         const struct prefix *p,
+                                         const struct prefix *src_p,
+                                         struct route_entry *old,
+                                         struct route_entry *new)
 {
        int route = 0;
 
        if (src_p && src_p->prefixlen) {
                flog_warn(EC_ZEBRA_UNSUPPORTED_V6_SRCDEST,
                          "%s: IPv6 sourcedest routes unsupported!", __func__);
-               return DP_REQUEST_FAILURE;
+               return ZEBRA_DPLANE_REQUEST_FAILURE;
        }
 
        frr_elevate_privs(&zserv_privs) {
@@ -418,16 +418,16 @@ enum dp_req_result kernel_route_rib(struct route_node *rn,
        if (new) {
                kernel_route_rib_pass_fail(
                        rn, p, new,
-                       (!route) ? DP_INSTALL_SUCCESS
-                                : DP_INSTALL_FAILURE);
+                       (!route) ? ZEBRA_DPLANE_INSTALL_SUCCESS
+                                : ZEBRA_DPLANE_INSTALL_FAILURE);
        } else {
                kernel_route_rib_pass_fail(rn, p, old,
                                           (!route)
-                                                  ? DP_DELETE_SUCCESS
-                                                  : DP_DELETE_FAILURE);
+                                                  ? ZEBRA_DPLANE_DELETE_SUCCESS
+                                                  : ZEBRA_DPLANE_DELETE_FAILURE);
        }
 
-       return DP_REQUEST_SUCCESS;
+       return ZEBRA_DPLANE_REQUEST_SUCCESS;
 }
 
 int kernel_neigh_update(int add, int ifindex, uint32_t addr, char *lla,
index f9bd5ad1bb00481a36e929692b95e1f3b7eb2194..3bb75f344654ff12d8839a3a156c48b43a630abe 100644 (file)
@@ -455,6 +455,38 @@ static void rtadv_process_solicit(struct interface *ifp)
        rtadv_send_packet(zns->rtadv.sock, ifp);
 }
 
+/*
+ * This function processes optional attributes off of
+ * end of a RA packet received.  At this point in
+ * time we only care about this in one situation
+ * which is when a interface does not have a LL
+ * v6 address.  We still need to be able to install
+ * the mac address for v4 to v6 resolution
+ */
+static void rtadv_process_optional(uint8_t *optional, unsigned int len,
+                                  struct interface *ifp,
+                                  struct sockaddr_in6 *addr)
+{
+       char *mac;
+
+       while (len > 0) {
+               struct nd_opt_hdr *opt_hdr = (struct nd_opt_hdr *)optional;
+
+               switch(opt_hdr->nd_opt_type) {
+               case ND_OPT_SOURCE_LINKADDR:
+                       mac = (char *)(optional+2);
+                       if_nbr_mac_to_ipv4ll_neigh_update(ifp, mac,
+                                                         &addr->sin6_addr, 1);
+                       break;
+               default:
+                       break;
+               }
+
+               len -= 8 * opt_hdr->nd_opt_len;
+               optional += 8 * opt_hdr->nd_opt_len;
+       }
+}
+
 static void rtadv_process_advert(uint8_t *msg, unsigned int len,
                                 struct interface *ifp,
                                 struct sockaddr_in6 *addr)
@@ -469,14 +501,19 @@ static void rtadv_process_advert(uint8_t *msg, unsigned int len,
        inet_ntop(AF_INET6, &addr->sin6_addr, addr_str, INET6_ADDRSTRLEN);
 
        if (len < sizeof(struct nd_router_advert)) {
-               zlog_debug("%s(%u): Rx RA with invalid length %d from %s",
-                          ifp->name, ifp->ifindex, len, addr_str);
+               if (IS_ZEBRA_DEBUG_PACKET)
+                       zlog_debug("%s(%u): Rx RA with invalid length %d from %s",
+                                  ifp->name, ifp->ifindex, len, addr_str);
                return;
        }
+
        if (!IN6_IS_ADDR_LINKLOCAL(&addr->sin6_addr)) {
-               zlog_debug(
-                       "%s(%u): Rx RA with non-linklocal source address from %s",
-                       ifp->name, ifp->ifindex, addr_str);
+               rtadv_process_optional(msg + sizeof(struct nd_router_advert),
+                                      len - sizeof(struct nd_router_advert),
+                                      ifp, addr);
+               if (IS_ZEBRA_DEBUG_PACKET)
+                       zlog_debug("%s(%u): Rx RA with non-linklocal source address from %s",
+                                  ifp->name, ifp->ifindex, addr_str);
                return;
        }
 
index 518d81dd6ebb29367c1eb2683d4493c82da52502..7686a0ac32bc6d22a2bf8c1b013dce83ffbd86b9 100644 (file)
@@ -143,31 +143,31 @@ static int netlink_rule_update(int cmd, struct zebra_pbr_rule *rule)
  * goes in the rule to denote relative ordering; it may or may not be the
  * same as the rule's user-defined sequence number.
  */
-enum dp_req_result kernel_add_pbr_rule(struct zebra_pbr_rule *rule)
+enum zebra_dplane_result kernel_add_pbr_rule(struct zebra_pbr_rule *rule)
 {
        int ret = 0;
 
        ret = netlink_rule_update(RTM_NEWRULE, rule);
        kernel_pbr_rule_add_del_status(rule,
-                                      (!ret) ? DP_INSTALL_SUCCESS
-                                             : DP_INSTALL_FAILURE);
+                                      (!ret) ? ZEBRA_DPLANE_INSTALL_SUCCESS
+                                             : ZEBRA_DPLANE_INSTALL_FAILURE);
 
-       return DP_REQUEST_SUCCESS;
+       return ZEBRA_DPLANE_REQUEST_SUCCESS;
 }
 
 /*
  * Uninstall specified rule for a specific interface.
  */
-enum dp_req_result kernel_del_pbr_rule(struct zebra_pbr_rule *rule)
+enum zebra_dplane_result kernel_del_pbr_rule(struct zebra_pbr_rule *rule)
 {
        int ret = 0;
 
        ret = netlink_rule_update(RTM_DELRULE, rule);
        kernel_pbr_rule_add_del_status(rule,
-                                      (!ret) ? DP_DELETE_SUCCESS
-                                             : DP_DELETE_FAILURE);
+                                      (!ret) ? ZEBRA_DPLANE_DELETE_SUCCESS
+                                             : ZEBRA_DPLANE_DELETE_FAILURE);
 
-       return DP_REQUEST_SUCCESS;
+       return ZEBRA_DPLANE_REQUEST_SUCCESS;
 }
 
 /*
index 11d9e00ebb683c16f5ca359e583e5d485259fbf1..c5660abf3a6f5b8c86b38b79c93575a5bf15ae30 100644 (file)
 #include "zebra/zebra_pbr.h"
 #include "zebra/zebra_errors.h"
 
-enum dp_req_result kernel_add_pbr_rule(struct zebra_pbr_rule *rule)
+enum zebra_dplane_result kernel_add_pbr_rule(struct zebra_pbr_rule *rule)
 {
        flog_err(EC_LIB_UNAVAILABLE, "%s not Implemented for this platform",
                 __PRETTY_FUNCTION__);
-       return DP_REQUEST_FAILURE;
+       return ZEBRA_DPLANE_REQUEST_FAILURE;
 }
 
-enum dp_req_result kernel_del_pbr_rule(struct zebra_pbr_rule *rule)
+enum zebra_dplane_result kernel_del_pbr_rule(struct zebra_pbr_rule *rule)
 {
        flog_err(EC_LIB_UNAVAILABLE, "%s not Implemented for this platform",
                 __PRETTY_FUNCTION__);
-       return DP_REQUEST_FAILURE;
+       return ZEBRA_DPLANE_REQUEST_FAILURE;
 }
 
 #endif
index a87fcec41f0eda8200fd518d2fb63bc9de51a1c8..1d76ff65ca4729d47ad0c76dec7a4b9403e4ffed 100644 (file)
@@ -66,6 +66,7 @@ zebra_zebra_SOURCES = \
        zebra/rule_socket.c \
        zebra/zebra_l2.c \
        zebra/zebra_memory.c \
+       zebra/zebra_dplane.c \
        zebra/zebra_mpls.c \
        zebra/zebra_mpls_netlink.c \
        zebra/zebra_mpls_openbsd.c \
@@ -115,6 +116,7 @@ noinst_HEADERS += \
        zebra/rule_netlink.h \
        zebra/zebra_fpm_private.h \
        zebra/zebra_l2.h \
+       zebra/zebra_dplane.h \
        zebra/zebra_memory.h \
        zebra/zebra_mpls.h \
        zebra/zebra_mroute.h \
diff --git a/zebra/zebra_dplane.c b/zebra/zebra_dplane.c
new file mode 100644 (file)
index 0000000..c0e4939
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * Zebra dataplane layer.
+ * Copyright (c) 2018 Volta Networks, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; see the file COPYING; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <zebra.h>
+#include "zebra_dplane.h"
diff --git a/zebra/zebra_dplane.h b/zebra/zebra_dplane.h
new file mode 100644 (file)
index 0000000..7cbef74
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * Zebra dataplane layer api interfaces.
+ * Copyright (c) 2018 Volta Networks, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; see the file COPYING; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef _ZEBRA_DPLANE_H
+#define _ZEBRA_DPLANE_H 1
+
+#include "zebra.h"
+#include "zserv.h"
+#include "prefix.h"
+#include "nexthop.h"
+#include "nexthop_group.h"
+
+
+/*
+ * API between the zebra dataplane system and the main zebra processing
+ * context.
+ */
+
+/* Key netlink info from zebra ns */
+struct zebra_dplane_info {
+       ns_id_t ns_id;
+
+#if defined(HAVE_NETLINK)
+       uint32_t nl_pid;
+       bool is_cmd;
+#endif
+};
+
+/* Utility to fill in zns info from main zns struct */
+static inline void
+zebra_dplane_info_from_zns(struct zebra_dplane_info *zns_info,
+                          const struct zebra_ns *zns, bool is_cmd)
+{
+       zns_info->ns_id = zns->ns_id;
+
+#if defined(HAVE_NETLINK)
+       zns_info->is_cmd = is_cmd;
+       if (is_cmd) {
+               zns_info->nl_pid = zns->netlink_cmd.snl.nl_pid;
+       } else {
+               zns_info->nl_pid = zns->netlink.snl.nl_pid;
+       }
+#endif /* NETLINK */
+}
+
+/*
+ * Enqueue a route install or update for the dataplane.
+ */
+
+/*
+ * Enqueue a route removal for the dataplane.
+ */
+
+/*
+ * Result codes used when returning status back to the main zebra context.
+ */
+
+/*
+ * Philosophy Note:
+ *
+ * Flags being SET/UNSET do not belong in the South Bound
+ * Interface.  This Setting belongs at the calling level
+ * because we can and will have multiple different interfaces
+ * and we will have potentially multiple different
+ * modules/filters to call.  As such Setting/Unsetting
+ * success failure should be handled by the caller.
+ */
+enum zebra_dplane_status {
+       ZEBRA_DPLANE_STATUS_NONE = 0,
+       ZEBRA_DPLANE_INSTALL_SUCCESS,
+       ZEBRA_DPLANE_INSTALL_FAILURE,
+       ZEBRA_DPLANE_DELETE_SUCCESS,
+       ZEBRA_DPLANE_DELETE_FAILURE,
+
+};
+
+enum zebra_dplane_result {
+       ZEBRA_DPLANE_REQUEST_QUEUED,
+       ZEBRA_DPLANE_REQUEST_SUCCESS,
+       ZEBRA_DPLANE_REQUEST_FAILURE,
+};
+
+#endif /* _ZEBRA_DPLANE_H */
index c27884ec48152459c02b991b921b3e8f012a5c85..207cbc0992221a9c2de839ff69a7cf9c23467813 100644 (file)
@@ -32,6 +32,7 @@
 #include "prefix.h"
 
 #include "zebra/zserv.h"
+#include "zebra/zebra_dplane.h"
 #include "zebra/zebra_ns.h"
 #include "zebra/zebra_vrf.h"
 #include "zebra/kernel_netlink.h"
index c19aeb626068a4dcb5e7029f1864eb6a6bfd6e1a..0d1ccdc5aa0c263ad899164b3616c7fef9fc9347 100644 (file)
@@ -917,14 +917,14 @@ static wq_item_status lsp_process(struct work_queue *wq, void *data)
 
                        UNSET_FLAG(lsp->flags, LSP_FLAG_CHANGED);
                        switch (kernel_add_lsp(lsp)) {
-                       case DP_REQUEST_QUEUED:
+                       case ZEBRA_DPLANE_REQUEST_QUEUED:
                                flog_err(
                                        EC_ZEBRA_DP_INVALID_RC,
                                        "No current DataPlane interfaces can return this, please fix");
                                break;
-                       case DP_REQUEST_FAILURE:
+                       case ZEBRA_DPLANE_REQUEST_FAILURE:
                                break;
-                       case DP_REQUEST_SUCCESS:
+                       case ZEBRA_DPLANE_REQUEST_SUCCESS:
                                zvrf->lsp_installs++;
                                break;
                        }
@@ -934,14 +934,14 @@ static wq_item_status lsp_process(struct work_queue *wq, void *data)
                if (!newbest) {
 
                        switch (kernel_del_lsp(lsp)) {
-                       case DP_REQUEST_QUEUED:
+                       case ZEBRA_DPLANE_REQUEST_QUEUED:
                                flog_err(
                                        EC_ZEBRA_DP_INVALID_RC,
                                        "No current DataPlane interfaces can return this, please fix");
                                break;
-                       case DP_REQUEST_FAILURE:
+                       case ZEBRA_DPLANE_REQUEST_FAILURE:
                                break;
-                       case DP_REQUEST_SUCCESS:
+                       case ZEBRA_DPLANE_REQUEST_SUCCESS:
                                zvrf->lsp_removals++;
                                break;
                        }
@@ -974,14 +974,14 @@ static wq_item_status lsp_process(struct work_queue *wq, void *data)
                        }
 
                        switch (kernel_upd_lsp(lsp)) {
-                       case DP_REQUEST_QUEUED:
+                       case ZEBRA_DPLANE_REQUEST_QUEUED:
                                flog_err(
                                        EC_ZEBRA_DP_INVALID_RC,
                                        "No current DataPlane interfaces can return this, please fix");
                                break;
-                       case DP_REQUEST_FAILURE:
+                       case ZEBRA_DPLANE_REQUEST_FAILURE:
                                break;
-                       case DP_REQUEST_SUCCESS:
+                       case ZEBRA_DPLANE_REQUEST_SUCCESS:
                                zvrf->lsp_installs++;
                                break;
                        }
@@ -1716,7 +1716,7 @@ static int mpls_processq_init(struct zebra_t *zebra)
 
 /* Public functions */
 
-void kernel_lsp_pass_fail(zebra_lsp_t *lsp, enum dp_results res)
+void kernel_lsp_pass_fail(zebra_lsp_t *lsp, enum zebra_dplane_status res)
 {
        struct nexthop *nexthop;
        zebra_nhlfe_t *nhlfe;
@@ -1725,13 +1725,13 @@ void kernel_lsp_pass_fail(zebra_lsp_t *lsp, enum dp_results res)
                return;
 
        switch (res) {
-       case DP_INSTALL_FAILURE:
+       case ZEBRA_DPLANE_INSTALL_FAILURE:
                UNSET_FLAG(lsp->flags, LSP_FLAG_INSTALLED);
                clear_nhlfe_installed(lsp);
                flog_warn(EC_ZEBRA_LSP_INSTALL_FAILURE,
                          "LSP Install Failure: %u", lsp->ile.in_label);
                break;
-       case DP_INSTALL_SUCCESS:
+       case ZEBRA_DPLANE_INSTALL_SUCCESS:
                SET_FLAG(lsp->flags, LSP_FLAG_INSTALLED);
                for (nhlfe = lsp->nhlfe_list; nhlfe; nhlfe = nhlfe->next) {
                        nexthop = nhlfe->nexthop;
@@ -1742,14 +1742,16 @@ void kernel_lsp_pass_fail(zebra_lsp_t *lsp, enum dp_results res)
                        SET_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB);
                }
                break;
-       case DP_DELETE_SUCCESS:
+       case ZEBRA_DPLANE_DELETE_SUCCESS:
                UNSET_FLAG(lsp->flags, LSP_FLAG_INSTALLED);
                clear_nhlfe_installed(lsp);
                break;
-       case DP_DELETE_FAILURE:
+       case ZEBRA_DPLANE_DELETE_FAILURE:
                flog_warn(EC_ZEBRA_LSP_DELETE_FAILURE,
                          "LSP Deletion Failure: %u", lsp->ile.in_label);
                break;
+       case ZEBRA_DPLANE_STATUS_NONE:
+               break;
        }
 }
 
index 245a7717845576692800f7c094cb3fa068b270c1..c4ab316d0b9ce388655c2642b9937a1a0531f8bf 100644 (file)
 /*
  * Install Label Forwarding entry into the kernel.
  */
-enum dp_req_result kernel_add_lsp(zebra_lsp_t *lsp)
+enum zebra_dplane_result kernel_add_lsp(zebra_lsp_t *lsp)
 {
        int ret;
 
        if (!lsp || !lsp->best_nhlfe) { // unexpected
-               kernel_lsp_pass_fail(lsp, DP_INSTALL_FAILURE);
-               return DP_REQUEST_FAILURE;
+               kernel_lsp_pass_fail(lsp, ZEBRA_DPLANE_INSTALL_FAILURE);
+               return ZEBRA_DPLANE_REQUEST_FAILURE;
        }
 
        ret = netlink_mpls_multipath(RTM_NEWROUTE, lsp);
 
        kernel_lsp_pass_fail(lsp,
-                            (!ret) ? DP_INSTALL_SUCCESS
-                                   : DP_INSTALL_FAILURE);
+                            (!ret) ? ZEBRA_DPLANE_INSTALL_SUCCESS
+                                   : ZEBRA_DPLANE_INSTALL_FAILURE);
 
-       return DP_REQUEST_SUCCESS;
+       return ZEBRA_DPLANE_REQUEST_SUCCESS;
 }
 
 /*
@@ -58,48 +58,48 @@ enum dp_req_result kernel_add_lsp(zebra_lsp_t *lsp)
  * through the metric field (before kernel-MPLS). This shouldn't be an issue
  * any longer, so REPLACE can be reintroduced.
  */
-enum dp_req_result kernel_upd_lsp(zebra_lsp_t *lsp)
+enum zebra_dplane_result kernel_upd_lsp(zebra_lsp_t *lsp)
 {
        int ret;
 
        if (!lsp || !lsp->best_nhlfe) { // unexpected
-               kernel_lsp_pass_fail(lsp, DP_INSTALL_FAILURE);
-               return DP_REQUEST_FAILURE;
+               kernel_lsp_pass_fail(lsp, ZEBRA_DPLANE_INSTALL_FAILURE);
+               return ZEBRA_DPLANE_REQUEST_FAILURE;
        }
 
        ret = netlink_mpls_multipath(RTM_NEWROUTE, lsp);
 
        kernel_lsp_pass_fail(lsp,
-                            (!ret) ? DP_INSTALL_SUCCESS
-                                   : DP_INSTALL_FAILURE);
+                            (!ret) ? ZEBRA_DPLANE_INSTALL_SUCCESS
+                                   : ZEBRA_DPLANE_INSTALL_FAILURE);
 
-       return DP_REQUEST_SUCCESS;
+       return ZEBRA_DPLANE_REQUEST_SUCCESS;
 }
 
 /*
  * Delete Label Forwarding entry from the kernel.
  */
-enum dp_req_result kernel_del_lsp(zebra_lsp_t *lsp)
+enum zebra_dplane_result kernel_del_lsp(zebra_lsp_t *lsp)
 {
        int ret;
 
        if (!lsp) { // unexpected
-               kernel_lsp_pass_fail(lsp, DP_DELETE_FAILURE);
-               return DP_REQUEST_FAILURE;
+               kernel_lsp_pass_fail(lsp, ZEBRA_DPLANE_DELETE_FAILURE);
+               return ZEBRA_DPLANE_REQUEST_FAILURE;
        }
 
        if (!CHECK_FLAG(lsp->flags, LSP_FLAG_INSTALLED)) {
-               kernel_lsp_pass_fail(lsp, DP_DELETE_FAILURE);
-               return DP_REQUEST_FAILURE;
+               kernel_lsp_pass_fail(lsp, ZEBRA_DPLANE_DELETE_FAILURE);
+               return ZEBRA_DPLANE_REQUEST_FAILURE;
        }
 
        ret = netlink_mpls_multipath(RTM_DELROUTE, lsp);
 
        kernel_lsp_pass_fail(lsp,
-                            (!ret) ? DP_DELETE_SUCCESS
-                                   : DP_DELETE_FAILURE);
+                            (!ret) ? ZEBRA_DPLANE_DELETE_SUCCESS
+                                   : ZEBRA_DPLANE_DELETE_FAILURE);
 
-       return DP_REQUEST_SUCCESS;
+       return ZEBRA_DPLANE_REQUEST_SUCCESS;
 }
 
 int mpls_kernel_init(void)
index d1371d3343b9fed90a0e9f1c82b0368b24eae715..02ec506d84604f641ecb1b86dbc5777fda341c17 100644 (file)
 
 #if !defined(HAVE_NETLINK) && !defined(OPEN_BSD)
 
-enum dp_req_result kernel_add_lsp(zebra_lsp_t *lsp)
+enum zebra_dplane_result kernel_add_lsp(zebra_lsp_t *lsp)
 {
-       return DP_REQUEST_SUCCESS;
+       return ZEBRA_DPLANE_REQUEST_SUCCESS;
 }
 
-enum dp_req_result kernel_upd_lsp(zebra_lsp_t *lsp)
+enum zebra_dplane_result kernel_upd_lsp(zebra_lsp_t *lsp)
 {
-       return DP_REQUEST_SUCCESS;
+       return ZEBRA_DPLANE_REQUEST_SUCCESS;
 }
 
-enum dp_req_result kernel_del_lsp(zebra_lsp_t *lsp)
+enum zebra_dplane_result kernel_del_lsp(zebra_lsp_t *lsp)
 {
-       return DP_REQUEST_SUCCESS;
+       return ZEBRA_DPLANE_REQUEST_SUCCESS;
 }
 
 int mpls_kernel_init(void)
index 71679f26d6be3246ab022cdefdfa333d664fb8c6..60f944b8448f295de7247c7e3a06da1db09a9f2f 100644 (file)
@@ -285,62 +285,62 @@ static int kernel_lsp_cmd(int action, zebra_lsp_t *lsp)
        return (0);
 }
 
-enum dp_req_result kernel_add_lsp(zebra_lsp_t *lsp)
+enum zebra_dplane_result kernel_add_lsp(zebra_lsp_t *lsp)
 {
        int ret;
 
        if (!lsp || !lsp->best_nhlfe) { // unexpected
-               kernel_lsp_pass_fail(lsp, DP_INSTALL_FAILURE);
-               return DP_REQUEST_FAILURE;
+               kernel_lsp_pass_fail(lsp, ZEBRA_DPLANE_INSTALL_FAILURE);
+               return ZEBRA_DPLANE_REQUEST_FAILURE;
        }
 
        ret = kernel_lsp_cmd(RTM_ADD, lsp);
 
        kernel_lsp_pass_fail(lsp,
-                            (!ret) ? DP_INSTALL_SUCCESS
-                                   : DP_INSTALL_FAILURE);
+                            (!ret) ? ZEBRA_DPLANE_INSTALL_SUCCESS
+                                   : ZEBRA_DPLANE_INSTALL_FAILURE);
 
-       return DP_REQUEST_SUCCESS;
+       return ZEBRA_DPLANE_REQUEST_SUCCESS;
 }
 
-enum dp_req_result kernel_upd_lsp(zebra_lsp_t *lsp)
+enum zebra_dplane_result kernel_upd_lsp(zebra_lsp_t *lsp)
 {
        int ret;
 
        if (!lsp || !lsp->best_nhlfe) { // unexpected
-               kernel_lsp_pass_fail(lsp, DP_INSTALL_FAILURE);
-               return DP_REQUEST_FAILURE;
+               kernel_lsp_pass_fail(lsp, ZEBRA_DPLANE_INSTALL_FAILURE);
+               return ZEBRA_DPLANE_REQUEST_FAILURE;
        }
 
        ret = kernel_lsp_cmd(RTM_CHANGE, lsp);
 
        kernel_lsp_pass_fail(lsp,
-                            (!ret) ? DP_INSTALL_SUCCESS
-                                   : DP_INSTALL_FAILURE);
-       return DP_REQUEST_SUCCESS;
+                            (!ret) ? ZEBRA_DPLANE_INSTALL_SUCCESS
+                                   : ZEBRA_DPLANE_INSTALL_FAILURE);
+       return ZEBRA_DPLANE_REQUEST_SUCCESS;
 }
 
-enum dp_req_result kernel_del_lsp(zebra_lsp_t *lsp)
+enum zebra_dplane_result kernel_del_lsp(zebra_lsp_t *lsp)
 {
        int ret;
 
        if (!lsp) { // unexpected
-               kernel_lsp_pass_fail(lsp, DP_DELETE_FAILURE);
-               return DP_REQUEST_FAILURE;
+               kernel_lsp_pass_fail(lsp, ZEBRA_DPLANE_DELETE_FAILURE);
+               return ZEBRA_DPLANE_REQUEST_FAILURE;
        }
 
        if (!CHECK_FLAG(lsp->flags, LSP_FLAG_INSTALLED)) {
-               kernel_lsp_pass_fail(lsp, DP_DELETE_FAILURE);
-               return DP_REQUEST_FAILURE;
+               kernel_lsp_pass_fail(lsp, ZEBRA_DPLANE_DELETE_FAILURE);
+               return ZEBRA_DPLANE_REQUEST_FAILURE;
        }
 
        ret = kernel_lsp_cmd(RTM_DELETE, lsp);
 
        kernel_lsp_pass_fail(lsp,
-                            (!ret) ? DP_DELETE_SUCCESS
-                                   : DP_DELETE_FAILURE);
+                            (!ret) ? ZEBRA_DPLANE_DELETE_SUCCESS
+                                   : ZEBRA_DPLANE_DELETE_FAILURE);
 
-       return DP_REQUEST_SUCCESS;
+       return ZEBRA_DPLANE_REQUEST_SUCCESS;
 }
 
 static int kmpw_install(struct zebra_pw *pw)
index b26c0515f17d1a4da8da124bc9e1135b7811141f..600d1d55c63e8a3e8dc8c99e6a5fe882d872dea7 100644 (file)
 #include "log.h"
 #include "lib_errors.h"
 
+#include "zebra/rib.h"
+#include "zebra/zebra_dplane.h"
 #if defined(HAVE_NETLINK)
 
 #include <linux/net_namespace.h>
 #include <linux/netlink.h>
 #include <linux/rtnetlink.h>
 
-#include "rib.h"
 #include "zebra_ns.h"
 #include "kernel_netlink.h"
 #endif /* defined(HAVE_NETLINK) */
index 275e045d43bb454a7a5d0b9c15e881d7f9cd3891..40f97765da8c84dfa5fff208447a4a854a5b2c2f 100644 (file)
@@ -565,8 +565,8 @@ void zebra_pbr_create_ipset(struct zebra_ns *zns,
        ret = hook_call(zebra_pbr_ipset_wrap_script_update,
                  zns, 1, ipset);
        kernel_pbr_ipset_add_del_status(ipset,
-                                       ret ? DP_INSTALL_SUCCESS
-                                       : DP_INSTALL_FAILURE);
+                                       ret ? ZEBRA_DPLANE_INSTALL_SUCCESS
+                                       : ZEBRA_DPLANE_INSTALL_FAILURE);
 }
 
 void zebra_pbr_destroy_ipset(struct zebra_ns *zns,
@@ -650,8 +650,8 @@ void zebra_pbr_add_ipset_entry(struct zebra_ns *zns,
        ret = hook_call(zebra_pbr_ipset_entry_wrap_script_update,
                  zns, 1, ipset);
        kernel_pbr_ipset_entry_add_del_status(ipset,
-                                       ret ? DP_INSTALL_SUCCESS
-                                       : DP_INSTALL_FAILURE);
+                                       ret ? ZEBRA_DPLANE_INSTALL_SUCCESS
+                                       : ZEBRA_DPLANE_INSTALL_FAILURE);
 }
 
 void zebra_pbr_del_ipset_entry(struct zebra_ns *zns,
@@ -693,8 +693,8 @@ void zebra_pbr_add_iptable(struct zebra_ns *zns,
                       pbr_iptable_alloc_intern);
        ret = hook_call(zebra_pbr_iptable_wrap_script_update, zns, 1, iptable);
        kernel_pbr_iptable_add_del_status(iptable,
-                                         ret ? DP_INSTALL_SUCCESS
-                                         : DP_INSTALL_FAILURE);
+                                         ret ? ZEBRA_DPLANE_INSTALL_SUCCESS
+                                         : ZEBRA_DPLANE_INSTALL_FAILURE);
 }
 
 void zebra_pbr_del_iptable(struct zebra_ns *zns,
@@ -725,21 +725,23 @@ void zebra_pbr_del_iptable(struct zebra_ns *zns,
  * Handle success or failure of rule (un)install in the kernel.
  */
 void kernel_pbr_rule_add_del_status(struct zebra_pbr_rule *rule,
-                                   enum dp_results res)
+                                   enum zebra_dplane_status res)
 {
        switch (res) {
-       case DP_INSTALL_SUCCESS:
+       case ZEBRA_DPLANE_INSTALL_SUCCESS:
                zsend_rule_notify_owner(rule, ZAPI_RULE_INSTALLED);
                break;
-       case DP_INSTALL_FAILURE:
+       case ZEBRA_DPLANE_INSTALL_FAILURE:
                zsend_rule_notify_owner(rule, ZAPI_RULE_FAIL_INSTALL);
                break;
-       case DP_DELETE_SUCCESS:
+       case ZEBRA_DPLANE_DELETE_SUCCESS:
                zsend_rule_notify_owner(rule, ZAPI_RULE_REMOVED);
                break;
-       case DP_DELETE_FAILURE:
+       case ZEBRA_DPLANE_DELETE_FAILURE:
                zsend_rule_notify_owner(rule, ZAPI_RULE_FAIL_REMOVE);
                break;
+       case ZEBRA_DPLANE_STATUS_NONE:
+               break;
        }
 }
 
@@ -747,21 +749,23 @@ void kernel_pbr_rule_add_del_status(struct zebra_pbr_rule *rule,
  * Handle success or failure of ipset (un)install in the kernel.
  */
 void kernel_pbr_ipset_add_del_status(struct zebra_pbr_ipset *ipset,
-                                   enum dp_results res)
+                                   enum zebra_dplane_status res)
 {
        switch (res) {
-       case DP_INSTALL_SUCCESS:
+       case ZEBRA_DPLANE_INSTALL_SUCCESS:
                zsend_ipset_notify_owner(ipset, ZAPI_IPSET_INSTALLED);
                break;
-       case DP_INSTALL_FAILURE:
+       case ZEBRA_DPLANE_INSTALL_FAILURE:
                zsend_ipset_notify_owner(ipset, ZAPI_IPSET_FAIL_INSTALL);
                break;
-       case DP_DELETE_SUCCESS:
+       case ZEBRA_DPLANE_DELETE_SUCCESS:
                zsend_ipset_notify_owner(ipset, ZAPI_IPSET_REMOVED);
                break;
-       case DP_DELETE_FAILURE:
+       case ZEBRA_DPLANE_DELETE_FAILURE:
                zsend_ipset_notify_owner(ipset, ZAPI_IPSET_FAIL_REMOVE);
                break;
+       case ZEBRA_DPLANE_STATUS_NONE:
+               break;
        }
 }
 
@@ -770,25 +774,27 @@ void kernel_pbr_ipset_add_del_status(struct zebra_pbr_ipset *ipset,
  */
 void kernel_pbr_ipset_entry_add_del_status(
                        struct zebra_pbr_ipset_entry *ipset,
-                       enum dp_results res)
+                       enum zebra_dplane_status res)
 {
        switch (res) {
-       case DP_INSTALL_SUCCESS:
+       case ZEBRA_DPLANE_INSTALL_SUCCESS:
                zsend_ipset_entry_notify_owner(ipset,
                                               ZAPI_IPSET_ENTRY_INSTALLED);
                break;
-       case DP_INSTALL_FAILURE:
+       case ZEBRA_DPLANE_INSTALL_FAILURE:
                zsend_ipset_entry_notify_owner(ipset,
                                               ZAPI_IPSET_ENTRY_FAIL_INSTALL);
                break;
-       case DP_DELETE_SUCCESS:
+       case ZEBRA_DPLANE_DELETE_SUCCESS:
                zsend_ipset_entry_notify_owner(ipset,
                                               ZAPI_IPSET_ENTRY_REMOVED);
                break;
-       case DP_DELETE_FAILURE:
+       case ZEBRA_DPLANE_DELETE_FAILURE:
                zsend_ipset_entry_notify_owner(ipset,
                                               ZAPI_IPSET_ENTRY_FAIL_REMOVE);
                break;
+       case ZEBRA_DPLANE_STATUS_NONE:
+               break;
        }
 }
 
@@ -796,23 +802,25 @@ void kernel_pbr_ipset_entry_add_del_status(
  * Handle success or failure of ipset (un)install in the kernel.
  */
 void kernel_pbr_iptable_add_del_status(struct zebra_pbr_iptable *iptable,
-                                      enum dp_results res)
+                                      enum zebra_dplane_status res)
 {
        switch (res) {
-       case DP_INSTALL_SUCCESS:
+       case ZEBRA_DPLANE_INSTALL_SUCCESS:
                zsend_iptable_notify_owner(iptable, ZAPI_IPTABLE_INSTALLED);
                break;
-       case DP_INSTALL_FAILURE:
+       case ZEBRA_DPLANE_INSTALL_FAILURE:
                zsend_iptable_notify_owner(iptable, ZAPI_IPTABLE_FAIL_INSTALL);
                break;
-       case DP_DELETE_SUCCESS:
+       case ZEBRA_DPLANE_DELETE_SUCCESS:
                zsend_iptable_notify_owner(iptable,
                                           ZAPI_IPTABLE_REMOVED);
                break;
-       case DP_DELETE_FAILURE:
+       case ZEBRA_DPLANE_DELETE_FAILURE:
                zsend_iptable_notify_owner(iptable,
                                           ZAPI_IPTABLE_FAIL_REMOVE);
                break;
+       case ZEBRA_DPLANE_STATUS_NONE:
+               break;
        }
 }
 
index 12c712e4cd995e0006660638c0c54ad658d1d88f..3311af4d2644eb7171b51b993f852835fc2119b7 100644 (file)
@@ -175,12 +175,12 @@ void zebra_pbr_del_iptable(struct zebra_ns *zns,
  * forwarding plane may not coincide, hence the API requires a separate
  * rule priority - maps to preference/FRA_PRIORITY on Linux.
  */
-extern enum dp_req_result kernel_add_pbr_rule(struct zebra_pbr_rule *rule);
+extern enum zebra_dplane_result kernel_add_pbr_rule(struct zebra_pbr_rule *rule);
 
 /*
  * Uninstall specified rule for a specific interface.
  */
-extern enum dp_req_result kernel_del_pbr_rule(struct zebra_pbr_rule *rule);
+extern enum zebra_dplane_result kernel_del_pbr_rule(struct zebra_pbr_rule *rule);
 
 /*
  * Get to know existing PBR rules in the kernel - typically called at startup.
@@ -191,20 +191,20 @@ extern void kernel_read_pbr_rules(struct zebra_ns *zns);
  * Handle success or failure of rule (un)install in the kernel.
  */
 extern void kernel_pbr_rule_add_del_status(struct zebra_pbr_rule *rule,
-                                          enum dp_results res);
+                                          enum zebra_dplane_status res);
 
 /*
  * Handle success or failure of ipset kinds (un)install in the kernel.
  */
 extern void kernel_pbr_ipset_add_del_status(struct zebra_pbr_ipset *ipset,
-                                          enum dp_results res);
+                                          enum zebra_dplane_status res);
 
 extern void kernel_pbr_ipset_entry_add_del_status(
                                struct zebra_pbr_ipset_entry *ipset,
-                               enum dp_results res);
+                               enum zebra_dplane_status res);
 
 extern void kernel_pbr_iptable_add_del_status(struct zebra_pbr_iptable *iptable,
-                             enum dp_results res);
+                             enum zebra_dplane_status res);
 
 /*
  * Handle rule delete notification from kernel.
index bb79f96327b48b93ed4d6a9182258b328a80afdb..a8f34935475c5fab8787d8cd7aa0b38c8738cb5c 100644 (file)
@@ -1060,7 +1060,7 @@ int zebra_rib_labeled_unicast(struct route_entry *re)
 
 void kernel_route_rib_pass_fail(struct route_node *rn, const struct prefix *p,
                                struct route_entry *re,
-                               enum dp_results res)
+                               enum zebra_dplane_status res)
 {
        struct nexthop *nexthop;
        char buf[PREFIX_STRLEN];
@@ -1069,7 +1069,7 @@ void kernel_route_rib_pass_fail(struct route_node *rn, const struct prefix *p,
        dest = rib_dest_from_rnode(rn);
 
        switch (res) {
-       case DP_INSTALL_SUCCESS:
+       case ZEBRA_DPLANE_INSTALL_SUCCESS:
                dest->selected_fib = re;
                for (ALL_NEXTHOPS(re->ng, nexthop)) {
                        if (CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
@@ -1082,7 +1082,7 @@ void kernel_route_rib_pass_fail(struct route_node *rn, const struct prefix *p,
                }
                zsend_route_notify_owner(re, p, ZAPI_ROUTE_INSTALLED);
                break;
-       case DP_INSTALL_FAILURE:
+       case ZEBRA_DPLANE_INSTALL_FAILURE:
                /*
                 * I am not sure this is the right thing to do here
                 * but the code always set selected_fib before
@@ -1095,7 +1095,7 @@ void kernel_route_rib_pass_fail(struct route_node *rn, const struct prefix *p,
                         "%u:%s: Route install failed", re->vrf_id,
                         prefix2str(p, buf, sizeof(buf)));
                break;
-       case DP_DELETE_SUCCESS:
+       case ZEBRA_DPLANE_DELETE_SUCCESS:
                /*
                 * The case where selected_fib is not re is
                 * when we have received a system route
@@ -1110,7 +1110,7 @@ void kernel_route_rib_pass_fail(struct route_node *rn, const struct prefix *p,
 
                zsend_route_notify_owner(re, p, ZAPI_ROUTE_REMOVED);
                break;
-       case DP_DELETE_FAILURE:
+       case ZEBRA_DPLANE_DELETE_FAILURE:
                /*
                 * Should we set this to NULL if the
                 * delete fails?
@@ -1122,6 +1122,8 @@ void kernel_route_rib_pass_fail(struct route_node *rn, const struct prefix *p,
 
                zsend_route_notify_owner(re, p, ZAPI_ROUTE_REMOVE_FAIL);
                break;
+       case ZEBRA_DPLANE_STATUS_NONE:
+               break;
        }
 }
 
@@ -1172,17 +1174,17 @@ void rib_install_kernel(struct route_node *rn, struct route_entry *re,
         */
        hook_call(rib_update, rn, "installing in kernel");
        switch (kernel_route_rib(rn, p, src_p, old, re)) {
-       case DP_REQUEST_QUEUED:
+       case ZEBRA_DPLANE_REQUEST_QUEUED:
                flog_err(
                        EC_ZEBRA_DP_INVALID_RC,
                        "No current known DataPlane interfaces can return this, please fix");
                break;
-       case DP_REQUEST_FAILURE:
+       case ZEBRA_DPLANE_REQUEST_FAILURE:
                flog_err(
                        EC_ZEBRA_DP_INSTALL_FAIL,
                        "No current known Rib Install Failure cases, please fix");
                break;
-       case DP_REQUEST_SUCCESS:
+       case ZEBRA_DPLANE_REQUEST_SUCCESS:
                zvrf->installs++;
                break;
        }
@@ -1212,17 +1214,17 @@ void rib_uninstall_kernel(struct route_node *rn, struct route_entry *re)
         */
        hook_call(rib_update, rn, "uninstalling from kernel");
        switch (kernel_route_rib(rn, p, src_p, re, NULL)) {
-       case DP_REQUEST_QUEUED:
+       case ZEBRA_DPLANE_REQUEST_QUEUED:
                flog_err(
                        EC_ZEBRA_DP_INVALID_RC,
                        "No current known DataPlane interfaces can return this, please fix");
                break;
-       case DP_REQUEST_FAILURE:
+       case ZEBRA_DPLANE_REQUEST_FAILURE:
                flog_err(
                        EC_ZEBRA_DP_INSTALL_FAIL,
                        "No current known RIB Install Failure cases, please fix");
                break;
-       case DP_REQUEST_SUCCESS:
+       case ZEBRA_DPLANE_REQUEST_SUCCESS:
                if (zvrf)
                        zvrf->removals++;
                break;