mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-12 14:27:36 +00:00
pimd: Call code to create appropriate MRT_TABLE
When dealing with vrf's we need to create a table within the linux kernel to handle the vrf. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
parent
a88e628d29
commit
cdbfaec57b
@ -46,36 +46,53 @@ static struct thread *qpim_mroute_socket_reader = NULL;
|
|||||||
|
|
||||||
static void mroute_read_on(void);
|
static void mroute_read_on(void);
|
||||||
|
|
||||||
static int pim_mroute_set(int fd, int enable)
|
static int pim_mroute_set(struct pim_instance *pim, int enable)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
int opt = enable ? MRT_INIT : MRT_DONE;
|
int opt = enable ? MRT_INIT : MRT_DONE;
|
||||||
socklen_t opt_len = sizeof(opt);
|
socklen_t opt_len = sizeof(opt);
|
||||||
long flags;
|
long flags;
|
||||||
|
|
||||||
err = setsockopt(fd, IPPROTO_IP, opt, &opt, opt_len);
|
err = setsockopt(pim->mroute_socket, IPPROTO_IP, opt, &opt, opt_len);
|
||||||
if (err) {
|
if (err) {
|
||||||
zlog_warn(
|
zlog_warn(
|
||||||
"%s %s: failure: setsockopt(fd=%d,IPPROTO_IP,%s=%d): errno=%d: %s",
|
"%s %s: failure: setsockopt(fd=%d,IPPROTO_IP,%s=%d): errno=%d: %s",
|
||||||
__FILE__, __PRETTY_FUNCTION__, fd,
|
__FILE__, __PRETTY_FUNCTION__, pim->mroute_socket,
|
||||||
enable ? "MRT_INIT" : "MRT_DONE", opt, errno,
|
enable ? "MRT_INIT" : "MRT_DONE", opt, errno,
|
||||||
safe_strerror(errno));
|
safe_strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
setsockopt_so_recvbuf(fd, 1024 * 1024 * 8);
|
/*
|
||||||
|
* We need to create the VRF table for the pim mroute_socket
|
||||||
|
*/
|
||||||
|
if (pim->vrf_id != VRF_DEFAULT) {
|
||||||
|
opt = pim->vrf_id;
|
||||||
|
err = setsockopt(pim->mroute_socket, IPPROTO_IP, MRT_TABLE,
|
||||||
|
&opt, opt_len);
|
||||||
|
if (err) {
|
||||||
|
zlog_warn(
|
||||||
|
"%s %s: failure: setsockopt(fd=%d,IPPROTO_IP, MRT_TABLE=%d): errno=%d: %s",
|
||||||
|
__FILE__, __PRETTY_FUNCTION__,
|
||||||
|
pim->mroute_socket, opt, errno,
|
||||||
|
safe_strerror(errno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
flags = fcntl(fd, F_GETFL, 0);
|
setsockopt_so_recvbuf(pim->mroute_socket, 1024 * 1024 * 8);
|
||||||
|
|
||||||
|
flags = fcntl(pim->mroute_socket, F_GETFL, 0);
|
||||||
if (flags < 0) {
|
if (flags < 0) {
|
||||||
zlog_warn("Could not get flags on socket fd:%d %d %s", fd,
|
zlog_warn("Could not get flags on socket fd:%d %d %s",
|
||||||
errno, safe_strerror(errno));
|
pim->mroute_socket, errno, safe_strerror(errno));
|
||||||
close(fd);
|
close(pim->mroute_socket);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (fcntl(fd, F_SETFL, flags | O_NONBLOCK)) {
|
if (fcntl(pim->mroute_socket, F_SETFL, flags | O_NONBLOCK)) {
|
||||||
zlog_warn("Could not set O_NONBLOCK on socket fd:%d %d %s", fd,
|
zlog_warn("Could not set O_NONBLOCK on socket fd:%d %d %s",
|
||||||
errno, safe_strerror(errno));
|
pim->mroute_socket, errno, safe_strerror(errno));
|
||||||
close(fd);
|
close(pim->mroute_socket);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,7 +101,7 @@ static int pim_mroute_set(int fd, int enable)
|
|||||||
int upcalls = IGMPMSG_WRVIFWHOLE;
|
int upcalls = IGMPMSG_WRVIFWHOLE;
|
||||||
opt = MRT_PIM;
|
opt = MRT_PIM;
|
||||||
|
|
||||||
err = setsockopt(fd, IPPROTO_IP, opt, &upcalls,
|
err = setsockopt(pim->mroute_socket, IPPROTO_IP, opt, &upcalls,
|
||||||
sizeof(upcalls));
|
sizeof(upcalls));
|
||||||
if (err) {
|
if (err) {
|
||||||
zlog_warn(
|
zlog_warn(
|
||||||
@ -678,15 +695,16 @@ int pim_mroute_socket_enable(struct pim_instance *pim)
|
|||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pim_mroute_set(fd, 1)) {
|
pim->mroute_socket = fd;
|
||||||
|
if (pim_mroute_set(pim, 1)) {
|
||||||
zlog_warn(
|
zlog_warn(
|
||||||
"Could not enable mroute on socket fd=%d: errno=%d: %s",
|
"Could not enable mroute on socket fd=%d: errno=%d: %s",
|
||||||
fd, errno, safe_strerror(errno));
|
fd, errno, safe_strerror(errno));
|
||||||
close(fd);
|
close(fd);
|
||||||
|
pim->mroute_socket = -1;
|
||||||
return -3;
|
return -3;
|
||||||
}
|
}
|
||||||
|
|
||||||
pim->mroute_socket = fd;
|
|
||||||
pim->mroute_socket_creation = pim_time_monotonic_sec();
|
pim->mroute_socket_creation = pim_time_monotonic_sec();
|
||||||
|
|
||||||
mroute_read_on();
|
mroute_read_on();
|
||||||
@ -696,7 +714,7 @@ int pim_mroute_socket_enable(struct pim_instance *pim)
|
|||||||
|
|
||||||
int pim_mroute_socket_disable(struct pim_instance *pim)
|
int pim_mroute_socket_disable(struct pim_instance *pim)
|
||||||
{
|
{
|
||||||
if (pim_mroute_set(pim->mroute_socket, 0)) {
|
if (pim_mroute_set(pim, 0)) {
|
||||||
zlog_warn(
|
zlog_warn(
|
||||||
"Could not disable mroute on socket fd=%d: errno=%d: %s",
|
"Could not disable mroute on socket fd=%d: errno=%d: %s",
|
||||||
pimg->mroute_socket, errno, safe_strerror(errno));
|
pimg->mroute_socket, errno, safe_strerror(errno));
|
||||||
|
Loading…
Reference in New Issue
Block a user