vty_out(vty, "Mroute socket descriptor:");
vty_out(vty, " %d(%s)\n", pim->mroute_socket, vrf->name);
+ vty_out(vty, "PIM Register socket descriptor:");
+ vty_out(vty, " %d(%s)\n", pim->reg_sock, vrf->name);
pim_time_uptime(uptime, sizeof(uptime),
now - pim->mroute_socket_creation);
#include "pim_vty.h"
#include "pim_bsm.h"
#include "pim_mlag.h"
+#include "pim_sock.h"
static void pim_instance_terminate(struct pim_instance *pim)
{
pim_msdp_exit(pim);
+ close(pim->reg_sock);
+
pim_mroute_socket_disable(pim);
XFREE(MTYPE_PIM_PLIST_NAME, pim->spt.plist);
pim->last_route_change_time = -1;
+ pim->reg_sock = pim_reg_sock();
+ if (pim->reg_sock < 0)
+ assert(0);
+
/* MSDP global timer defaults. */
pim->msdp.hold_time = PIM_MSDP_PEER_HOLD_TIME;
pim->msdp.keep_alive = PIM_MSDP_PEER_KA_TIME;
struct thread *thread;
int mroute_socket;
+ int reg_sock; /* Socket to send register msg */
int64_t mroute_socket_creation;
int64_t mroute_add_events;
int64_t mroute_add_last;
if (!pinfo->pim_passive_enable)
++pinfo->pim_ifstat_reg_send;
- if (pim_msg_send(pinfo->pim_sock_fd, src, rpg->rpf_addr, buffer,
+ if (pim_msg_send(pinfo->pim->reg_sock, src, rpg->rpf_addr, buffer,
buf_size + PIM_MSG_REGISTER_LEN, ifp)) {
if (PIM_DEBUG_PIM_TRACE) {
zlog_debug(
}
#endif
+int pim_reg_sock(void)
+{
+ int fd;
+ long flags;
+
+ frr_with_privs (&pimd_privs) {
+ fd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
+ }
+
+ if (fd < 0) {
+ zlog_warn("Could not create raw socket: errno=%d: %s", errno,
+ safe_strerror(errno));
+ return PIM_SOCK_ERR_SOCKET;
+ }
+
+ if (sockopt_reuseaddr(fd)) {
+ close(fd);
+ return PIM_SOCK_ERR_REUSE;
+ }
+
+ flags = fcntl(fd, F_GETFL, 0);
+ if (flags < 0) {
+ zlog_warn(
+ "Could not get fcntl(F_GETFL,O_NONBLOCK) on socket fd=%d: errno=%d: %s",
+ fd, errno, safe_strerror(errno));
+ close(fd);
+ return PIM_SOCK_ERR_NONBLOCK_GETFL;
+ }
+
+ if (fcntl(fd, F_SETFL, flags | O_NONBLOCK)) {
+ zlog_warn(
+ "Could not set fcntl(F_SETFL,O_NONBLOCK) on socket fd=%d: errno=%d: %s",
+ fd, errno, safe_strerror(errno));
+ close(fd);
+ return PIM_SOCK_ERR_NONBLOCK_SETFL;
+ }
+
+ return fd;
+}
+
int pim_socket_mcast(int protocol, pim_addr ifaddr, struct interface *ifp,
uint8_t loop)
{
int pim_socket_getsockname(int fd, struct sockaddr *name, socklen_t *namelen);
+int pim_reg_sock(void);
+
#endif /* PIM_SOCK_H */