#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"
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;
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);
}
/* 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));
}
/* 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;
}
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);
+ close(sock);
+ return -1;
+ }
+ if (pim_socket_bind(sock, ifp)) {
+ zlog_err("%s: Unable to bind to socket: %s",
+ __PRETTY_FUNCTION__, safe_strerror(errno));
+ close(sock);
+ return -1;
+ }
+ }
+
if (pimd_privs.change(ZPRIVS_RAISE)) {
zlog_err("pim_msdp_socket: could not raise privs, %s",
safe_strerror(errno));
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;
}
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;
+ }
+ if (pim_socket_bind(mp->fd, ifp)) {
+ zlog_err("%s: Unable to bind to socket: %s",
+ __PRETTY_FUNCTION__, safe_strerror(errno));
+ close(mp->fd);
+ mp->fd = -1;
+ return -1;
+ }
+ }
+
set_nonblocking(mp->fd);
/* Set socket send buffer size */