]> git.proxmox.com Git - mirror_frr.git/blobdiff - vrrpd/vrrp_zebra.c
Merge pull request #5793 from ton31337/fix/formatting_show_bgp_summary_failed
[mirror_frr.git] / vrrpd / vrrp_zebra.c
index c15c250bdf0d9188c50fd6919d697718fdcb1e2a..000672a0803f8002b1b2b2962d21b32e4e38c17b 100644 (file)
@@ -38,9 +38,11 @@ static void vrrp_zebra_debug_if_state(struct interface *ifp, vrf_id_t vrf_id,
                                      const char *func)
 {
        DEBUGD(&vrrp_dbg_zebra,
-              "%s: %s index %d(%u) flags %ld metric %d mtu %d operative %d",
-              func, ifp->name, ifp->ifindex, vrf_id, (long)ifp->flags,
-              ifp->metric, ifp->mtu, if_is_operative(ifp));
+              "%s: %s index %d(%u) parent %d mac %02x:%02x:%02x:%02x:%02x:%02x flags %ld metric %d mtu %d operative %d",
+              func, ifp->name, vrf_id, ifp->link_ifindex, ifp->ifindex,
+              ifp->hw_addr[0], ifp->hw_addr[1], ifp->hw_addr[2],
+              ifp->hw_addr[3], ifp->hw_addr[4], ifp->hw_addr[5],
+              (long)ifp->flags, ifp->metric, ifp->mtu, if_is_operative(ifp));
 }
 
 static void vrrp_zebra_debug_if_dump_address(struct interface *ifp,
@@ -78,81 +80,36 @@ static int vrrp_router_id_update_zebra(int command, struct zclient *zclient,
        return 0;
 }
 
-static int vrrp_zebra_if_add(int command, struct zclient *zclient,
-                            zebra_size_t length, vrf_id_t vrf_id)
+int vrrp_ifp_create(struct interface *ifp)
 {
-       struct interface *ifp;
-
-       /*
-        * zebra api adds/dels interfaces using the same call
-        * interface_add_read below, see comments in lib/zclient.c
-        */
-       ifp = zebra_interface_add_read(zclient->ibuf, vrf_id);
-
-       if (!ifp)
-               return 0;
-
-       vrrp_zebra_debug_if_state(ifp, vrf_id, __func__);
+       vrrp_zebra_debug_if_state(ifp, ifp->vrf_id, __func__);
 
        vrrp_if_add(ifp);
 
        return 0;
 }
 
-static int vrrp_zebra_if_del(int command, struct zclient *zclient,
-                            zebra_size_t length, vrf_id_t vrf_id)
+int vrrp_ifp_destroy(struct interface *ifp)
 {
-       struct interface *ifp;
-
-       ifp = zebra_interface_state_read(zclient->ibuf, vrf_id);
-
-       if (!ifp)
-               return 0;
-
-       vrrp_zebra_debug_if_state(ifp, vrf_id, __func__);
+       vrrp_zebra_debug_if_state(ifp, ifp->vrf_id, __func__);
 
        vrrp_if_del(ifp);
 
        return 0;
 }
 
-static int vrrp_zebra_if_state_up(int command, struct zclient *zclient,
-                                 zebra_size_t length, vrf_id_t vrf_id)
+int vrrp_ifp_up(struct interface *ifp)
 {
-       struct interface *ifp;
-
-       /*
-        * zebra api notifies interface up/down events by using the same call
-        * zebra_interface_state_read below, see comments in lib/zclient.c ifp =
-        * zebra_interface_state_read(zclient->ibuf, vrf_id);
-        */
-       ifp = zebra_interface_state_read(zclient->ibuf, vrf_id);
-
-       if (!ifp)
-               return 0;
-
-       vrrp_zebra_debug_if_state(ifp, vrf_id, __func__);
+       vrrp_zebra_debug_if_state(ifp, ifp->vrf_id, __func__);
 
        vrrp_if_up(ifp);
 
        return 0;
 }
 
-static int vrrp_zebra_if_state_down(int command, struct zclient *zclient,
-                                   zebra_size_t length, vrf_id_t vrf_id)
+int vrrp_ifp_down(struct interface *ifp)
 {
-       struct interface *ifp;
-
-       /*
-        * zebra api notifies interface up/down events by using the same call
-        * zebra_interface_state_read below, see comments in lib/zclient.c
-        */
-       ifp = zebra_interface_state_read(zclient->ibuf, vrf_id);
-
-       if (!ifp)
-               return 0;
-
-       vrrp_zebra_debug_if_state(ifp, vrf_id, __func__);
+       vrrp_zebra_debug_if_state(ifp, ifp->vrf_id, __func__);
 
        vrrp_if_down(ifp);
 
@@ -208,8 +165,6 @@ static int vrrp_zebra_if_address_del(int command, struct zclient *client,
 
        vrrp_if_address_del(c->ifp);
 
-       if_set_index(c->ifp, IFINDEX_INTERNAL);
-
        return 0;
 }
 
@@ -220,7 +175,7 @@ void vrrp_zebra_radv_set(struct vrrp_router *r, bool enable)
               "Requesting Zebra to turn router advertisements %s for %s",
               r->vr->vrid, enable ? "on" : "off", r->mvl_ifp->name);
 
-       zclient_send_interface_radv_req(zclient, VRF_DEFAULT, r->mvl_ifp,
+       zclient_send_interface_radv_req(zclient, r->mvl_ifp->vrf_id, r->mvl_ifp,
                                        enable, VRRP_RADV_INT);
 }
 
@@ -230,21 +185,20 @@ int vrrp_zclient_send_interface_protodown(struct interface *ifp, bool down)
               VRRP_LOGPFX "Requesting Zebra to set %s protodown %s", ifp->name,
               down ? "on" : "off");
 
-       return zclient_send_interface_protodown(zclient, VRF_DEFAULT, ifp,
+       return zclient_send_interface_protodown(zclient, ifp->vrf_id, ifp,
                                                down);
 }
 
 void vrrp_zebra_init(void)
 {
+       if_zapi_callbacks(vrrp_ifp_create, vrrp_ifp_up,
+                         vrrp_ifp_down, vrrp_ifp_destroy);
+
        /* Socket for receiving updates from Zebra daemon */
        zclient = zclient_new(master, &zclient_options_default);
 
        zclient->zebra_connected = vrrp_zebra_connected;
        zclient->router_id_update = vrrp_router_id_update_zebra;
-       zclient->interface_add = vrrp_zebra_if_add;
-       zclient->interface_delete = vrrp_zebra_if_del;
-       zclient->interface_up = vrrp_zebra_if_state_up;
-       zclient->interface_down = vrrp_zebra_if_state_down;
        zclient->interface_address_add = vrrp_zebra_if_address_add;
        zclient->interface_address_delete = vrrp_zebra_if_address_del;