diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index b94fb1c767..e9ef72c637 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -2438,10 +2438,11 @@ DEFUN (ip_pim_rp, return CMD_WARNING; } - if (pim_nexthop_lookup(&qpim_rp.source_nexthop, qpim_rp.rpf_addr, NULL) != 0) { - vty_out(vty, "%% No Path to RP address specified: %s", argv[idx_ipv4]->arg); - return CMD_WARNING; - } + if (!pim_rp_setup ()) + { + vty_out(vty, "%% No Path to RP address specified: %s", argv[idx_ipv4]->arg); + return CMD_WARNING; + } return CMD_SUCCESS; } diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c index 26d108bcaa..e7c03792cd 100644 --- a/pimd/pim_rp.c +++ b/pimd/pim_rp.c @@ -29,9 +29,38 @@ #include "pim_rp.h" #include "pim_str.h" #include "pim_rpf.h" +#include "pim_sock.h" static int i_am_rp = 0; +/* + * The Raw socket to pump packets down + * if we are the RP + */ +static int fd_rp = -1; + +static void +pim_rp_create_socket (void) +{ + fd_rp = pim_socket_raw (IPPROTO_RAW); + if (pim_socket_bind (fd_rp, qpim_rp.source_nexthop.interface) != 0) + zlog_debug ("Unable to Bind to a particular socket"); +} + +int +pim_rp_setup (void) +{ + if (pim_nexthop_lookup (&qpim_rp.source_nexthop, qpim_rp.rpf_addr, NULL) != 0) + { + zlog_err ("Unable to lookup nexthop for rp specified"); + return 0; + } + + pim_rp_create_socket (); + + return 1; +} + /* * Checks to see if we should elect ourself the actual RP */ @@ -54,6 +83,7 @@ pim_rp_check_rp (struct in_addr old, struct in_addr new) if (new.s_addr == qpim_rp.rpf_addr.s_addr) { i_am_rp = 1; + pim_rp_create_socket(); return; } diff --git a/pimd/pim_rp.h b/pimd/pim_rp.h index bb785e7efc..35a7e9dfc7 100644 --- a/pimd/pim_rp.h +++ b/pimd/pim_rp.h @@ -21,6 +21,7 @@ #ifndef PIM_RP_H #define PIM_RP_H +int pim_rp_setup (void); void pim_rp_check_rp (struct in_addr old, struct in_addr new); int pim_rp_i_am_rp (struct in_addr group); int pim_rp_set_upstream_addr (struct in_addr *up, struct in_addr source);