]> git.proxmox.com Git - mirror_frr.git/commitdiff
zebra: keep rtadv_sock field in zrouter for optimisation
authorPhilippe Guibert <philippe.guibert@6wind.com>
Wed, 27 Mar 2019 14:05:58 +0000 (15:05 +0100)
committerPhilippe Guibert <philippe.guibert@6wind.com>
Thu, 25 Apr 2019 12:23:34 +0000 (14:23 +0200)
in the case the vrf backend is vrf-lite, there is no need to have
separate sockets. use a socket located in zrouter, so that when needing
the socket, a common API is used. that API will return the appropriate
socket value.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
zebra/rtadv.c
zebra/zebra_router.h

index 80ee112a85ae554b75ed9a70423920ccb4a06f41..817c65bf28730d9ccad04f12f54ddd2baaacbf3d 100644 (file)
@@ -85,6 +85,13 @@ static void rtadv_event(struct zebra_vrf *, enum rtadv_event, int);
 static int if_join_all_router(int, struct interface *);
 static int if_leave_all_router(int, struct interface *);
 
+static int rtadv_get_socket(struct zebra_vrf *zvrf)
+{
+       if (zvrf->rtadv.sock >= 0)
+               return zvrf->rtadv.sock;
+       return zrouter.rtadv_sock;
+}
+
 static int rtadv_increment_received(struct zebra_vrf *zvrf, ifindex_t *ifindex)
 {
        int ret = -1;
@@ -499,7 +506,7 @@ static int rtadv_timer(struct thread *thread)
                                                        "Fast RA Rexmit on interface %s",
                                                        ifp->name);
 
-                                       rtadv_send_packet(zvrf->rtadv.sock,
+                                       rtadv_send_packet(rtadv_get_socket(zvrf),
                                                          ifp);
                                } else {
                                        zif->rtadv.AdvIntervalTimer -= period;
@@ -513,8 +520,8 @@ static int rtadv_timer(struct thread *thread)
                                                        zif->rtadv
                                                                .MaxRtrAdvInterval;
                                                rtadv_send_packet(
-                                                       zvrf->rtadv.sock,
-                                                       ifp);
+                                                         rtadv_get_socket(zvrf),
+                                                         ifp);
                                        }
                                }
                        }
@@ -528,7 +535,7 @@ static void rtadv_process_solicit(struct interface *ifp)
        struct zebra_vrf *zvrf = vrf_info_lookup(ifp->vrf_id);
 
        assert(zvrf);
-       rtadv_send_packet(zvrf->rtadv.sock, ifp);
+       rtadv_send_packet(rtadv_get_socket(zvrf), ifp);
 }
 
 /*
@@ -884,7 +891,7 @@ static void ipv6_nd_suppress_ra_set(struct interface *ifp,
                        zif->rtadv.AdvIntervalTimer = 0;
                        zvrf->rtadv.adv_if_count--;
 
-                       if_leave_all_router(zvrf->rtadv.sock, ifp);
+                       if_leave_all_router(rtadv_get_socket(zvrf), ifp);
 
                        if (zvrf->rtadv.adv_if_count == 0)
                                rtadv_event(zvrf, RTADV_STOP, 0);
@@ -903,11 +910,11 @@ static void ipv6_nd_suppress_ra_set(struct interface *ifp,
                                        RTADV_NUM_FAST_REXMITS;
                        }
 
-                       if_join_all_router(zvrf->rtadv.sock, ifp);
+                       if_join_all_router(rtadv_get_socket(zvrf), ifp);
 
                        if (zvrf->rtadv.adv_if_count == 1)
                                rtadv_event(zvrf, RTADV_START,
-                                           zvrf->rtadv.sock);
+                                           rtadv_get_socket(zvrf));
                }
        }
 }
@@ -2140,7 +2147,13 @@ static void rtadv_event(struct zebra_vrf *zvrf, enum rtadv_event event, int val)
 
 void rtadv_init(struct zebra_vrf *zvrf)
 {
-       zvrf->rtadv.sock = rtadv_make_socket(zvrf->zns->ns_id);
+       if (vrf_is_backend_netns()) {
+               zvrf->rtadv.sock = rtadv_make_socket(zvrf->zns->ns_id);
+               zrouter.rtadv_sock = -1;
+       } else if (!zrouter.rtadv_sock) {
+               zvrf->rtadv.sock = -1;
+               zrouter.rtadv_sock = rtadv_make_socket(zvrf->zns->ns_id);
+       }
 }
 
 void rtadv_terminate(struct zebra_vrf *zvrf)
@@ -2149,8 +2162,10 @@ void rtadv_terminate(struct zebra_vrf *zvrf)
        if (zvrf->rtadv.sock >= 0) {
                close(zvrf->rtadv.sock);
                zvrf->rtadv.sock = -1;
+       } else if (zrouter.rtadv_sock >= 0) {
+               close(zrouter.rtadv_sock);
+               zrouter.rtadv_sock = -1;
        }
-
        zvrf->rtadv.adv_if_count = 0;
        zvrf->rtadv.adv_msec_if_count = 0;
 }
index 38c37d698f49147e7087aa42d51bb3384605cd04..b6e4b5c7260b05fdba6d100191ad23d74ddf3bb8 100644 (file)
@@ -82,6 +82,9 @@ struct zebra_router {
 
        struct hash *iptable_hash;
 
+       /* used if vrf backend is not network namespace */
+       int rtadv_sock;
+
        /* A sequence number used for tracking routes */
        _Atomic uint32_t sequence_num;