mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-07 22:29:23 +00:00
bfdd: socket handling per vrf context
sockets are created foreach network namespace context enabled. Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
This commit is contained in:
parent
9fc0bc5cfc
commit
7bcadbaefe
80
bfdd/bfd.c
80
bfdd/bfd.c
@ -1458,15 +1458,72 @@ static int bfd_vrf_delete(struct vrf *vrf)
|
|||||||
|
|
||||||
static int bfd_vrf_enable(struct vrf *vrf)
|
static int bfd_vrf_enable(struct vrf *vrf)
|
||||||
{
|
{
|
||||||
|
struct bfd_vrf_global *bvrf;
|
||||||
|
|
||||||
|
/* a different name */
|
||||||
|
if (!vrf->info) {
|
||||||
|
bvrf = XCALLOC(MTYPE_BFDD_VRF, sizeof(struct bfd_vrf_global));
|
||||||
|
bvrf->vrf = vrf;
|
||||||
|
vrf->info = (void *)bvrf;
|
||||||
|
} else
|
||||||
|
bvrf = vrf->info;
|
||||||
log_debug("VRF enable add %s id %u", vrf->name, vrf->vrf_id);
|
log_debug("VRF enable add %s id %u", vrf->name, vrf->vrf_id);
|
||||||
|
|
||||||
|
/* create sockets if needed */
|
||||||
|
if (!bvrf->bg_shop)
|
||||||
|
bvrf->bg_shop = bp_udp_shop(vrf->vrf_id);
|
||||||
|
if (!bvrf->bg_mhop)
|
||||||
|
bvrf->bg_mhop = bp_udp_mhop(vrf->vrf_id);
|
||||||
|
if (!bvrf->bg_shop6)
|
||||||
|
bvrf->bg_shop6 = bp_udp6_shop(vrf->vrf_id);
|
||||||
|
if (!bvrf->bg_mhop6)
|
||||||
|
bvrf->bg_mhop6 = bp_udp6_mhop(vrf->vrf_id);
|
||||||
|
if (!bvrf->bg_echo)
|
||||||
|
bvrf->bg_echo = bp_echo_socket(vrf->vrf_id);
|
||||||
|
if (!bvrf->bg_echov6)
|
||||||
|
bvrf->bg_echov6 = bp_echov6_socket(vrf->vrf_id);
|
||||||
|
|
||||||
|
/* Add descriptors to the event loop. */
|
||||||
|
if (!bvrf->bg_ev[0])
|
||||||
|
thread_add_read(master, bfd_recv_cb, bvrf, bvrf->bg_shop,
|
||||||
|
&bvrf->bg_ev[0]);
|
||||||
|
if (!bvrf->bg_ev[1])
|
||||||
|
thread_add_read(master, bfd_recv_cb, bvrf, bvrf->bg_mhop,
|
||||||
|
&bvrf->bg_ev[1]);
|
||||||
|
if (!bvrf->bg_ev[2])
|
||||||
|
thread_add_read(master, bfd_recv_cb, bvrf, bvrf->bg_shop6,
|
||||||
|
&bvrf->bg_ev[2]);
|
||||||
|
if (!bvrf->bg_ev[3])
|
||||||
|
thread_add_read(master, bfd_recv_cb, bvrf, bvrf->bg_mhop6,
|
||||||
|
&bvrf->bg_ev[3]);
|
||||||
|
if (!bvrf->bg_ev[4])
|
||||||
|
thread_add_read(master, bfd_recv_cb, bvrf, bvrf->bg_echo,
|
||||||
|
&bvrf->bg_ev[4]);
|
||||||
|
if (!bvrf->bg_ev[5])
|
||||||
|
thread_add_read(master, bfd_recv_cb, bvrf, bvrf->bg_echov6,
|
||||||
|
&bvrf->bg_ev[5]);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int bfd_vrf_disable(struct vrf *vrf)
|
static int bfd_vrf_disable(struct vrf *vrf)
|
||||||
{
|
{
|
||||||
if (vrf->vrf_id == VRF_DEFAULT)
|
struct bfd_vrf_global *bvrf;
|
||||||
|
|
||||||
|
if (!vrf->info)
|
||||||
return 0;
|
return 0;
|
||||||
|
bvrf = vrf->info;
|
||||||
log_debug("VRF disable %s id %d", vrf->name, vrf->vrf_id);
|
log_debug("VRF disable %s id %d", vrf->name, vrf->vrf_id);
|
||||||
|
/* Close all descriptors. */
|
||||||
|
socket_close(&bvrf->bg_echo);
|
||||||
|
socket_close(&bvrf->bg_shop);
|
||||||
|
socket_close(&bvrf->bg_mhop);
|
||||||
|
socket_close(&bvrf->bg_shop6);
|
||||||
|
socket_close(&bvrf->bg_mhop6);
|
||||||
|
|
||||||
|
/* free context */
|
||||||
|
XFREE(MTYPE_BFDD_VRF, bvrf);
|
||||||
|
vrf->info = NULL;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1476,3 +1533,24 @@ void bfd_vrf_init(void)
|
|||||||
bfd_vrf_delete, NULL);
|
bfd_vrf_delete, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void bfd_vrf_terminate(void)
|
||||||
|
{
|
||||||
|
vrf_terminate();
|
||||||
|
}
|
||||||
|
|
||||||
|
struct bfd_vrf_global *bfd_vrf_look_by_session(struct bfd_session *bfd)
|
||||||
|
{
|
||||||
|
struct vrf *vrf;
|
||||||
|
|
||||||
|
if (!vrf_is_backend_netns()) {
|
||||||
|
vrf = vrf_lookup_by_id(VRF_DEFAULT);
|
||||||
|
if (vrf)
|
||||||
|
return (struct bfd_vrf_global *)vrf->info;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (!bfd)
|
||||||
|
return NULL;
|
||||||
|
if (!bfd->vrf)
|
||||||
|
return NULL;
|
||||||
|
return bfd->vrf->info;
|
||||||
|
}
|
||||||
|
23
bfdd/bfd.h
23
bfdd/bfd.h
@ -48,6 +48,7 @@ DECLARE_MTYPE(BFDD_LABEL);
|
|||||||
DECLARE_MTYPE(BFDD_CONTROL);
|
DECLARE_MTYPE(BFDD_CONTROL);
|
||||||
DECLARE_MTYPE(BFDD_SESSION_OBSERVER);
|
DECLARE_MTYPE(BFDD_SESSION_OBSERVER);
|
||||||
DECLARE_MTYPE(BFDD_NOTIFICATION);
|
DECLARE_MTYPE(BFDD_NOTIFICATION);
|
||||||
|
DECLARE_MTYPE(BFDD_VRF);
|
||||||
|
|
||||||
extern struct zebra_privs_t bfdd_privs;
|
extern struct zebra_privs_t bfdd_privs;
|
||||||
|
|
||||||
@ -381,15 +382,19 @@ int control_accept(struct thread *t);
|
|||||||
*
|
*
|
||||||
* Daemon specific code.
|
* Daemon specific code.
|
||||||
*/
|
*/
|
||||||
struct bfd_global {
|
struct bfd_vrf_global {
|
||||||
int bg_shop;
|
int bg_shop;
|
||||||
int bg_mhop;
|
int bg_mhop;
|
||||||
int bg_shop6;
|
int bg_shop6;
|
||||||
int bg_mhop6;
|
int bg_mhop6;
|
||||||
int bg_echo;
|
int bg_echo;
|
||||||
int bg_echov6;
|
int bg_echov6;
|
||||||
struct thread *bg_ev[6];
|
struct vrf *vrf;
|
||||||
|
|
||||||
|
struct thread *bg_ev[6];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct bfd_global {
|
||||||
int bg_csock;
|
int bg_csock;
|
||||||
struct thread *bg_csockev;
|
struct thread *bg_csockev;
|
||||||
struct bcslist bg_bcslist;
|
struct bcslist bg_bcslist;
|
||||||
@ -461,14 +466,14 @@ int bp_set_tosv6(int sd, uint8_t value);
|
|||||||
int bp_set_tos(int sd, uint8_t value);
|
int bp_set_tos(int sd, uint8_t value);
|
||||||
int bp_bind_dev(int sd, const char *dev);
|
int bp_bind_dev(int sd, const char *dev);
|
||||||
|
|
||||||
int bp_udp_shop(void);
|
int bp_udp_shop(vrf_id_t vrf_id);
|
||||||
int bp_udp_mhop(void);
|
int bp_udp_mhop(vrf_id_t vrf_id);
|
||||||
int bp_udp6_shop(void);
|
int bp_udp6_shop(vrf_id_t vrf_id);
|
||||||
int bp_udp6_mhop(void);
|
int bp_udp6_mhop(vrf_id_t vrf_id);
|
||||||
int bp_peer_socket(const struct bfd_session *bs);
|
int bp_peer_socket(const struct bfd_session *bs);
|
||||||
int bp_peer_socketv6(const struct bfd_session *bs);
|
int bp_peer_socketv6(const struct bfd_session *bs);
|
||||||
int bp_echo_socket(void);
|
int bp_echo_socket(vrf_id_t vrf_id);
|
||||||
int bp_echov6_socket(void);
|
int bp_echov6_socket(vrf_id_t vrf_id);
|
||||||
|
|
||||||
void ptm_bfd_snd(struct bfd_session *bfd, int fbit);
|
void ptm_bfd_snd(struct bfd_session *bfd, int fbit);
|
||||||
void ptm_bfd_echo_snd(struct bfd_session *bfd);
|
void ptm_bfd_echo_snd(struct bfd_session *bfd);
|
||||||
@ -542,6 +547,8 @@ void bs_to_bpc(struct bfd_session *bs, struct bfd_peer_cfg *bpc);
|
|||||||
void bfd_initialize(void);
|
void bfd_initialize(void);
|
||||||
void bfd_shutdown(void);
|
void bfd_shutdown(void);
|
||||||
void bfd_vrf_init(void);
|
void bfd_vrf_init(void);
|
||||||
|
void bfd_vrf_terminate(void);
|
||||||
|
struct bfd_vrf_global *bfd_vrf_look_by_session(struct bfd_session *bfd);
|
||||||
struct bfd_session *bfd_id_lookup(uint32_t id);
|
struct bfd_session *bfd_id_lookup(uint32_t id);
|
||||||
struct bfd_session *bfd_key_lookup(struct bfd_key key);
|
struct bfd_session *bfd_key_lookup(struct bfd_key key);
|
||||||
|
|
||||||
|
@ -40,11 +40,11 @@
|
|||||||
/*
|
/*
|
||||||
* Prototypes
|
* Prototypes
|
||||||
*/
|
*/
|
||||||
static int ptm_bfd_process_echo_pkt(int s);
|
static int ptm_bfd_process_echo_pkt(struct bfd_vrf_global *bvrf, int s);
|
||||||
int _ptm_bfd_send(struct bfd_session *bs, uint16_t *port, const void *data,
|
int _ptm_bfd_send(struct bfd_session *bs, uint16_t *port, const void *data,
|
||||||
size_t datalen);
|
size_t datalen);
|
||||||
|
|
||||||
static void bfd_sd_reschedule(int sd);
|
static void bfd_sd_reschedule(struct bfd_vrf_global *bvrf, int sd);
|
||||||
ssize_t bfd_recv_ipv4(int sd, uint8_t *msgbuf, size_t msgbuflen, uint8_t *ttl,
|
ssize_t bfd_recv_ipv4(int sd, uint8_t *msgbuf, size_t msgbuflen, uint8_t *ttl,
|
||||||
ifindex_t *ifindex, struct sockaddr_any *local,
|
ifindex_t *ifindex, struct sockaddr_any *local,
|
||||||
struct sockaddr_any *peer);
|
struct sockaddr_any *peer);
|
||||||
@ -53,7 +53,8 @@ ssize_t bfd_recv_ipv6(int sd, uint8_t *msgbuf, size_t msgbuflen, uint8_t *ttl,
|
|||||||
struct sockaddr_any *peer);
|
struct sockaddr_any *peer);
|
||||||
int bp_udp_send(int sd, uint8_t ttl, uint8_t *data, size_t datalen,
|
int bp_udp_send(int sd, uint8_t ttl, uint8_t *data, size_t datalen,
|
||||||
struct sockaddr *to, socklen_t tolen);
|
struct sockaddr *to, socklen_t tolen);
|
||||||
int bp_bfd_echo_in(int sd, uint8_t *ttl, uint32_t *my_discr);
|
int bp_bfd_echo_in(struct bfd_vrf_global *bvrf, int sd,
|
||||||
|
uint8_t *ttl, uint32_t *my_discr);
|
||||||
|
|
||||||
/* socket related prototypes */
|
/* socket related prototypes */
|
||||||
static void bp_set_ipopts(int sd);
|
static void bp_set_ipopts(int sd);
|
||||||
@ -128,7 +129,10 @@ void ptm_bfd_echo_snd(struct bfd_session *bfd)
|
|||||||
struct bfd_echo_pkt bep;
|
struct bfd_echo_pkt bep;
|
||||||
struct sockaddr_in sin;
|
struct sockaddr_in sin;
|
||||||
struct sockaddr_in6 sin6;
|
struct sockaddr_in6 sin6;
|
||||||
|
struct bfd_vrf_global *bvrf = bfd_vrf_look_by_session(bfd);
|
||||||
|
|
||||||
|
if (!bvrf)
|
||||||
|
return;
|
||||||
if (!BFD_CHECK_FLAG(bfd->flags, BFD_SESS_FLAG_ECHO_ACTIVE))
|
if (!BFD_CHECK_FLAG(bfd->flags, BFD_SESS_FLAG_ECHO_ACTIVE))
|
||||||
BFD_SET_FLAG(bfd->flags, BFD_SESS_FLAG_ECHO_ACTIVE);
|
BFD_SET_FLAG(bfd->flags, BFD_SESS_FLAG_ECHO_ACTIVE);
|
||||||
|
|
||||||
@ -138,7 +142,7 @@ void ptm_bfd_echo_snd(struct bfd_session *bfd)
|
|||||||
bep.my_discr = htonl(bfd->discrs.my_discr);
|
bep.my_discr = htonl(bfd->discrs.my_discr);
|
||||||
|
|
||||||
if (BFD_CHECK_FLAG(bfd->flags, BFD_SESS_FLAG_IPV6)) {
|
if (BFD_CHECK_FLAG(bfd->flags, BFD_SESS_FLAG_IPV6)) {
|
||||||
sd = bglobal.bg_echov6;
|
sd = bvrf->bg_echov6;
|
||||||
memset(&sin6, 0, sizeof(sin6));
|
memset(&sin6, 0, sizeof(sin6));
|
||||||
sin6.sin6_family = AF_INET6;
|
sin6.sin6_family = AF_INET6;
|
||||||
memcpy(&sin6.sin6_addr, &bfd->key.peer, sizeof(sin6.sin6_addr));
|
memcpy(&sin6.sin6_addr, &bfd->key.peer, sizeof(sin6.sin6_addr));
|
||||||
@ -153,7 +157,7 @@ void ptm_bfd_echo_snd(struct bfd_session *bfd)
|
|||||||
sa = (struct sockaddr *)&sin6;
|
sa = (struct sockaddr *)&sin6;
|
||||||
salen = sizeof(sin6);
|
salen = sizeof(sin6);
|
||||||
} else {
|
} else {
|
||||||
sd = bglobal.bg_echo;
|
sd = bvrf->bg_echo;
|
||||||
memset(&sin6, 0, sizeof(sin6));
|
memset(&sin6, 0, sizeof(sin6));
|
||||||
sin.sin_family = AF_INET;
|
sin.sin_family = AF_INET;
|
||||||
memcpy(&sin.sin_addr, &bfd->key.peer, sizeof(sin.sin_addr));
|
memcpy(&sin.sin_addr, &bfd->key.peer, sizeof(sin.sin_addr));
|
||||||
@ -173,14 +177,14 @@ void ptm_bfd_echo_snd(struct bfd_session *bfd)
|
|||||||
bfd->stats.tx_echo_pkt++;
|
bfd->stats.tx_echo_pkt++;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ptm_bfd_process_echo_pkt(int s)
|
static int ptm_bfd_process_echo_pkt(struct bfd_vrf_global *bvrf, int s)
|
||||||
{
|
{
|
||||||
struct bfd_session *bfd;
|
struct bfd_session *bfd;
|
||||||
uint32_t my_discr = 0;
|
uint32_t my_discr = 0;
|
||||||
uint8_t ttl = 0;
|
uint8_t ttl = 0;
|
||||||
|
|
||||||
/* Receive and parse echo packet. */
|
/* Receive and parse echo packet. */
|
||||||
if (bp_bfd_echo_in(s, &ttl, &my_discr) == -1)
|
if (bp_bfd_echo_in(bvrf, s, &ttl, &my_discr) == -1)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Your discriminator not zero - use it to find session */
|
/* Your discriminator not zero - use it to find session */
|
||||||
@ -440,32 +444,32 @@ ssize_t bfd_recv_ipv6(int sd, uint8_t *msgbuf, size_t msgbuflen, uint8_t *ttl,
|
|||||||
return mlen;
|
return mlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bfd_sd_reschedule(int sd)
|
static void bfd_sd_reschedule(struct bfd_vrf_global *bvrf, int sd)
|
||||||
{
|
{
|
||||||
if (sd == bglobal.bg_shop) {
|
if (sd == bvrf->bg_shop) {
|
||||||
THREAD_OFF(bglobal.bg_ev[0]);
|
THREAD_OFF(bvrf->bg_ev[0]);
|
||||||
thread_add_read(master, bfd_recv_cb, NULL, bglobal.bg_shop,
|
thread_add_read(master, bfd_recv_cb, bvrf, bvrf->bg_shop,
|
||||||
&bglobal.bg_ev[0]);
|
&bvrf->bg_ev[0]);
|
||||||
} else if (sd == bglobal.bg_mhop) {
|
} else if (sd == bvrf->bg_mhop) {
|
||||||
THREAD_OFF(bglobal.bg_ev[1]);
|
THREAD_OFF(bvrf->bg_ev[1]);
|
||||||
thread_add_read(master, bfd_recv_cb, NULL, bglobal.bg_mhop,
|
thread_add_read(master, bfd_recv_cb, bvrf, bvrf->bg_mhop,
|
||||||
&bglobal.bg_ev[1]);
|
&bvrf->bg_ev[1]);
|
||||||
} else if (sd == bglobal.bg_shop6) {
|
} else if (sd == bvrf->bg_shop6) {
|
||||||
THREAD_OFF(bglobal.bg_ev[2]);
|
THREAD_OFF(bvrf->bg_ev[2]);
|
||||||
thread_add_read(master, bfd_recv_cb, NULL, bglobal.bg_shop6,
|
thread_add_read(master, bfd_recv_cb, bvrf, bvrf->bg_shop6,
|
||||||
&bglobal.bg_ev[2]);
|
&bvrf->bg_ev[2]);
|
||||||
} else if (sd == bglobal.bg_mhop6) {
|
} else if (sd == bvrf->bg_mhop6) {
|
||||||
THREAD_OFF(bglobal.bg_ev[3]);
|
THREAD_OFF(bvrf->bg_ev[3]);
|
||||||
thread_add_read(master, bfd_recv_cb, NULL, bglobal.bg_mhop6,
|
thread_add_read(master, bfd_recv_cb, bvrf, bvrf->bg_mhop6,
|
||||||
&bglobal.bg_ev[3]);
|
&bvrf->bg_ev[3]);
|
||||||
} else if (sd == bglobal.bg_echo) {
|
} else if (sd == bvrf->bg_echo) {
|
||||||
THREAD_OFF(bglobal.bg_ev[4]);
|
THREAD_OFF(bvrf->bg_ev[4]);
|
||||||
thread_add_read(master, bfd_recv_cb, NULL, bglobal.bg_echo,
|
thread_add_read(master, bfd_recv_cb, bvrf, bvrf->bg_echo,
|
||||||
&bglobal.bg_ev[4]);
|
&bvrf->bg_ev[4]);
|
||||||
} else if (sd == bglobal.bg_echov6) {
|
} else if (sd == bvrf->bg_echov6) {
|
||||||
THREAD_OFF(bglobal.bg_ev[5]);
|
THREAD_OFF(bvrf->bg_ev[5]);
|
||||||
thread_add_read(master, bfd_recv_cb, NULL, bglobal.bg_echov6,
|
thread_add_read(master, bfd_recv_cb, bvrf, bvrf->bg_echov6,
|
||||||
&bglobal.bg_ev[5]);
|
&bvrf->bg_ev[5]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -517,13 +521,16 @@ int bfd_recv_cb(struct thread *t)
|
|||||||
ifindex_t ifindex = IFINDEX_INTERNAL;
|
ifindex_t ifindex = IFINDEX_INTERNAL;
|
||||||
struct sockaddr_any local, peer;
|
struct sockaddr_any local, peer;
|
||||||
uint8_t msgbuf[1516];
|
uint8_t msgbuf[1516];
|
||||||
|
struct bfd_vrf_global *bvrf = THREAD_ARG(t);
|
||||||
|
|
||||||
|
if (bvrf)
|
||||||
|
vrfid = bvrf->vrf->vrf_id;
|
||||||
/* Schedule next read. */
|
/* Schedule next read. */
|
||||||
bfd_sd_reschedule(sd);
|
bfd_sd_reschedule(bvrf, sd);
|
||||||
|
|
||||||
/* Handle echo packets. */
|
/* Handle echo packets. */
|
||||||
if (sd == bglobal.bg_echo || sd == bglobal.bg_echov6) {
|
if (sd == bvrf->bg_echo || sd == bvrf->bg_echov6) {
|
||||||
ptm_bfd_process_echo_pkt(sd);
|
ptm_bfd_process_echo_pkt(bvrf, sd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -533,12 +540,12 @@ int bfd_recv_cb(struct thread *t)
|
|||||||
|
|
||||||
/* Handle control packets. */
|
/* Handle control packets. */
|
||||||
is_mhop = false;
|
is_mhop = false;
|
||||||
if (sd == bglobal.bg_shop || sd == bglobal.bg_mhop) {
|
if (sd == bvrf->bg_shop || sd == bvrf->bg_mhop) {
|
||||||
is_mhop = sd == bglobal.bg_mhop;
|
is_mhop = sd == bvrf->bg_mhop;
|
||||||
mlen = bfd_recv_ipv4(sd, msgbuf, sizeof(msgbuf), &ttl, &ifindex,
|
mlen = bfd_recv_ipv4(sd, msgbuf, sizeof(msgbuf), &ttl, &ifindex,
|
||||||
&local, &peer);
|
&local, &peer);
|
||||||
} else if (sd == bglobal.bg_shop6 || sd == bglobal.bg_mhop6) {
|
} else if (sd == bvrf->bg_shop6 || sd == bvrf->bg_mhop6) {
|
||||||
is_mhop = sd == bglobal.bg_mhop6;
|
is_mhop = sd == bvrf->bg_mhop6;
|
||||||
mlen = bfd_recv_ipv6(sd, msgbuf, sizeof(msgbuf), &ttl, &ifindex,
|
mlen = bfd_recv_ipv6(sd, msgbuf, sizeof(msgbuf), &ttl, &ifindex,
|
||||||
&local, &peer);
|
&local, &peer);
|
||||||
}
|
}
|
||||||
@ -681,7 +688,8 @@ int bfd_recv_cb(struct thread *t)
|
|||||||
*
|
*
|
||||||
* Returns -1 on error or loopback or 0 on success.
|
* Returns -1 on error or loopback or 0 on success.
|
||||||
*/
|
*/
|
||||||
int bp_bfd_echo_in(int sd, uint8_t *ttl, uint32_t *my_discr)
|
int bp_bfd_echo_in(struct bfd_vrf_global *bvrf, int sd,
|
||||||
|
uint8_t *ttl, uint32_t *my_discr)
|
||||||
{
|
{
|
||||||
struct bfd_echo_pkt *bep;
|
struct bfd_echo_pkt *bep;
|
||||||
ssize_t rlen;
|
ssize_t rlen;
|
||||||
@ -690,7 +698,7 @@ int bp_bfd_echo_in(int sd, uint8_t *ttl, uint32_t *my_discr)
|
|||||||
vrf_id_t vrfid = VRF_DEFAULT;
|
vrf_id_t vrfid = VRF_DEFAULT;
|
||||||
uint8_t msgbuf[1516];
|
uint8_t msgbuf[1516];
|
||||||
|
|
||||||
if (sd == bglobal.bg_echo)
|
if (sd == bvrf->bg_echo)
|
||||||
rlen = bfd_recv_ipv4(sd, msgbuf, sizeof(msgbuf), ttl, &ifindex,
|
rlen = bfd_recv_ipv4(sd, msgbuf, sizeof(msgbuf), ttl, &ifindex,
|
||||||
&local, &peer);
|
&local, &peer);
|
||||||
else
|
else
|
||||||
@ -708,7 +716,7 @@ int bp_bfd_echo_in(int sd, uint8_t *ttl, uint32_t *my_discr)
|
|||||||
if (*ttl == BFD_TTL_VAL) {
|
if (*ttl == BFD_TTL_VAL) {
|
||||||
bp_udp_send(sd, *ttl - 1, msgbuf, rlen,
|
bp_udp_send(sd, *ttl - 1, msgbuf, rlen,
|
||||||
(struct sockaddr *)&peer,
|
(struct sockaddr *)&peer,
|
||||||
(sd == bglobal.bg_echo) ? sizeof(peer.sa_sin)
|
(sd == bvrf->bg_echo) ? sizeof(peer.sa_sin)
|
||||||
: sizeof(peer.sa_sin6));
|
: sizeof(peer.sa_sin6));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -871,25 +879,28 @@ static void bp_bind_ip(int sd, uint16_t port)
|
|||||||
log_fatal("bind-ip: bind: %s", strerror(errno));
|
log_fatal("bind-ip: bind: %s", strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
int bp_udp_shop(void)
|
int bp_udp_shop(vrf_id_t vrf_id)
|
||||||
{
|
{
|
||||||
int sd;
|
int sd;
|
||||||
|
|
||||||
sd = socket(AF_INET, SOCK_DGRAM, PF_UNSPEC);
|
frr_elevate_privs(&bfdd_privs) {
|
||||||
|
sd = vrf_socket(AF_INET, SOCK_DGRAM, PF_UNSPEC, vrf_id, NULL);
|
||||||
|
}
|
||||||
if (sd == -1)
|
if (sd == -1)
|
||||||
log_fatal("udp-shop: socket: %s", strerror(errno));
|
log_fatal("udp-shop: socket: %s", strerror(errno));
|
||||||
|
|
||||||
bp_set_ipopts(sd);
|
bp_set_ipopts(sd);
|
||||||
bp_bind_ip(sd, BFD_DEFDESTPORT);
|
bp_bind_ip(sd, BFD_DEFDESTPORT);
|
||||||
|
|
||||||
return sd;
|
return sd;
|
||||||
}
|
}
|
||||||
|
|
||||||
int bp_udp_mhop(void)
|
int bp_udp_mhop(vrf_id_t vrf_id)
|
||||||
{
|
{
|
||||||
int sd;
|
int sd;
|
||||||
|
|
||||||
sd = socket(AF_INET, SOCK_DGRAM, PF_UNSPEC);
|
frr_elevate_privs(&bfdd_privs) {
|
||||||
|
sd = vrf_socket(AF_INET, SOCK_DGRAM, PF_UNSPEC, vrf_id, NULL);
|
||||||
|
}
|
||||||
if (sd == -1)
|
if (sd == -1)
|
||||||
log_fatal("udp-mhop: socket: %s", strerror(errno));
|
log_fatal("udp-mhop: socket: %s", strerror(errno));
|
||||||
|
|
||||||
@ -1095,11 +1106,13 @@ static void bp_bind_ipv6(int sd, uint16_t port)
|
|||||||
log_fatal("bind-ipv6: bind: %s", strerror(errno));
|
log_fatal("bind-ipv6: bind: %s", strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
int bp_udp6_shop(void)
|
int bp_udp6_shop(vrf_id_t vrf_id)
|
||||||
{
|
{
|
||||||
int sd;
|
int sd;
|
||||||
|
|
||||||
sd = socket(AF_INET6, SOCK_DGRAM, PF_UNSPEC);
|
frr_elevate_privs(&bfdd_privs) {
|
||||||
|
sd = vrf_socket(AF_INET6, SOCK_DGRAM, PF_UNSPEC, vrf_id, NULL);
|
||||||
|
}
|
||||||
if (sd == -1)
|
if (sd == -1)
|
||||||
log_fatal("udp6-shop: socket: %s", strerror(errno));
|
log_fatal("udp6-shop: socket: %s", strerror(errno));
|
||||||
|
|
||||||
@ -1109,11 +1122,13 @@ int bp_udp6_shop(void)
|
|||||||
return sd;
|
return sd;
|
||||||
}
|
}
|
||||||
|
|
||||||
int bp_udp6_mhop(void)
|
int bp_udp6_mhop(vrf_id_t vrf_id)
|
||||||
{
|
{
|
||||||
int sd;
|
int sd;
|
||||||
|
|
||||||
sd = socket(AF_INET6, SOCK_DGRAM, PF_UNSPEC);
|
frr_elevate_privs(&bfdd_privs) {
|
||||||
|
sd = vrf_socket(AF_INET6, SOCK_DGRAM, PF_UNSPEC, vrf_id, NULL);
|
||||||
|
}
|
||||||
if (sd == -1)
|
if (sd == -1)
|
||||||
log_fatal("udp6-mhop: socket: %s", strerror(errno));
|
log_fatal("udp6-mhop: socket: %s", strerror(errno));
|
||||||
|
|
||||||
@ -1123,11 +1138,13 @@ int bp_udp6_mhop(void)
|
|||||||
return sd;
|
return sd;
|
||||||
}
|
}
|
||||||
|
|
||||||
int bp_echo_socket(void)
|
int bp_echo_socket(vrf_id_t vrf_id)
|
||||||
{
|
{
|
||||||
int s;
|
int s;
|
||||||
|
|
||||||
s = socket(AF_INET, SOCK_DGRAM, 0);
|
frr_elevate_privs(&bfdd_privs) {
|
||||||
|
s = vrf_socket(AF_INET, SOCK_DGRAM, 0, vrf_id, NULL);
|
||||||
|
}
|
||||||
if (s == -1)
|
if (s == -1)
|
||||||
log_fatal("echo-socket: socket: %s", strerror(errno));
|
log_fatal("echo-socket: socket: %s", strerror(errno));
|
||||||
|
|
||||||
@ -1137,11 +1154,13 @@ int bp_echo_socket(void)
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
int bp_echov6_socket(void)
|
int bp_echov6_socket(vrf_id_t vrf_id)
|
||||||
{
|
{
|
||||||
int s;
|
int s;
|
||||||
|
|
||||||
s = socket(AF_INET6, SOCK_DGRAM, 0);
|
frr_elevate_privs(&bfdd_privs) {
|
||||||
|
s = vrf_socket(AF_INET6, SOCK_DGRAM, 0, vrf_id, NULL);
|
||||||
|
}
|
||||||
if (s == -1)
|
if (s == -1)
|
||||||
log_fatal("echov6-socket: socket: %s", strerror(errno));
|
log_fatal("echov6-socket: socket: %s", strerror(errno));
|
||||||
|
|
||||||
|
28
bfdd/bfdd.c
28
bfdd/bfdd.c
@ -34,6 +34,7 @@ DEFINE_MTYPE(BFDD, BFDD_LABEL, "long-lived label memory");
|
|||||||
DEFINE_MTYPE(BFDD, BFDD_CONTROL, "long-lived control socket memory");
|
DEFINE_MTYPE(BFDD, BFDD_CONTROL, "long-lived control socket memory");
|
||||||
DEFINE_MTYPE(BFDD, BFDD_SESSION_OBSERVER, "Session observer");
|
DEFINE_MTYPE(BFDD, BFDD_SESSION_OBSERVER, "Session observer");
|
||||||
DEFINE_MTYPE(BFDD, BFDD_NOTIFICATION, "short-lived control notification data");
|
DEFINE_MTYPE(BFDD, BFDD_NOTIFICATION, "short-lived control notification data");
|
||||||
|
DEFINE_MTYPE(BFDD, BFDD_VRF, "BFD VRF");
|
||||||
|
|
||||||
/* Master of threads. */
|
/* Master of threads. */
|
||||||
struct thread_master *master;
|
struct thread_master *master;
|
||||||
@ -85,12 +86,7 @@ static void sigterm_handler(void)
|
|||||||
/* Shutdown and free all protocol related memory. */
|
/* Shutdown and free all protocol related memory. */
|
||||||
bfd_shutdown();
|
bfd_shutdown();
|
||||||
|
|
||||||
/* Close all descriptors. */
|
bfd_vrf_terminate();
|
||||||
socket_close(&bglobal.bg_echo);
|
|
||||||
socket_close(&bglobal.bg_shop);
|
|
||||||
socket_close(&bglobal.bg_mhop);
|
|
||||||
socket_close(&bglobal.bg_shop6);
|
|
||||||
socket_close(&bglobal.bg_mhop6);
|
|
||||||
|
|
||||||
/* Terminate and free() FRR related memory. */
|
/* Terminate and free() FRR related memory. */
|
||||||
frr_fini();
|
frr_fini();
|
||||||
@ -155,13 +151,6 @@ static void bg_init(void)
|
|||||||
{
|
{
|
||||||
TAILQ_INIT(&bglobal.bg_bcslist);
|
TAILQ_INIT(&bglobal.bg_bcslist);
|
||||||
TAILQ_INIT(&bglobal.bg_obslist);
|
TAILQ_INIT(&bglobal.bg_obslist);
|
||||||
|
|
||||||
bglobal.bg_shop = bp_udp_shop();
|
|
||||||
bglobal.bg_mhop = bp_udp_mhop();
|
|
||||||
bglobal.bg_shop6 = bp_udp6_shop();
|
|
||||||
bglobal.bg_mhop6 = bp_udp6_mhop();
|
|
||||||
bglobal.bg_echo = bp_echo_socket();
|
|
||||||
bglobal.bg_echov6 = bp_echov6_socket();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
@ -213,19 +202,6 @@ int main(int argc, char *argv[])
|
|||||||
/* Initialize zebra connection. */
|
/* Initialize zebra connection. */
|
||||||
bfdd_zclient_init(&bfdd_privs);
|
bfdd_zclient_init(&bfdd_privs);
|
||||||
|
|
||||||
/* Add descriptors to the event loop. */
|
|
||||||
thread_add_read(master, bfd_recv_cb, NULL, bglobal.bg_shop,
|
|
||||||
&bglobal.bg_ev[0]);
|
|
||||||
thread_add_read(master, bfd_recv_cb, NULL, bglobal.bg_mhop,
|
|
||||||
&bglobal.bg_ev[1]);
|
|
||||||
thread_add_read(master, bfd_recv_cb, NULL, bglobal.bg_shop6,
|
|
||||||
&bglobal.bg_ev[2]);
|
|
||||||
thread_add_read(master, bfd_recv_cb, NULL, bglobal.bg_mhop6,
|
|
||||||
&bglobal.bg_ev[3]);
|
|
||||||
thread_add_read(master, bfd_recv_cb, NULL, bglobal.bg_echo,
|
|
||||||
&bglobal.bg_ev[4]);
|
|
||||||
thread_add_read(master, bfd_recv_cb, NULL, bglobal.bg_echov6,
|
|
||||||
&bglobal.bg_ev[5]);
|
|
||||||
thread_add_read(master, control_accept, NULL, bglobal.bg_csock,
|
thread_add_read(master, control_accept, NULL, bglobal.bg_csock,
|
||||||
&bglobal.bg_csockev);
|
&bglobal.bg_csockev);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user