]> git.puffer.fish Git - matthieu/frr.git/commitdiff
*: Modify zclient_init to require privs data
authorDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 11 Oct 2017 14:37:20 +0000 (10:37 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Mon, 23 Oct 2017 22:12:29 +0000 (18:12 -0400)
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
16 files changed:
babeld/babel_zebra.c
bgpd/bgp_zebra.c
bgpd/rfapi/vnc_zebra.c
eigrpd/eigrp_zebra.c
isisd/isis_zebra.c
ldpd/lde.c
ldpd/ldp_zebra.c
lib/zclient.c
lib/zclient.h
nhrpd/nhrp_route.c
ospf6d/ospf6_zebra.c
ospfd/ospf_zebra.c
pimd/pim_zebra.c
pimd/pim_zlookup.c
ripd/rip_zebra.c
ripngd/ripng_zebra.c

index 337b7b3927163e40a52e998aa6484b302b9188d0..e7c27e8e21f3dbbf8363eac7c67e0c5b085650b1 100644 (file)
@@ -238,7 +238,7 @@ babel_zebra_connected (struct zclient *zclient)
 void babelz_zebra_init(void)
 {
     zclient = zclient_new(master);
-    zclient_init(zclient, ZEBRA_ROUTE_BABEL, 0);
+    zclient_init(zclient, ZEBRA_ROUTE_BABEL, 0, &babeld_privs);
 
     zclient->zebra_connected = babel_zebra_connected;
     zclient->interface_add = babel_interface_add;
index ddf461f1b183bc93658c0267b2992ca540f501b7..ed162cb7dc23efb4523ee8bd05ed48d5b4b2c39e 100644 (file)
@@ -1749,13 +1749,15 @@ static int bgp_zebra_process_local_macip(int command, struct zclient *zclient,
                return bgp_evpn_local_macip_del(bgp, vni, &mac, &ip);
 }
 
+extern struct zebra_privs_t bgpd_privs;
+
 void bgp_zebra_init(struct thread_master *master)
 {
        zclient_num_connects = 0;
 
        /* Set default values. */
        zclient = zclient_new(master);
-       zclient_init(zclient, ZEBRA_ROUTE_BGP, 0);
+       zclient_init(zclient, ZEBRA_ROUTE_BGP, 0, &bgpd_privs);
        zclient->zebra_connected = bgp_zebra_connected;
        zclient->router_id_update = bgp_router_id_update;
        zclient->interface_add = bgp_interface_add;
index b8058cf1e5eff4a3a33c113aee13bb69840ba488..478d3b5ac7669a9893fd90df6c91ccaffd032f90 100644 (file)
@@ -883,6 +883,7 @@ int vnc_redistribute_unset(struct bgp *bgp, afi_t afi, int type)
        return CMD_SUCCESS;
 }
 
+extern struct zebra_privs_t bgpd_privs;
 
 /*
  * Modeled after bgp_zebra.c'bgp_zebra_init()
@@ -892,7 +893,7 @@ void vnc_zebra_init(struct thread_master *master)
 {
        /* Set default values. */
        zclient_vnc = zclient_new(master);
-       zclient_init(zclient_vnc, ZEBRA_ROUTE_VNC, 0);
+       zclient_init(zclient_vnc, ZEBRA_ROUTE_VNC, 0, &bgpd_privs);
 
        zclient_vnc->redistribute_route_add = vnc_zebra_read_route;
        zclient_vnc->redistribute_route_del = vnc_zebra_read_route;
index 28d2f298119a712331ba570f3b642694eb8fcb75..9076a50f57dfdcab97085f6b03975c7d2134c33e 100644 (file)
@@ -103,7 +103,7 @@ void eigrp_zebra_init(void)
 {
        zclient = zclient_new(master);
 
-       zclient_init(zclient, ZEBRA_ROUTE_EIGRP, 0);
+       zclient_init(zclient, ZEBRA_ROUTE_EIGRP, 0, &eigrpd_privs);
        zclient->zebra_connected = eigrp_zebra_connected;
        zclient->router_id_update = eigrp_router_id_update_zebra;
        zclient->interface_add = eigrp_interface_add;
index 387f99938e07646d14c05f5260dd3490b9c1b814..c186dd56ad367cda2b922baa44ed70dca6d96c74 100644 (file)
@@ -412,7 +412,7 @@ static void isis_zebra_connected(struct zclient *zclient)
 void isis_zebra_init(struct thread_master *master)
 {
        zclient = zclient_new(master);
-       zclient_init(zclient, ZEBRA_ROUTE_ISIS, 0);
+       zclient_init(zclient, ZEBRA_ROUTE_ISIS, 0, &isisd_privs);
        zclient->zebra_connected = isis_zebra_connected;
        zclient->router_id_update = isis_router_id_update_zebra;
        zclient->interface_add = isis_zebra_if_add;
index a7f933bbe56e597a4a98df2c99072c523d2c5fde..8122b88cca3b1186288c35bfd87dc9d54a78468f 100644 (file)
@@ -77,7 +77,7 @@ struct thread_master *master;
 /* lde privileges */
 static zebra_capabilities_t _caps_p [] =
 {
-       /* none */
+       ZCAP_NET_ADMIN
 };
 
 static struct zebra_privs_t lde_privs =
@@ -1622,6 +1622,8 @@ zclient_sync_init(u_short instance)
        zclient_sync->sock = -1;
        zclient_sync->redist_default = ZEBRA_ROUTE_LDP;
        zclient_sync->instance = instance;
+       zclient_sync->privs = &lde_privs;
+
        while (zclient_socket_connect(zclient_sync) < 0) {
                log_warnx("Error connecting synchronous zclient!");
                sleep(1);
index 7f68f0b69438df54476d70d56f4d24fa9027226f..8fe51cb9d18f03175bd98ae9bd0dcec2e01720b7 100644 (file)
@@ -507,12 +507,14 @@ ldp_zebra_connected(struct zclient *zclient)
            ZEBRA_ROUTE_ALL, 0, VRF_DEFAULT);
 }
 
+extern struct zebra_privs_t ldpd_privs;
+
 void
 ldp_zebra_init(struct thread_master *master)
 {
        /* Set default values. */
        zclient = zclient_new(master);
-       zclient_init(zclient, ZEBRA_ROUTE_LDP, 0);
+       zclient_init(zclient, ZEBRA_ROUTE_LDP, 0, &ldpd_privs);
 
        /* set callbacks */
        zclient->zebra_connected = ldp_zebra_connected;
index ad5c30584c122671e1032c4275b61ef8b480d1f7..d23e5fbd796ae77b1d5a868b6aba36eb6f8ddb81 100644 (file)
@@ -35,6 +35,7 @@
 #include "table.h"
 #include "nexthop.h"
 #include "mpls.h"
+#include "sockopt.h"
 
 DEFINE_MTYPE_STATIC(LIB, ZCLIENT, "Zclient")
 DEFINE_MTYPE_STATIC(LIB, REDIST_INST, "Redistribution instance IDs")
@@ -180,7 +181,8 @@ void zclient_reset(struct zclient *zclient)
                        &zclient->mi_redist[afi][zclient->redist_default],
                        zclient->instance);
 
-       zclient_init(zclient, zclient->redist_default, zclient->instance);
+       zclient_init(zclient, zclient->redist_default,
+                    zclient->instance, zclient->privs);
 }
 
 /**
@@ -202,6 +204,10 @@ int zclient_socket_connect(struct zclient *zclient)
 
        set_cloexec(sock);
 
+       zclient->privs->change(ZPRIVS_RAISE);
+       setsockopt_so_sendbuf(sock, 1048576);
+       zclient->privs->change(ZPRIVS_LOWER);
+
        /* Connect to zebra. */
        ret = connect(sock, (struct sockaddr *)&zclient_addr,
                        zclient_addr_len);
@@ -543,12 +549,14 @@ int zclient_start(struct zclient *zclient)
 
 /* Initialize zebra client.  Argument redist_default is unwanted
    redistribute route type. */
-void zclient_init(struct zclient *zclient, int redist_default, u_short instance)
+void zclient_init(struct zclient *zclient, int redist_default,
+                 u_short instance, struct zebra_privs_t *privs)
 {
        int afi, i;
 
        /* Set -1 to the default socket value. */
        zclient->sock = -1;
+       zclient->privs = privs;
 
        /* Clear redistribution flags. */
        for (afi = AFI_IP; afi < AFI_MAX; afi++)
index 288951eb1aff47de97a40daa7296bc2f964fc18e..23fe0e41f406a306f06900a4c6ed3381d003d4b7 100644 (file)
@@ -134,6 +134,9 @@ struct zclient {
        /* The thread master we schedule ourselves on */
        struct thread_master *master;
 
+       /* Priviledges to change socket values */
+       struct zebra_privs_t *privs;
+
        /* Socket to zebra daemon. */
        int sock;
 
@@ -315,7 +318,7 @@ struct zapi_pw_status {
 
 /* Prototypes of zebra client service functions. */
 extern struct zclient *zclient_new(struct thread_master *);
-extern void zclient_init(struct zclient *, int, u_short);
+extern void zclient_init(struct zclient *, int, u_short, struct zebra_privs_t *privs);
 extern int zclient_start(struct zclient *);
 extern void zclient_stop(struct zclient *);
 extern void zclient_reset(struct zclient *);
index 495e226f1516c71ba7771f06341b4338d9ff9bf1..7701dcbb88eae5d3054c867aa1646e35b1822798 100644 (file)
@@ -325,7 +325,7 @@ void nhrp_zebra_init(void)
        zclient->redistribute_route_add = nhrp_route_read;
        zclient->redistribute_route_del = nhrp_route_read;
 
-       zclient_init(zclient, ZEBRA_ROUTE_NHRP, 0);
+       zclient_init(zclient, ZEBRA_ROUTE_NHRP, 0, &nhrpd_privs);
 }
 
 void nhrp_zebra_terminate(void)
index b032bd7a791c7429d07706fd67d18a3cfd4d1ee2..022b913168b5b63f04bbebf8470a39226f208233 100644 (file)
@@ -584,7 +584,7 @@ void ospf6_zebra_init(struct thread_master *master)
 {
        /* Allocate zebra structure. */
        zclient = zclient_new(master);
-       zclient_init(zclient, ZEBRA_ROUTE_OSPF6, 0);
+       zclient_init(zclient, ZEBRA_ROUTE_OSPF6, 0, &ospf6d_privs);
        zclient->zebra_connected = ospf6_zebra_connected;
        zclient->router_id_update = ospf6_router_id_update_zebra;
        zclient->interface_add = ospf6_zebra_if_add;
index 7e6146e0d38043664e833385ffe1c9b524a784df..76fa6fa6dd76980b34d7658c5b4838a2fa08ccc0 100644 (file)
@@ -1472,7 +1472,7 @@ void ospf_zebra_init(struct thread_master *master, u_short instance)
 {
        /* Allocate zebra structure. */
        zclient = zclient_new(master);
-       zclient_init(zclient, ZEBRA_ROUTE_OSPF, instance);
+       zclient_init(zclient, ZEBRA_ROUTE_OSPF, instance, &ospfd_privs);
        zclient->zebra_connected = ospf_zebra_connected;
        zclient->router_id_update = ospf_router_id_update_zebra;
        zclient->interface_add = ospf_interface_add;
index db11e5f17119c5072aa91e2fe3301d671a824531..8c90ccbed16cd51c658457435bdab6097a0c57c4 100644 (file)
@@ -753,7 +753,7 @@ void pim_zebra_init(void)
        zclient->interface_address_delete = pim_zebra_if_address_del;
        zclient->nexthop_update = pim_parse_nexthop_update;
 
-       zclient_init(zclient, ZEBRA_ROUTE_PIM, 0);
+       zclient_init(zclient, ZEBRA_ROUTE_PIM, 0, &pimd_privs);
        if (PIM_DEBUG_PIM_TRACE) {
                zlog_info("zclient_init cleared redistribution request");
        }
index df8ad4e428c1a5e0789f9cd61018a5f3e54d6206..fd75a699b3bbdcddaeb531acdc4b6de999bf8ce8 100644 (file)
@@ -128,6 +128,7 @@ void zclient_lookup_new(void)
 
        zlookup->sock = -1;
        zlookup->t_connect = NULL;
+       zlookup->privs = &pimd_privs;
 
        zclient_lookup_sched_now(zlookup);
 
index 28144a24351dd2aaf83233d949fb8e14f9bb22ea..3772f6223e66e7258b4cf42f0710ba3354dbf7a8 100644 (file)
@@ -586,7 +586,7 @@ void rip_zclient_init(struct thread_master *master)
 {
        /* Set default value to the zebra client structure. */
        zclient = zclient_new(master);
-       zclient_init(zclient, ZEBRA_ROUTE_RIP, 0);
+       zclient_init(zclient, ZEBRA_ROUTE_RIP, 0, &ripd_privs);
        zclient->zebra_connected = rip_zebra_connected;
        zclient->interface_add = rip_interface_add;
        zclient->interface_delete = rip_interface_delete;
index 7edaaa5dff6d165371f079412130c9da5e6f4167..084d58ee53927c3e3d9e2b510f1ed1cd51a6e56c 100644 (file)
@@ -414,7 +414,7 @@ void zebra_init(struct thread_master *master)
 {
        /* Allocate zebra structure. */
        zclient = zclient_new(master);
-       zclient_init(zclient, ZEBRA_ROUTE_RIPNG, 0);
+       zclient_init(zclient, ZEBRA_ROUTE_RIPNG, 0, &ripngd_privs);
 
        zclient->zebra_connected = ripng_zebra_connected;
        zclient->interface_up = ripng_interface_up;