diff options
| author | Donald Sharp <sharpd@cumulusnetwroks.com> | 2016-07-27 20:13:16 -0400 |
|---|---|---|
| committer | Donald Sharp <sharpd@cumulusnetworks.com> | 2016-12-21 20:26:04 -0500 |
| commit | 728cd663005142392693bdefdef489e4991949de (patch) | |
| tree | d132c7bf3b0e5008f698f27357863c88adde8851 /pimd/pim_sock.c | |
| parent | 346cffe31ef871d7876aacafea9cf4086146f110 (diff) | |
pimd: Create pim_socket_bind
Allow a socket to be bound to a specified
interface.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Diffstat (limited to 'pimd/pim_sock.c')
| -rw-r--r-- | pimd/pim_sock.c | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/pimd/pim_sock.c b/pimd/pim_sock.c index b100c37b46..70b18b14a4 100644 --- a/pimd/pim_sock.c +++ b/pimd/pim_sock.c @@ -68,6 +68,28 @@ int pim_socket_raw(int protocol) return fd; } +/* + * Given a socket and a interface, + * Bind that socket to that interface + */ +int pim_socket_bind (int fd, struct interface *ifp) +{ + int ret; + + if (pimd_privs.change (ZPRIVS_RAISE)) + zlog_err ("%s: could not raise privs, %s", + __PRETTY_FUNCTION__, safe_strerror (errno)); + + ret = setsockopt (fd, SOL_SOCKET, + SO_BINDTODEVICE, ifp->name, strlen (ifp->name)); + + if (pimd_privs.change (ZPRIVS_LOWER)) + zlog_err ("%s: could not lower privs, %s", + __PRETTY_FUNCTION__, safe_strerror (errno)); + + return ret; +} + int pim_socket_mcast(int protocol, struct in_addr ifaddr, int ifindex, u_char loop) { int fd; @@ -87,17 +109,7 @@ int pim_socket_mcast(int protocol, struct in_addr ifaddr, int ifindex, u_char lo ifp = if_lookup_by_index_vrf (ifindex, VRF_DEFAULT); - if (pimd_privs.change (ZPRIVS_RAISE)) - zlog_err ("%s: could not raise privs, %s", - __PRETTY_FUNCTION__, safe_strerror (errno)); - - ret = setsockopt (fd, SOL_SOCKET, - SO_BINDTODEVICE, ifp->name, strlen (ifp->name)); - - if (pimd_privs.change (ZPRIVS_LOWER)) - zlog_err ("%s: could not lower privs, %s", - __PRETTY_FUNCTION__, safe_strerror (errno)); - + ret = pim_socket_bind (fd, ifp); if (ret) { zlog_warn("Could not set fd: %d for interface: %s to device", |
