mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-04-30 00:56:38 +00:00
bfdd, zebra: pass the vrf identifier between zebra and bfdd
messages from daemons to bfd daemons go through zebra. zebra reuses the vrf identifier to send messages to bfd. Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
This commit is contained in:
parent
7bcadbaefe
commit
45b000d085
@ -58,7 +58,7 @@ static struct zclient *zclient;
|
|||||||
static int _ptm_msg_address(struct stream *msg, int family, const void *addr);
|
static int _ptm_msg_address(struct stream *msg, int family, const void *addr);
|
||||||
|
|
||||||
static void _ptm_msg_read_address(struct stream *msg, struct sockaddr_any *sa);
|
static void _ptm_msg_read_address(struct stream *msg, struct sockaddr_any *sa);
|
||||||
static int _ptm_msg_read(struct stream *msg, int command,
|
static int _ptm_msg_read(struct stream *msg, int command, vrf_id_t vrf_id,
|
||||||
struct bfd_peer_cfg *bpc, struct ptm_client **pc);
|
struct bfd_peer_cfg *bpc, struct ptm_client **pc);
|
||||||
|
|
||||||
static struct ptm_client *pc_lookup(uint32_t pid);
|
static struct ptm_client *pc_lookup(uint32_t pid);
|
||||||
@ -72,8 +72,8 @@ static struct ptm_client_notification *pcn_lookup(struct ptm_client *pc,
|
|||||||
static void pcn_free(struct ptm_client_notification *pcn);
|
static void pcn_free(struct ptm_client_notification *pcn);
|
||||||
|
|
||||||
|
|
||||||
static void bfdd_dest_register(struct stream *msg);
|
static void bfdd_dest_register(struct stream *msg, vrf_id_t vrf_id);
|
||||||
static void bfdd_dest_deregister(struct stream *msg);
|
static void bfdd_dest_deregister(struct stream *msg, vrf_id_t vrf_id);
|
||||||
static void bfdd_client_register(struct stream *msg);
|
static void bfdd_client_register(struct stream *msg);
|
||||||
static void bfdd_client_deregister(struct stream *msg);
|
static void bfdd_client_deregister(struct stream *msg);
|
||||||
|
|
||||||
@ -182,7 +182,10 @@ int ptm_bfd_notify(struct bfd_session *bs)
|
|||||||
stream_reset(msg);
|
stream_reset(msg);
|
||||||
|
|
||||||
/* TODO: VRF handling */
|
/* TODO: VRF handling */
|
||||||
zclient_create_header(msg, ZEBRA_BFD_DEST_REPLAY, VRF_DEFAULT);
|
if (bs->vrf)
|
||||||
|
zclient_create_header(msg, ZEBRA_BFD_DEST_REPLAY, bs->vrf->vrf_id);
|
||||||
|
else
|
||||||
|
zclient_create_header(msg, ZEBRA_BFD_DEST_REPLAY, VRF_DEFAULT);
|
||||||
|
|
||||||
/* This header will be handled by `zebra_ptm.c`. */
|
/* This header will be handled by `zebra_ptm.c`. */
|
||||||
stream_putl(msg, ZEBRA_INTERFACE_BFD_DEST_UPDATE);
|
stream_putl(msg, ZEBRA_INTERFACE_BFD_DEST_UPDATE);
|
||||||
@ -256,7 +259,7 @@ stream_failure:
|
|||||||
memset(sa, 0, sizeof(*sa));
|
memset(sa, 0, sizeof(*sa));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _ptm_msg_read(struct stream *msg, int command,
|
static int _ptm_msg_read(struct stream *msg, int command, vrf_id_t vrf_id,
|
||||||
struct bfd_peer_cfg *bpc, struct ptm_client **pc)
|
struct bfd_peer_cfg *bpc, struct ptm_client **pc)
|
||||||
{
|
{
|
||||||
uint32_t pid;
|
uint32_t pid;
|
||||||
@ -355,6 +358,18 @@ static int _ptm_msg_read(struct stream *msg, int command,
|
|||||||
bpc->bpc_localif[ifnamelen] = 0;
|
bpc->bpc_localif[ifnamelen] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (vrf_id != VRF_DEFAULT) {
|
||||||
|
struct vrf *vrf;
|
||||||
|
|
||||||
|
vrf = vrf_lookup_by_id(vrf_id);
|
||||||
|
if (vrf) {
|
||||||
|
bpc->bpc_has_vrfname = true;
|
||||||
|
strlcpy(bpc->bpc_vrfname, vrf->name, sizeof(bpc->bpc_vrfname));
|
||||||
|
} else {
|
||||||
|
log_error("ptm-read: vrf id %u could not be identified", vrf_id);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Sanity check: peer and local address must match IP types. */
|
/* Sanity check: peer and local address must match IP types. */
|
||||||
if (bpc->bpc_local.sa_sin.sin_family != 0
|
if (bpc->bpc_local.sa_sin.sin_family != 0
|
||||||
@ -370,7 +385,7 @@ stream_failure:
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bfdd_dest_register(struct stream *msg)
|
static void bfdd_dest_register(struct stream *msg, vrf_id_t vrf_id)
|
||||||
{
|
{
|
||||||
struct ptm_client *pc;
|
struct ptm_client *pc;
|
||||||
struct ptm_client_notification *pcn;
|
struct ptm_client_notification *pcn;
|
||||||
@ -378,7 +393,7 @@ static void bfdd_dest_register(struct stream *msg)
|
|||||||
struct bfd_peer_cfg bpc;
|
struct bfd_peer_cfg bpc;
|
||||||
|
|
||||||
/* Read the client context and peer data. */
|
/* Read the client context and peer data. */
|
||||||
if (_ptm_msg_read(msg, ZEBRA_BFD_DEST_REGISTER, &bpc, &pc) == -1)
|
if (_ptm_msg_read(msg, ZEBRA_BFD_DEST_REGISTER, vrf_id, &bpc, &pc) == -1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
DEBUG_PRINTBPC(&bpc);
|
DEBUG_PRINTBPC(&bpc);
|
||||||
@ -408,7 +423,7 @@ static void bfdd_dest_register(struct stream *msg)
|
|||||||
ptm_bfd_notify(bs);
|
ptm_bfd_notify(bs);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bfdd_dest_deregister(struct stream *msg)
|
static void bfdd_dest_deregister(struct stream *msg, vrf_id_t vrf_id)
|
||||||
{
|
{
|
||||||
struct ptm_client *pc;
|
struct ptm_client *pc;
|
||||||
struct ptm_client_notification *pcn;
|
struct ptm_client_notification *pcn;
|
||||||
@ -416,7 +431,7 @@ static void bfdd_dest_deregister(struct stream *msg)
|
|||||||
struct bfd_peer_cfg bpc;
|
struct bfd_peer_cfg bpc;
|
||||||
|
|
||||||
/* Read the client context and peer data. */
|
/* Read the client context and peer data. */
|
||||||
if (_ptm_msg_read(msg, ZEBRA_BFD_DEST_DEREGISTER, &bpc, &pc) == -1)
|
if (_ptm_msg_read(msg, ZEBRA_BFD_DEST_DEREGISTER, vrf_id, &bpc, &pc) == -1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
DEBUG_PRINTBPC(&bpc);
|
DEBUG_PRINTBPC(&bpc);
|
||||||
@ -497,10 +512,10 @@ static int bfdd_replay(ZAPI_CALLBACK_ARGS)
|
|||||||
switch (rcmd) {
|
switch (rcmd) {
|
||||||
case ZEBRA_BFD_DEST_REGISTER:
|
case ZEBRA_BFD_DEST_REGISTER:
|
||||||
case ZEBRA_BFD_DEST_UPDATE:
|
case ZEBRA_BFD_DEST_UPDATE:
|
||||||
bfdd_dest_register(msg);
|
bfdd_dest_register(msg, vrf_id);
|
||||||
break;
|
break;
|
||||||
case ZEBRA_BFD_DEST_DEREGISTER:
|
case ZEBRA_BFD_DEST_DEREGISTER:
|
||||||
bfdd_dest_deregister(msg);
|
bfdd_dest_deregister(msg, vrf_id);
|
||||||
break;
|
break;
|
||||||
case ZEBRA_BFD_CLIENT_REGISTER:
|
case ZEBRA_BFD_CLIENT_REGISTER:
|
||||||
bfdd_client_register(msg);
|
bfdd_client_register(msg);
|
||||||
|
@ -1188,8 +1188,8 @@ static void pp_free_all(void);
|
|||||||
static void zebra_ptm_send_bfdd(struct stream *msg);
|
static void zebra_ptm_send_bfdd(struct stream *msg);
|
||||||
static void zebra_ptm_send_clients(struct stream *msg);
|
static void zebra_ptm_send_clients(struct stream *msg);
|
||||||
static int _zebra_ptm_bfd_client_deregister(struct zserv *zs);
|
static int _zebra_ptm_bfd_client_deregister(struct zserv *zs);
|
||||||
static void _zebra_ptm_reroute(struct zserv *zs, struct stream *msg,
|
static void _zebra_ptm_reroute(struct zserv *zs, struct zebra_vrf *zvrf,
|
||||||
uint32_t command);
|
struct stream *msg, uint32_t command);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1392,8 +1392,8 @@ void zebra_ptm_finish(void)
|
|||||||
/*
|
/*
|
||||||
* Message handling.
|
* Message handling.
|
||||||
*/
|
*/
|
||||||
static void _zebra_ptm_reroute(struct zserv *zs, struct stream *msg,
|
static void _zebra_ptm_reroute(struct zserv *zs, struct zebra_vrf *zvrf,
|
||||||
uint32_t command)
|
struct stream *msg, uint32_t command)
|
||||||
{
|
{
|
||||||
struct stream *msgc;
|
struct stream *msgc;
|
||||||
size_t zmsglen, zhdrlen;
|
size_t zmsglen, zhdrlen;
|
||||||
@ -1420,7 +1420,7 @@ static void _zebra_ptm_reroute(struct zserv *zs, struct stream *msg,
|
|||||||
* one callback at the `bfdd` side, however the real command
|
* one callback at the `bfdd` side, however the real command
|
||||||
* number will be included right after the zebra header.
|
* number will be included right after the zebra header.
|
||||||
*/
|
*/
|
||||||
zclient_create_header(msgc, ZEBRA_BFD_DEST_REPLAY, 0);
|
zclient_create_header(msgc, ZEBRA_BFD_DEST_REPLAY, zvrf->vrf->vrf_id);
|
||||||
stream_putl(msgc, command);
|
stream_putl(msgc, command);
|
||||||
|
|
||||||
/* Update the data pointers. */
|
/* Update the data pointers. */
|
||||||
@ -1446,7 +1446,7 @@ void zebra_ptm_bfd_dst_register(ZAPI_HANDLER_ARGS)
|
|||||||
zlog_debug("bfd_dst_register msg from client %s: length=%d",
|
zlog_debug("bfd_dst_register msg from client %s: length=%d",
|
||||||
zebra_route_string(client->proto), hdr->length);
|
zebra_route_string(client->proto), hdr->length);
|
||||||
|
|
||||||
_zebra_ptm_reroute(client, msg, ZEBRA_BFD_DEST_REGISTER);
|
_zebra_ptm_reroute(client, zvrf, msg, ZEBRA_BFD_DEST_REGISTER);
|
||||||
}
|
}
|
||||||
|
|
||||||
void zebra_ptm_bfd_dst_deregister(ZAPI_HANDLER_ARGS)
|
void zebra_ptm_bfd_dst_deregister(ZAPI_HANDLER_ARGS)
|
||||||
@ -1455,7 +1455,7 @@ void zebra_ptm_bfd_dst_deregister(ZAPI_HANDLER_ARGS)
|
|||||||
zlog_debug("bfd_dst_deregister msg from client %s: length=%d",
|
zlog_debug("bfd_dst_deregister msg from client %s: length=%d",
|
||||||
zebra_route_string(client->proto), hdr->length);
|
zebra_route_string(client->proto), hdr->length);
|
||||||
|
|
||||||
_zebra_ptm_reroute(client, msg, ZEBRA_BFD_DEST_DEREGISTER);
|
_zebra_ptm_reroute(client, zvrf, msg, ZEBRA_BFD_DEST_DEREGISTER);
|
||||||
}
|
}
|
||||||
|
|
||||||
void zebra_ptm_bfd_client_register(ZAPI_HANDLER_ARGS)
|
void zebra_ptm_bfd_client_register(ZAPI_HANDLER_ARGS)
|
||||||
@ -1464,7 +1464,7 @@ void zebra_ptm_bfd_client_register(ZAPI_HANDLER_ARGS)
|
|||||||
zlog_debug("bfd_client_register msg from client %s: length=%d",
|
zlog_debug("bfd_client_register msg from client %s: length=%d",
|
||||||
zebra_route_string(client->proto), hdr->length);
|
zebra_route_string(client->proto), hdr->length);
|
||||||
|
|
||||||
_zebra_ptm_reroute(client, msg, ZEBRA_BFD_CLIENT_REGISTER);
|
_zebra_ptm_reroute(client, zvrf, msg, ZEBRA_BFD_CLIENT_REGISTER);
|
||||||
}
|
}
|
||||||
|
|
||||||
void zebra_ptm_bfd_dst_replay(ZAPI_HANDLER_ARGS)
|
void zebra_ptm_bfd_dst_replay(ZAPI_HANDLER_ARGS)
|
||||||
@ -1488,7 +1488,7 @@ void zebra_ptm_bfd_dst_replay(ZAPI_HANDLER_ARGS)
|
|||||||
* special treatment.
|
* special treatment.
|
||||||
*/
|
*/
|
||||||
if (client->proto != ZEBRA_ROUTE_BFD) {
|
if (client->proto != ZEBRA_ROUTE_BFD) {
|
||||||
_zebra_ptm_reroute(client, msg, ZEBRA_BFD_DEST_REPLAY);
|
_zebra_ptm_reroute(client, zvrf, msg, ZEBRA_BFD_DEST_REPLAY);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user