summaryrefslogtreecommitdiff
path: root/pimd/pim_msdp_socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'pimd/pim_msdp_socket.c')
-rw-r--r--pimd/pim_msdp_socket.c47
1 files changed, 36 insertions, 11 deletions
diff --git a/pimd/pim_msdp_socket.c b/pimd/pim_msdp_socket.c
index 0ce0971012..9473462e63 100644
--- a/pimd/pim_msdp_socket.c
+++ b/pimd/pim_msdp_socket.c
@@ -24,8 +24,11 @@
#include <lib/sockunion.h>
#include <lib/thread.h>
#include <lib/vty.h>
+#include <lib/if.h>
+#include <lib/vrf.h>
#include "pimd.h"
+#include "pim_sock.h"
#include "pim_msdp.h"
#include "pim_msdp_socket.h"
@@ -56,7 +59,7 @@ static void pim_msdp_update_sock_send_buffer_size(int fd)
static int pim_msdp_sock_accept(struct thread *thread)
{
union sockunion su;
- struct pim_msdp_listener *listener = THREAD_ARG(thread);
+ struct pim_instance *pim = THREAD_ARG(thread);
int accept_sock;
int msdp_sock;
struct pim_msdp_peer *mp;
@@ -70,9 +73,9 @@ static int pim_msdp_sock_accept(struct thread *thread)
zlog_err("accept_sock is negative value %d", accept_sock);
return -1;
}
- listener->thread = NULL;
- thread_add_read(master, pim_msdp_sock_accept, listener, accept_sock,
- &listener->thread);
+ pim->msdp.listener.thread = NULL;
+ thread_add_read(master, pim_msdp_sock_accept, pim, accept_sock,
+ &pim->msdp.listener.thread);
/* accept client connection. */
msdp_sock = sockunion_accept(accept_sock, &su);
@@ -83,9 +86,9 @@ static int pim_msdp_sock_accept(struct thread *thread)
}
/* see if have peer config for this */
- mp = pim_msdp_peer_find(su.sin.sin_addr);
+ mp = pim_msdp_peer_find(pim, su.sin.sin_addr);
if (!mp || !PIM_MSDP_PEER_IS_LISTENER(mp)) {
- ++msdp->rejected_accepts;
+ ++pim->msdp.rejected_accepts;
if (PIM_DEBUG_MSDP_EVENTS) {
zlog_err("msdp peer connection refused from %s",
sockunion2str(&su, buf, SU_ADDRSTRLEN));
@@ -117,15 +120,15 @@ static int pim_msdp_sock_accept(struct thread *thread)
}
/* global listener for the MSDP well know TCP port */
-int pim_msdp_sock_listen(void)
+int pim_msdp_sock_listen(struct pim_instance *pim)
{
int sock;
int socklen;
struct sockaddr_in sin;
int rc;
- struct pim_msdp_listener *listener = &msdp->listener;
+ struct pim_msdp_listener *listener = &pim->msdp.listener;
- if (msdp->flags & PIM_MSDPF_LISTENER) {
+ if (pim->msdp.flags & PIM_MSDPF_LISTENER) {
/* listener already setup */
return 0;
}
@@ -147,6 +150,17 @@ int pim_msdp_sock_listen(void)
sockopt_reuseaddr(sock);
sockopt_reuseport(sock);
+ if (pim->vrf_id != VRF_DEFAULT) {
+ struct interface *ifp =
+ if_lookup_by_name(pim->vrf->name, pim->vrf_id);
+ if (!ifp) {
+ zlog_err("%s: Unable to lookup vrf interface: %s",
+ __PRETTY_FUNCTION__, pim->vrf->name);
+ return -1;
+ }
+ pim_socket_bind(sock, ifp);
+ }
+
if (pimd_privs.change(ZPRIVS_RAISE)) {
zlog_err("pim_msdp_socket: could not raise privs, %s",
safe_strerror(errno));
@@ -178,10 +192,10 @@ int pim_msdp_sock_listen(void)
listener->fd = sock;
memcpy(&listener->su, &sin, socklen);
listener->thread = NULL;
- thread_add_read(msdp->master, pim_msdp_sock_accept, listener, sock,
+ thread_add_read(pim->msdp.master, pim_msdp_sock_accept, pim, sock,
&listener->thread);
- msdp->flags |= PIM_MSDPF_LISTENER;
+ pim->msdp.flags |= PIM_MSDPF_LISTENER;
return 0;
}
@@ -214,6 +228,17 @@ int pim_msdp_sock_connect(struct pim_msdp_peer *mp)
return -1;
}
+ if (mp->pim->vrf_id != VRF_DEFAULT) {
+ struct interface *ifp =
+ if_lookup_by_name(mp->pim->vrf->name, mp->pim->vrf_id);
+ if (!ifp) {
+ zlog_err("%s: Unable to lookup vrf interface: %s",
+ __PRETTY_FUNCTION__, mp->pim->vrf->name);
+ return -1;
+ }
+ pim_socket_bind(mp->fd, ifp);
+ }
+
set_nonblocking(mp->fd);
/* Set socket send buffer size */