Skip to content

Commit b2e1ccb

Browse files
authored
Merge pull request #2333 from pacovn/dev/5.0
bgpd label manager support fixes
2 parents f892702 + e73380c commit b2e1ccb

File tree

14 files changed

+65
-62
lines changed

14 files changed

+65
-62
lines changed

bgpd/bgp_labelpool.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,7 @@ void bgp_lp_event_zebra_up(void)
530530
int chunks_needed;
531531
void *labelid;
532532
struct lp_lcb *lcb;
533+
int lm_init_ok;
533534

534535
/*
535536
* Get label chunk allocation request dispatched to zebra
@@ -541,6 +542,11 @@ void bgp_lp_event_zebra_up(void)
541542
chunks_needed = (labels_needed / LP_CHUNK_SIZE) + 1;
542543
labels_needed = chunks_needed * LP_CHUNK_SIZE;
543544

545+
lm_init_ok = lm_label_manager_connect(zclient, 1) == 0;
546+
547+
if (!lm_init_ok)
548+
zlog_err("%s: label manager connection error", __func__);
549+
544550
zclient_send_get_label_chunk(zclient, 0, labels_needed);
545551
lp->pending_count = labels_needed;
546552

bgpd/bgp_main.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ static const struct option longopts[] = {
7272
{"no_kernel", no_argument, NULL, 'n'},
7373
{"skip_runas", no_argument, NULL, 'S'},
7474
{"ecmp", required_argument, NULL, 'e'},
75+
{"int_num", required_argument, NULL, 'I'},
7576
{0}};
7677

7778
/* signal definitions */
@@ -333,16 +334,18 @@ int main(int argc, char **argv)
333334
char *bgp_address = NULL;
334335
int no_fib_flag = 0;
335336
int skip_runas = 0;
337+
int instance = 0;
336338

337339
frr_preinit(&bgpd_di, argc, argv);
338340
frr_opt_add(
339-
"p:l:rSne:", longopts,
341+
"p:l:rSne:I:", longopts,
340342
" -p, --bgp_port Set BGP listen port number (0 means do not listen).\n"
341343
" -l, --listenon Listen on specified address (implies -n)\n"
342344
" -r, --retain When program terminates, retain added route by bgpd.\n"
343345
" -n, --no_kernel Do not install route to kernel.\n"
344346
" -S, --skip_runas Skip capabilities checks, and changing user and group IDs.\n"
345-
" -e, --ecmp Specify ECMP to use.\n");
347+
" -e, --ecmp Specify ECMP to use.\n"
348+
" -I, --int_num Set instance number (label-manager)\n");
346349

347350
/* Command line argument treatment. */
348351
while (1) {
@@ -384,6 +387,12 @@ int main(int argc, char **argv)
384387
case 'S':
385388
skip_runas = 1;
386389
break;
390+
case 'I':
391+
instance = atoi(optarg);
392+
if (instance > (unsigned short)-1)
393+
zlog_err("Instance %i out of range (0..%u)",
394+
instance, (unsigned short)-1);
395+
break;
387396
default:
388397
frr_help_exit(1);
389398
break;
@@ -405,7 +414,7 @@ int main(int argc, char **argv)
405414
bgp_vrf_init();
406415

407416
/* BGP related initialization. */
408-
bgp_init();
417+
bgp_init((unsigned short)instance);
409418

410419
snprintf(bgpd_di.startinfo, sizeof(bgpd_di.startinfo), ", bgp@%s:%d",
411420
(bm->address ? bm->address : "<all>"), bm->port);

bgpd/bgp_zebra.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2474,7 +2474,7 @@ static void bgp_zebra_process_label_chunk(
24742474

24752475
extern struct zebra_privs_t bgpd_privs;
24762476

2477-
void bgp_zebra_init(struct thread_master *master)
2477+
void bgp_zebra_init(struct thread_master *master, unsigned short instance)
24782478
{
24792479
zclient_num_connects = 0;
24802480

@@ -2511,6 +2511,7 @@ void bgp_zebra_init(struct thread_master *master)
25112511
zclient->ipset_notify_owner = ipset_notify_owner;
25122512
zclient->ipset_entry_notify_owner = ipset_entry_notify_owner;
25132513
zclient->iptable_notify_owner = iptable_notify_owner;
2514+
zclient->instance = instance;
25142515
}
25152516

25162517
void bgp_zebra_destroy(void)

bgpd/bgp_zebra.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@
2323

2424
#include "vxlan.h"
2525

26-
extern void bgp_zebra_init(struct thread_master *master);
26+
extern void bgp_zebra_init(struct thread_master *master,
27+
unsigned short instance);
2728
extern void bgp_zebra_init_tm_connect(struct bgp *bgp);
2829
extern uint32_t bgp_zebra_tm_get_id(void);
2930
extern bool bgp_zebra_tm_chunk_obtained(void);

bgpd/bgpd.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7629,7 +7629,7 @@ void bgp_pthreads_finish()
76297629
frr_pthread_finish();
76307630
}
76317631

7632-
void bgp_init(void)
7632+
void bgp_init(unsigned short instance)
76337633
{
76347634

76357635
/* allocates some vital data structures used by peer commands in
@@ -7639,7 +7639,7 @@ void bgp_init(void)
76397639
bgp_pthreads_init();
76407640

76417641
/* Init zebra. */
7642-
bgp_zebra_init(bm->master);
7642+
bgp_zebra_init(bm->master, instance);
76437643

76447644
#if ENABLE_BGP_VNC
76457645
vnc_zebra_init(bm->master);

bgpd/bgpd.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1411,7 +1411,7 @@ extern int bgp_config_write(struct vty *);
14111411

14121412
extern void bgp_master_init(struct thread_master *master);
14131413

1414-
extern void bgp_init(void);
1414+
extern void bgp_init(unsigned short instance);
14151415
extern void bgp_pthreads_run(void);
14161416
extern void bgp_pthreads_finish(void);
14171417
extern void bgp_route_map_init(void);

doc/manpages/bgpd.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@ OPTIONS available for the |DAEMON| command:
2121

2222
.. include:: common-options.rst
2323

24+
LABEL MANAGER
25+
-------------
26+
27+
.. option:: -I, --int_num
28+
29+
Set zclient id. This is required when using Zebra label manager in proxy mode.
30+
2431
FILES
2532
=====
2633

ldpd/lde.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1643,7 +1643,7 @@ static void zclient_sync_init(unsigned short instance)
16431643
sock_set_nonblock(zclient_sync->sock);
16441644

16451645
/* Connect to label manager */
1646-
while (lm_label_manager_connect(zclient_sync) != 0) {
1646+
while (lm_label_manager_connect(zclient_sync, 0) != 0) {
16471647
log_warnx("Error connecting to label manager!");
16481648
sleep(1);
16491649
}

lib/log.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -940,6 +940,7 @@ static const struct zebra_desc_table command_types[] = {
940940
DESC_ENTRY(ZEBRA_MPLS_LABELS_DELETE),
941941
DESC_ENTRY(ZEBRA_IPMR_ROUTE_STATS),
942942
DESC_ENTRY(ZEBRA_LABEL_MANAGER_CONNECT),
943+
DESC_ENTRY(ZEBRA_LABEL_MANAGER_CONNECT_ASYNC),
943944
DESC_ENTRY(ZEBRA_GET_LABEL_CHUNK),
944945
DESC_ENTRY(ZEBRA_RELEASE_LABEL_CHUNK),
945946
DESC_ENTRY(ZEBRA_ADVERTISE_ALL_VNI),

lib/zclient.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2046,24 +2046,29 @@ static int zclient_read_sync_response(struct zclient *zclient,
20462046
* immediately reads the answer from the input buffer.
20472047
*
20482048
* @param zclient Zclient used to connect to label manager (zebra)
2049+
* @param async Synchronous (0) or asynchronous (1) operation
20492050
* @result Result of response
20502051
*/
2051-
int lm_label_manager_connect(struct zclient *zclient)
2052+
int lm_label_manager_connect(struct zclient *zclient, int async)
20522053
{
20532054
int ret;
20542055
struct stream *s;
20552056
uint8_t result;
2057+
uint16_t cmd = async ? ZEBRA_LABEL_MANAGER_CONNECT_ASYNC :
2058+
ZEBRA_LABEL_MANAGER_CONNECT;
20562059

20572060
if (zclient_debug)
20582061
zlog_debug("Connecting to Label Manager (LM)");
20592062

2060-
if (zclient->sock < 0)
2063+
if (zclient->sock < 0) {
2064+
zlog_debug("%s: invalid zclient socket", __func__);
20612065
return -1;
2066+
}
20622067

20632068
/* send request */
20642069
s = zclient->obuf;
20652070
stream_reset(s);
2066-
zclient_create_header(s, ZEBRA_LABEL_MANAGER_CONNECT, VRF_DEFAULT);
2071+
zclient_create_header(s, cmd, VRF_DEFAULT);
20672072

20682073
/* proto */
20692074
stream_putc(s, zclient->redist_default);
@@ -2089,8 +2094,11 @@ int lm_label_manager_connect(struct zclient *zclient)
20892094
if (zclient_debug)
20902095
zlog_debug("LM connect request sent (%d bytes)", ret);
20912096

2097+
if (async)
2098+
return 0;
2099+
20922100
/* read response */
2093-
if (zclient_read_sync_response(zclient, ZEBRA_LABEL_MANAGER_CONNECT)
2101+
if (zclient_read_sync_response(zclient, cmd)
20942102
!= 0)
20952103
return -1;
20962104

0 commit comments

Comments
 (0)