Merge branch 'master' of https://github.com/FRRouting/frr into pim_dev

This commit is contained in:
Chirag Shah 2017-06-06 09:59:29 -07:00
commit f6a1dd837b
20 changed files with 197 additions and 115 deletions

View File

@ -40,8 +40,6 @@
#include "bgpd/bgp_updgrp.h" #include "bgpd/bgp_updgrp.h"
#include "bgpd/bgp_mplsvpn.h" #include "bgpd/bgp_mplsvpn.h"
#define BGP_ADDPATH_STR 20
unsigned long conf_bgp_debug_as4; unsigned long conf_bgp_debug_as4;
unsigned long conf_bgp_debug_neighbor_events; unsigned long conf_bgp_debug_neighbor_events;
unsigned long conf_bgp_debug_events; unsigned long conf_bgp_debug_events;
@ -2139,7 +2137,12 @@ bgp_debug_rdpfxpath2str (struct prefix_rd *prd, union prefixconstptr pu,
{ {
char rd_buf[RD_ADDRSTRLEN]; char rd_buf[RD_ADDRSTRLEN];
char pfx_buf[PREFIX_STRLEN]; char pfx_buf[PREFIX_STRLEN];
char pathid_buf[BGP_ADDPATH_STR]; /* ' with addpath ID ' 17
* max strlen of uint32 + 10
* +/- (just in case) + 1
* null terminator + 1
* ============================ 29 */
char pathid_buf[30];
if (size < BGP_PRD_PATH_STRLEN) if (size < BGP_PRD_PATH_STRLEN)
return NULL; return NULL;
@ -2147,7 +2150,7 @@ bgp_debug_rdpfxpath2str (struct prefix_rd *prd, union prefixconstptr pu,
/* Note: Path-id is created by default, but only included in update sometimes. */ /* Note: Path-id is created by default, but only included in update sometimes. */
pathid_buf[0] = '\0'; pathid_buf[0] = '\0';
if (addpath_valid) if (addpath_valid)
sprintf(pathid_buf, " with addpath ID %d", addpath_id); snprintf(pathid_buf, sizeof(pathid_buf), " with addpath ID %u", addpath_id);
if (prd) if (prd)
snprintf (str, size, "RD %s %s%s", snprintf (str, size, "RD %s %s%s",

View File

@ -10988,10 +10988,10 @@ bgp_route_init (void)
install_element (BGP_IPV6_NODE, &ipv6_bgp_network_route_map_cmd); install_element (BGP_IPV6_NODE, &ipv6_bgp_network_route_map_cmd);
install_element (BGP_IPV6_NODE, &no_bgp_table_map_cmd); install_element (BGP_IPV6_NODE, &no_bgp_table_map_cmd);
install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_cmd); install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_cmd);
install_element (BGP_IPV6_NODE, &ipv6_bgp_network_label_index_cmd); install_element (BGP_IPV6L_NODE, &ipv6_bgp_network_label_index_cmd);
install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_label_index_cmd); install_element (BGP_IPV6L_NODE, &no_ipv6_bgp_network_label_index_cmd);
install_element (BGP_IPV6_NODE, &ipv6_bgp_network_label_index_route_map_cmd); install_element (BGP_IPV6L_NODE, &ipv6_bgp_network_label_index_route_map_cmd);
install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_label_index_route_map_cmd); install_element (BGP_IPV6L_NODE, &no_ipv6_bgp_network_label_index_route_map_cmd);
install_element (BGP_IPV6_NODE, &ipv6_aggregate_address_cmd); install_element (BGP_IPV6_NODE, &ipv6_aggregate_address_cmd);
install_element (BGP_IPV6_NODE, &no_ipv6_aggregate_address_cmd); install_element (BGP_IPV6_NODE, &no_ipv6_aggregate_address_cmd);

View File

@ -651,17 +651,6 @@ subgroup_packets_to_build (struct update_subgroup *subgrp)
return 0; return 0;
} }
static void
bgp_info_addpath_tx_str (int addpath_encode, u_int32_t addpath_tx_id,
char *buf)
{
buf[0] = '\0';
if (addpath_encode)
sprintf(buf, " with addpath ID %d", addpath_tx_id);
else
buf[0] = '\0';
}
/* Make BGP update packet. */ /* Make BGP update packet. */
struct bpacket * struct bpacket *
subgroup_update_packet (struct update_subgroup *subgrp) subgroup_update_packet (struct update_subgroup *subgrp)
@ -1079,11 +1068,21 @@ subgroup_default_update_packet (struct update_subgroup *subgrp,
{ {
char attrstr[BUFSIZ]; char attrstr[BUFSIZ];
char buf[PREFIX_STRLEN]; char buf[PREFIX_STRLEN];
/* ' with addpath ID ' 17
* max strlen of uint32 + 10
* +/- (just in case) + 1
* null terminator + 1
* ============================ 29 */
char tx_id_buf[30]; char tx_id_buf[30];
attrstr[0] = '\0'; attrstr[0] = '\0';
bgp_dump_attr (attr, attrstr, BUFSIZ); bgp_dump_attr (attr, attrstr, BUFSIZ);
bgp_info_addpath_tx_str (addpath_encode, BGP_ADDPATH_TX_ID_FOR_DEFAULT_ORIGINATE, tx_id_buf);
if (addpath_encode)
snprintf(tx_id_buf, sizeof (tx_id_buf), " with addpath ID %u",
BGP_ADDPATH_TX_ID_FOR_DEFAULT_ORIGINATE);
zlog_debug ("u%" PRIu64 ":s%" PRIu64 " send UPDATE %s%s %s", zlog_debug ("u%" PRIu64 ":s%" PRIu64 " send UPDATE %s%s %s",
(SUBGRP_UPDGRP (subgrp))->id, subgrp->id, (SUBGRP_UPDGRP (subgrp))->id, subgrp->id,
prefix2str (&p, buf, sizeof (buf)), prefix2str (&p, buf, sizeof (buf)),
@ -1153,9 +1152,17 @@ subgroup_default_withdraw_packet (struct update_subgroup *subgrp)
if (bgp_debug_update(NULL, &p, subgrp->update_group, 0)) if (bgp_debug_update(NULL, &p, subgrp->update_group, 0))
{ {
char buf[PREFIX_STRLEN]; char buf[PREFIX_STRLEN];
char tx_id_buf[INET6_BUFSIZ]; /* ' with addpath ID ' 17
* max strlen of uint32 + 10
* +/- (just in case) + 1
* null terminator + 1
* ============================ 29 */
char tx_id_buf[30];
if (addpath_encode)
snprintf(tx_id_buf, sizeof (tx_id_buf), " with addpath ID %u",
BGP_ADDPATH_TX_ID_FOR_DEFAULT_ORIGINATE);
bgp_info_addpath_tx_str (addpath_encode, BGP_ADDPATH_TX_ID_FOR_DEFAULT_ORIGINATE, tx_id_buf);
zlog_debug ("u%" PRIu64 ":s%" PRIu64 " send UPDATE %s%s -- unreachable", zlog_debug ("u%" PRIu64 ":s%" PRIu64 " send UPDATE %s%s -- unreachable",
(SUBGRP_UPDGRP (subgrp))->id, subgrp->id, (SUBGRP_UPDGRP (subgrp))->id, subgrp->id,
prefix2str (&p, buf, sizeof (buf)), tx_id_buf); prefix2str (&p, buf, sizeof (buf)), tx_id_buf);

View File

@ -12244,6 +12244,7 @@ lcommunity_list_set_vty (struct vty *vty, int argc, struct cmd_token **argv,
return CMD_WARNING; return CMD_WARNING;
} }
idx = 0;
argv_find (argv, argc, "AA:BB:CC", &idx); argv_find (argv, argc, "AA:BB:CC", &idx);
argv_find (argv, argc, "LINE", &idx); argv_find (argv, argc, "LINE", &idx);
/* Concat community string argument. */ /* Concat community string argument. */

View File

@ -393,6 +393,8 @@ thread_master_create (void)
rv->handler.pfdcount = 0; rv->handler.pfdcount = 0;
rv->handler.pfds = XCALLOC (MTYPE_THREAD_MASTER, rv->handler.pfds = XCALLOC (MTYPE_THREAD_MASTER,
sizeof (struct pollfd) * rv->handler.pfdsize); sizeof (struct pollfd) * rv->handler.pfdsize);
rv->handler.copy = XCALLOC (MTYPE_THREAD_MASTER,
sizeof (struct pollfd) * rv->handler.pfdsize);
return rv; return rv;
} }
@ -544,6 +546,7 @@ thread_master_free (struct thread_master *m)
close (m->io_pipe[1]); close (m->io_pipe[1]);
XFREE (MTYPE_THREAD_MASTER, m->handler.pfds); XFREE (MTYPE_THREAD_MASTER, m->handler.pfds);
XFREE (MTYPE_THREAD_MASTER, m->handler.copy);
XFREE (MTYPE_THREAD_MASTER, m); XFREE (MTYPE_THREAD_MASTER, m);
pthread_mutex_lock (&cpu_record_mtx); pthread_mutex_lock (&cpu_record_mtx);
@ -647,9 +650,6 @@ static int
fd_poll (struct thread_master *m, struct pollfd *pfds, nfds_t pfdsize, fd_poll (struct thread_master *m, struct pollfd *pfds, nfds_t pfdsize,
nfds_t count, struct timeval *timer_wait) nfds_t count, struct timeval *timer_wait)
{ {
if (count == 0)
return 0;
/* If timer_wait is null here, that means poll() should block indefinitely, /* If timer_wait is null here, that means poll() should block indefinitely,
* unless the thread_master has overriden it by setting ->selectpoll_timeout. * unless the thread_master has overriden it by setting ->selectpoll_timeout.
* If the value is positive, it specifies the maximum number of milliseconds * If the value is positive, it specifies the maximum number of milliseconds
@ -1231,14 +1231,12 @@ thread_fetch (struct thread_master *m, struct thread *fetch)
timer_wait = &timer_val; timer_wait = &timer_val;
} }
/* copy pollfds so we can unlock during blocking calls to poll() */
struct pollfd pfds[m->handler.pfdsize];
unsigned int count = m->handler.pfdcount + m->handler.pfdcountsnmp; unsigned int count = m->handler.pfdcount + m->handler.pfdcountsnmp;
memcpy (pfds, m->handler.pfds, count * sizeof (struct pollfd)); memcpy (m->handler.copy, m->handler.pfds, count * sizeof (struct pollfd));
pthread_mutex_unlock (&m->mtx); pthread_mutex_unlock (&m->mtx);
{ {
num = fd_poll (m, pfds, m->handler.pfdsize, count, timer_wait); num = fd_poll (m, m->handler.copy, m->handler.pfdsize, count, timer_wait);
} }
pthread_mutex_lock (&m->mtx); pthread_mutex_lock (&m->mtx);
@ -1263,7 +1261,7 @@ thread_fetch (struct thread_master *m, struct thread *fetch)
/* Got IO, process it */ /* Got IO, process it */
if (num > 0) if (num > 0)
thread_process_io (m, pfds, num, count); thread_process_io (m, m->handler.copy, num, count);
#if 0 #if 0
/* If any threads were made ready above (I/O or foreground timer), /* If any threads were made ready above (I/O or foreground timer),

View File

@ -53,7 +53,10 @@ struct fd_handler
nfds_t pfdcountsnmp; nfds_t pfdcountsnmp;
/* number of pfd that fit in the allocated space of pfds */ /* number of pfd that fit in the allocated space of pfds */
nfds_t pfdsize; nfds_t pfdsize;
/* file descriptors to monitor for i/o */
struct pollfd *pfds; struct pollfd *pfds;
/* chunk used for temp copy of pollfds */
struct pollfd *copy;
}; };
/* Master of the theads. */ /* Master of the theads. */

View File

@ -619,21 +619,23 @@ DEFUN (area_filter_list,
"Filter networks sent to this area\n" "Filter networks sent to this area\n"
"Filter networks sent from this area\n") "Filter networks sent from this area\n")
{ {
int idx_ipv4 = 1; char *inout = argv[argc - 1]->text;
int idx_word = 4; char *areaid = argv[1]->arg;
char *plistname = argv[4]->arg;
struct ospf6_area *area; struct ospf6_area *area;
struct prefix_list *plist; struct prefix_list *plist;
OSPF6_CMD_AREA_GET (argv[idx_ipv4]->arg, area); OSPF6_CMD_AREA_GET (areaid, area);
plist = prefix_list_lookup (AFI_IP6, argv[idx_ipv4]->arg); plist = prefix_list_lookup (AFI_IP6, plistname);
if (strncmp (argv[idx_word]->arg, "in", 2) == 0) if (strmatch (inout, "in"))
{ {
PREFIX_LIST_IN (area) = plist; PREFIX_LIST_IN (area) = plist;
if (PREFIX_NAME_IN (area)) if (PREFIX_NAME_IN (area))
free (PREFIX_NAME_IN (area)); free (PREFIX_NAME_IN (area));
PREFIX_NAME_IN (area) = strdup (argv[idx_ipv4]->arg); PREFIX_NAME_IN (area) = strdup (plistname);
ospf6_abr_reimport (area); ospf6_abr_reimport (area);
} }
else else
@ -642,7 +644,7 @@ DEFUN (area_filter_list,
if (PREFIX_NAME_OUT (area)) if (PREFIX_NAME_OUT (area))
free (PREFIX_NAME_OUT (area)); free (PREFIX_NAME_OUT (area));
PREFIX_NAME_OUT (area) = strdup (argv[idx_ipv4]->arg); PREFIX_NAME_OUT (area) = strdup (plistname);
ospf6_abr_enable_area (area); ospf6_abr_enable_area (area);
} }
@ -661,16 +663,18 @@ DEFUN (no_area_filter_list,
"Filter networks sent to this area\n" "Filter networks sent to this area\n"
"Filter networks sent from this area\n") "Filter networks sent from this area\n")
{ {
int idx_ipv4 = 2; char *inout = argv[argc - 1]->text;
int idx_word = 5; char *areaid = argv[2]->arg;
char *plistname = argv[5]->arg;
struct ospf6_area *area; struct ospf6_area *area;
OSPF6_CMD_AREA_GET (argv[idx_ipv4]->arg, area); OSPF6_CMD_AREA_GET (areaid, area);
if (strncmp (argv[idx_word]->arg, "in", 2) == 0) if (strmatch (inout, "in"))
{ {
if (PREFIX_NAME_IN (area)) if (PREFIX_NAME_IN (area))
if (strcmp (PREFIX_NAME_IN (area), argv[idx_ipv4]->arg) != 0) if (!strmatch (PREFIX_NAME_IN (area), plistname))
return CMD_SUCCESS; return CMD_SUCCESS;
PREFIX_LIST_IN (area) = NULL; PREFIX_LIST_IN (area) = NULL;
@ -683,7 +687,7 @@ DEFUN (no_area_filter_list,
else else
{ {
if (PREFIX_NAME_OUT (area)) if (PREFIX_NAME_OUT (area))
if (strcmp (PREFIX_NAME_OUT (area), argv[idx_ipv4]->arg) != 0) if (!strmatch (PREFIX_NAME_OUT (area), plistname))
return CMD_SUCCESS; return CMD_SUCCESS;
PREFIX_LIST_OUT (area) = NULL; PREFIX_LIST_OUT (area) = NULL;

View File

@ -3535,7 +3535,6 @@ show_ip_ospf_interface_common (struct vty *vty, struct ospf *ospf, int argc,
if (use_json) if (use_json)
{ {
json = json_object_new_object(); json = json_object_new_object();
json_interface_sub = json_object_new_object();
} }
if (ospf->instance) if (ospf->instance)
@ -3554,7 +3553,11 @@ show_ip_ospf_interface_common (struct vty *vty, struct ospf *ospf, int argc,
{ {
if (ospf_oi_count(ifp)) if (ospf_oi_count(ifp))
{ {
if (use_json)
json_interface_sub = json_object_new_object();
show_ip_ospf_interface_sub (vty, ospf, ifp, json_interface_sub, use_json); show_ip_ospf_interface_sub (vty, ospf, ifp, json_interface_sub, use_json);
if (use_json) if (use_json)
json_object_object_add (json, ifp->name, json_interface_sub); json_object_object_add (json, ifp->name, json_interface_sub);
} }
@ -3572,7 +3575,11 @@ show_ip_ospf_interface_common (struct vty *vty, struct ospf *ospf, int argc,
} }
else else
{ {
if (use_json)
json_interface_sub = json_object_new_object();
show_ip_ospf_interface_sub (vty, ospf, ifp, json_interface_sub, use_json); show_ip_ospf_interface_sub (vty, ospf, ifp, json_interface_sub, use_json);
if (use_json) if (use_json)
json_object_object_add(json, ifp->name, json_interface_sub); json_object_object_add(json, ifp->name, json_interface_sub);
} }

View File

@ -1279,7 +1279,7 @@ pim_ifchannel_scan_forward_start (struct interface *new_ifp)
* we get End of Message * we get End of Message
*/ */
void void
pim_ifchannel_set_star_g_join_state (struct pim_ifchannel *ch, int eom, uint8_t source_flags, uint8_t join) pim_ifchannel_set_star_g_join_state (struct pim_ifchannel *ch, int eom, uint8_t source_flags, uint8_t join, uint8_t starg_alone)
{ {
struct pim_ifchannel *child; struct pim_ifchannel *child;
struct listnode *ch_node; struct listnode *ch_node;
@ -1294,10 +1294,11 @@ pim_ifchannel_set_star_g_join_state (struct pim_ifchannel *ch, int eom, uint8_t
for (ALL_LIST_ELEMENTS_RO (ch->sources, ch_node, child)) for (ALL_LIST_ELEMENTS_RO (ch->sources, ch_node, child))
{ {
/* Only *,G Join received and no (SG-RPT) prune. /* Only *,G Join received and no (SG-RPT) prune.
eom = 1, only (W,G) join_alone is true, WC and RPT are set.
Scan all S,G associated to G and if any SG-RPT Scan all S,G associated to G and if any SG-RPT
remove the SG-RPT flag. remove the SG-RPT flag.
*/ */
if (join && (source_flags & PIM_RPT_BIT_MASK) && if (eom && starg_alone && (source_flags & PIM_RPT_BIT_MASK) &&
(source_flags & PIM_WILDCARD_BIT_MASK)) (source_flags & PIM_WILDCARD_BIT_MASK))
{ {
if (PIM_IF_FLAG_TEST_S_G_RPT(child->flags)) if (PIM_IF_FLAG_TEST_S_G_RPT(child->flags))
@ -1308,25 +1309,13 @@ pim_ifchannel_set_star_g_join_state (struct pim_ifchannel *ch, int eom, uint8_t
if (up) if (up)
{ {
if (PIM_DEBUG_TRACE) if (PIM_DEBUG_TRACE)
zlog_debug ("%s: clearing SGRpt flag, add inherit oif to up %s ", __PRETTY_FUNCTION__, up->sg_str); zlog_debug ("%s: SGRpt flag is cleared, add inherit oif to up %s",
__PRETTY_FUNCTION__, up->sg_str);
pim_channel_add_oif (up->channel_oil, ch->interface, PIM_OIF_FLAG_PROTO_STAR); pim_channel_add_oif (up->channel_oil, ch->interface, PIM_OIF_FLAG_PROTO_STAR);
pim_ifchannel_ifjoin_switch(__PRETTY_FUNCTION__, child, PIM_IFJOIN_JOIN);
} }
} }
} }
/* Received SG-RPT Prune delete oif from S,G */
else if (join == 0 && (source_flags & PIM_RPT_BIT_MASK) &&
!(source_flags & PIM_WILDCARD_BIT_MASK))
{
struct pim_upstream *up = child->upstream;
PIM_IF_FLAG_SET_S_G_RPT(child->flags);
if (up)
{
if (PIM_DEBUG_TRACE)
zlog_debug ("%s: SGRpt Set, del inherit oif from up %s", __PRETTY_FUNCTION__, up->sg_str);
pim_channel_del_oif (up->channel_oil, ch->interface, PIM_OIF_FLAG_PROTO_STAR);
}
}
if (!PIM_IF_FLAG_TEST_S_G_RPT(child->flags)) if (!PIM_IF_FLAG_TEST_S_G_RPT(child->flags))
continue; continue;

View File

@ -150,7 +150,7 @@ void pim_ifchannel_update_my_assert_metric(struct pim_ifchannel *ch);
void pim_ifchannel_update_assert_tracking_desired(struct pim_ifchannel *ch); void pim_ifchannel_update_assert_tracking_desired(struct pim_ifchannel *ch);
void pim_ifchannel_scan_forward_start (struct interface *new_ifp); void pim_ifchannel_scan_forward_start (struct interface *new_ifp);
void pim_ifchannel_set_star_g_join_state (struct pim_ifchannel *ch, int eom, uint8_t source_flags, uint8_t join); void pim_ifchannel_set_star_g_join_state (struct pim_ifchannel *ch, int eom, uint8_t source_flags, uint8_t join, uint8_t starg_alone);
int pim_ifchannel_compare (struct pim_ifchannel *ch1, struct pim_ifchannel *ch2); int pim_ifchannel_compare (struct pim_ifchannel *ch1, struct pim_ifchannel *ch2);

View File

@ -228,7 +228,8 @@ int pim_joinprune_recv(struct interface *ifp,
uint16_t msg_num_joined_sources; uint16_t msg_num_joined_sources;
uint16_t msg_num_pruned_sources; uint16_t msg_num_pruned_sources;
int source; int source;
struct pim_ifchannel *ch = NULL; struct pim_ifchannel *starg_ch = NULL, *sg_ch = NULL;
uint8_t starg_alone = 0;
memset (&sg, 0, sizeof (struct prefix_sg)); memset (&sg, 0, sizeof (struct prefix_sg));
addr_offset = pim_parse_addr_group (&sg, addr_offset = pim_parse_addr_group (&sg,
@ -287,9 +288,10 @@ int pim_joinprune_recv(struct interface *ifp,
if (sg.src.s_addr == INADDR_ANY) if (sg.src.s_addr == INADDR_ANY)
{ {
ch = pim_ifchannel_find (ifp, &sg); starg_alone = 1;
if (ch) starg_ch = pim_ifchannel_find (ifp, &sg);
pim_ifchannel_set_star_g_join_state (ch, 0, msg_source_flags, 1); if (starg_ch)
pim_ifchannel_set_star_g_join_state (starg_ch, 0, msg_source_flags, 1, starg_alone);
} }
} }
@ -302,16 +304,33 @@ int pim_joinprune_recv(struct interface *ifp,
return -8; return -8;
} }
buf += addr_offset; sg_ch = pim_ifchannel_find (ifp, &sg);
buf += addr_offset;
starg_alone = 0;
recv_prune(ifp, neigh, msg_holdtime, recv_prune(ifp, neigh, msg_holdtime,
msg_upstream_addr.u.prefix4, msg_upstream_addr.u.prefix4,
&sg, &sg,
msg_source_flags); msg_source_flags);
/* Received SG-RPT Prune delete oif from specific S,G */
if (starg_ch && sg_ch && (msg_source_flags & PIM_RPT_BIT_MASK)
&& !(msg_source_flags & PIM_WILDCARD_BIT_MASK))
{
struct pim_upstream *up = sg_ch->upstream;
PIM_IF_FLAG_SET_S_G_RPT(sg_ch->flags);
if (up)
{
if (PIM_DEBUG_TRACE)
zlog_debug ("%s: SGRpt flag is set, del inherit oif from up %s",
__PRETTY_FUNCTION__, up->sg_str);
pim_channel_del_oif (up->channel_oil, starg_ch->interface, PIM_OIF_FLAG_PROTO_STAR);
}
}
} }
if (ch) if (starg_ch)
pim_ifchannel_set_star_g_join_state (ch, 1, msg_source_flags, 0); pim_ifchannel_set_star_g_join_state (starg_ch, 1, msg_source_flags, 0, starg_alone);
ch = NULL; starg_ch = NULL;
} /* scan groups */ } /* scan groups */
return 0; return 0;
@ -518,6 +537,10 @@ int pim_joinprune_send(struct pim_rpf *rpf,
pim_ifp->pim_ifstat_join_send += ntohs(grp->joins); pim_ifp->pim_ifstat_join_send += ntohs(grp->joins);
pim_ifp->pim_ifstat_prune_send += ntohs(grp->prunes); pim_ifp->pim_ifstat_prune_send += ntohs(grp->prunes);
if (PIM_DEBUG_PIM_TRACE)
zlog_debug ("%s: interface %s num_joins %u num_prunes %u", __PRETTY_FUNCTION__,
rpf->source_nexthop.interface->name, ntohs(grp->joins), ntohs (grp->prunes));
grp = (struct pim_jp_groups *)curr_ptr; grp = (struct pim_jp_groups *)curr_ptr;
if (packet_left < sizeof (struct pim_jp_groups) || msg->num_groups == 255) if (packet_left < sizeof (struct pim_jp_groups) || msg->num_groups == 255)
{ {

View File

@ -243,17 +243,18 @@ enum pim_rpf_result pim_rpf_update(struct pim_upstream *up, struct pim_rpf *old,
{ {
return PIM_RPF_FAILURE; return PIM_RPF_FAILURE;
} }
} }
rpf->rpf_addr.family = AF_INET; rpf->rpf_addr.family = AF_INET;
rpf->rpf_addr.u.prefix4 = pim_rpf_find_rpf_addr(up); rpf->rpf_addr.u.prefix4 = pim_rpf_find_rpf_addr(up);
if (pim_rpf_addr_is_inaddr_any(rpf) && PIM_DEBUG_ZEBRA) { if (pim_rpf_addr_is_inaddr_any(rpf) && PIM_DEBUG_ZEBRA)
/* RPF'(S,G) not found */ {
zlog_debug("%s %s: RPF'%s not found: won't send join upstream", /* RPF'(S,G) not found */
zlog_debug("%s %s: RPF'%s not found: won't send join upstream",
__FILE__, __PRETTY_FUNCTION__, __FILE__, __PRETTY_FUNCTION__,
up->sg_str); up->sg_str);
/* warning only */ /* warning only */
} }
/* detect change in pim_nexthop */ /* detect change in pim_nexthop */
if (nexthop_mismatch(&rpf->source_nexthop, &saved.source_nexthop)) { if (nexthop_mismatch(&rpf->source_nexthop, &saved.source_nexthop)) {

View File

@ -577,8 +577,9 @@ pim_upstream_switch(struct pim_upstream *up,
if (old_state == PIM_UPSTREAM_JOINED) if (old_state == PIM_UPSTREAM_JOINED)
pim_msdp_up_join_state_changed(up); pim_msdp_up_join_state_changed(up);
/* IHR, Trigger SGRpt on *,G IIF to prune S,G from RPT */ /* IHR, Trigger SGRpt on *,G IIF to prune S,G from RPT towards RP.
if (pim_upstream_is_sg_rpt(up) && up->parent) If I am RP for G then send S,G prune to its IIF. */
if (pim_upstream_is_sg_rpt(up) && up->parent && !I_am_RP(up->sg.grp))
{ {
if (PIM_DEBUG_PIM_TRACE_DETAIL) if (PIM_DEBUG_PIM_TRACE_DETAIL)
zlog_debug ("%s: *,G IIF %s S,G IIF %s ", __PRETTY_FUNCTION__, zlog_debug ("%s: *,G IIF %s S,G IIF %s ", __PRETTY_FUNCTION__,

View File

@ -59,6 +59,8 @@ Building your own FRRouting RPM
%{!?with_irdp: %global with_irdp 1 } %{!?with_irdp: %global with_irdp 1 }
%{!?with_rtadv: %global with_rtadv 1 } %{!?with_rtadv: %global with_rtadv 1 }
%{!?with_ldpd: %global with_ldpd 1 } %{!?with_ldpd: %global with_ldpd 1 }
%{!?with_nhrpd: %global with_nhrpd 1 }
%{!?with_eigrp: %global with_eigrpd 1 }
%{!?with_shared: %global with_shared 1 } %{!?with_shared: %global with_shared 1 }
%{!?with_multipath: %global with_multipath 256 } %{!?with_multipath: %global with_multipath 256 }
%{!?frr_user: %global frr_user frr } %{!?frr_user: %global frr_user frr }

View File

@ -45,6 +45,8 @@ ripd=no
ripngd=no ripngd=no
isisd=no isisd=no
ldpd=no ldpd=no
nhrpd=no
eigrpd=no
# #
# Command line options for the daemons # Command line options for the daemons
# #
@ -56,4 +58,6 @@ ripd_options=("-A 127.0.0.1")
ripngd_options=("-A ::1") ripngd_options=("-A ::1")
isisd_options=("-A 127.0.0.1") isisd_options=("-A 127.0.0.1")
ldpd_options=("-A 127.0.0.1") ldpd_options=("-A 127.0.0.1")
nhrpd_options=("-A 127.0.0.1")
eigrpd_options=("-A 127.0.0.1")

View File

@ -33,7 +33,7 @@ V_PATH=/var/run/frr
# Local Daemon selection may be done by using /etc/frr/daemons. # Local Daemon selection may be done by using /etc/frr/daemons.
# See /usr/share/doc/frr/README.Debian.gz for further information. # See /usr/share/doc/frr/README.Debian.gz for further information.
# Keep zebra first and do not list watchfrr! # Keep zebra first and do not list watchfrr!
DAEMONS="zebra bgpd ripd ripngd ospfd ospf6d isisd pimd ldpd" DAEMONS="zebra bgpd ripd ripngd ospfd ospf6d isisd pimd ldpd nhrpd eigrpd"
MAX_INSTANCES=5 MAX_INSTANCES=5
RELOAD_SCRIPT=/usr/lib/frr/frr-reload.py RELOAD_SCRIPT=/usr/lib/frr/frr-reload.py

View File

@ -61,3 +61,20 @@
/bin/kill -USR1 `cat /var/run/frr/ldpd.pid 2> /dev/null` 2> /dev/null || true /bin/kill -USR1 `cat /var/run/frr/ldpd.pid 2> /dev/null` 2> /dev/null || true
endscript endscript
} }
/var/log/frr/nhrpd.log {
notifempty
missingok
postrotate
/bin/kill -USR1 `cat /var/run/frr/nhrpd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
/var/log/frr/eigrpd.log {
notifempty
missingok
postrotate
/bin/kill -USR1 `cat /var/run/frr/eigrpd.pid 2> /dev/null` 2> /dev/null || true
endscript
}

View File

@ -10,33 +10,31 @@
#################### FRRouting (FRR) configure options ##################### #################### FRRouting (FRR) configure options #####################
# with-feature options # with-feature options
<<<<<<< HEAD %{!?with_tcp_zebra: %global with_tcp_zebra 0 }
%{!?with_tcp_zebra: %global with_tcp_zebra 0 } %{!?with_pam: %global with_pam 0 }
%{!?with_pam: %global with_pam 0 } %{!?with_ospfclient: %global with_ospfclient 1 }
%{!?with_ospfclient: %global with_ospfclient 1 } %{!?with_ospfapi: %global with_ospfapi 1 }
%{!?with_ospfapi: %global with_ospfapi 1 } %{!?with_irdp: %global with_irdp 1 }
%{!?with_irdp: %global with_irdp 1 } %{!?with_rtadv: %global with_rtadv 1 }
%{!?with_rtadv: %global with_rtadv 1 } %{!?with_ldpd: %global with_ldpd 1 }
%{!?with_mpls: %global with_mpls 1 } %{!?with_nhrpd: %global with_nhrpd 1 }
%{!?with_ldpd: %global with_ldpd 1 } %{!?with_eigrpd: %global with_eigrpd 1 }
%{!?with_nhrpd: %global with_nhrpd 1 } %{!?with_shared: %global with_shared 1 }
%{!?with_shared: %global with_shared 1 } %{!?with_multipath: %global with_multipath 256 }
%{!?with_multipath: %global with_multipath 256 } %{!?frr_user: %global frr_user frr }
%{!?frr_user: %global frr_user frr } %{!?vty_group: %global vty_group frrvty }
%{!?vty_group: %global vty_group frrvty } %{!?with_fpm: %global with_fpm 0 }
%{!?with_fpm: %global with_fpm 0 } %{!?with_watchfrr: %global with_watchfrr 1 }
%{!?with_watchfrr: %global with_watchfrr 1 } %{!?with_bgp_vnc: %global with_bgp_vnc 0 }
%{!?with_bgp_vnc: %global with_bgp_vnc 0 } %{!?with_pimd: %global with_pimd 1 }
%{!?with_pimd: %global with_pimd 1 }
# path defines # path defines
%define _sysconfdir /etc/frr %define _sysconfdir /etc/frr
%define _sbindir /usr/lib/frr %define _sbindir /usr/lib/frr
%define zeb_src %{_builddir}/%{name}-%{frrversion} %define zeb_src %{_builddir}/%{name}-%{frrversion}
%define zeb_rh_src %{zeb_src}/redhat %define zeb_rh_src %{zeb_src}/redhat
%define zeb_docs %{zeb_src}/doc %define zeb_docs %{zeb_src}/doc
%define frr_tools %{zeb_src}/tools %define frr_tools %{zeb_src}/tools
%define frr_tools_etc %{frr_tools}/etc
# defines for configure # defines for configure
%define _localstatedir /var/run/frr %define _localstatedir /var/run/frr
@ -84,7 +82,7 @@
%{!?frr_gid: %global frr_gid 92 } %{!?frr_gid: %global frr_gid 92 }
%{!?vty_gid: %global vty_gid 85 } %{!?vty_gid: %global vty_gid 85 }
%define daemon_list zebra ripd ospfd bgpd isisd pimd ripngd ospf6d %define daemon_list zebra ripd ospfd bgpd isisd ripngd ospf6d
%if %{with_ldpd} %if %{with_ldpd}
%define daemon_ldpd ldpd %define daemon_ldpd ldpd
@ -104,13 +102,19 @@
%define daemon_nhrpd "" %define daemon_nhrpd ""
%endif %endif
%if %{with_eigrpd}
%define daemon_eigrpd eigrpd
%else
%define daemon_eigrpd ""
%endif
%if %{with_watchfrr} %if %{with_watchfrr}
%define daemon_watchfrr watchfrr %define daemon_watchfrr watchfrr
%else %else
%define daemon_watchfrr "" %define daemon_watchfrr ""
%endif %endif
%define all_daemons %{daemon_list} %{daemon_ldpd} %{daemon_nhrpd} %{daemon_watchfrr} %define all_daemons %{daemon_list} %{daemon_ldpd} %{daemon_pimd} %{daemon_nhrpd} %{daemon_eigrpd} %{daemon_watchfrr}
# allow build dir to be kept # allow build dir to be kept
%{!?keep_build: %global keep_build 0 } %{!?keep_build: %global keep_build 0 }
@ -156,7 +160,7 @@ protocol. It takes multi-server and multi-thread approach to resolve
the current complexity of the Internet. the current complexity of the Internet.
FRRouting supports BGP4, OSPFv2, OSPFv3, ISIS, RIP, RIPng, PIM, LDP FRRouting supports BGP4, OSPFv2, OSPFv3, ISIS, RIP, RIPng, PIM, LDP
and NHRP. NHRP and EIGRP.
FRRouting is a fork of Quagga. FRRouting is a fork of Quagga.
@ -252,6 +256,11 @@ developing OSPF-API and frr applications.
%else %else
--disable-nhrpd \ --disable-nhrpd \
%endif %endif
%if %{with_eigrpd}
--enable-eigrpd \
%else
--disable-eigrpd \
%endif
%if %{with_pam} %if %{with_pam}
--with-libpam \ --with-libpam \
%endif %endif
@ -318,9 +327,7 @@ install %{zeb_rh_src}/frr.init \
%{buildroot}/etc/rc.d/init.d/frr %{buildroot}/etc/rc.d/init.d/frr
%endif %endif
install %{frr_tools_dir}/frr/daemons.conf %{buildroot}/etc/frr install %{zeb_rh_src}/daemons %{buildroot}/etc/frr
install %{frr_tools_dir}/frr/daemons %{buildroot}/etc/frr
install -m644 %{frr_tools_dir}/default/frr %{buildroot}/etc/default
install -m644 %{zeb_rh_src}/frr.pam \ install -m644 %{zeb_rh_src}/frr.pam \
%{buildroot}/etc/pam.d/frr %{buildroot}/etc/pam.d/frr
install -m644 %{zeb_rh_src}/frr.logrotate \ install -m644 %{zeb_rh_src}/frr.logrotate \
@ -375,6 +382,9 @@ zebra_spec_add_service ospf6d 2606/tcp "OSPF6d vty"
zebra_spec_add_service ospfapi 2607/tcp "OSPF-API" zebra_spec_add_service ospfapi 2607/tcp "OSPF-API"
%endif %endif
zebra_spec_add_service isisd 2608/tcp "ISISd vty" zebra_spec_add_service isisd 2608/tcp "ISISd vty"
%if %{with_eigrpd}
zebra_spec_add_service eigrpd 2609/tcp "EIGRPd vty"
%endif
%if %{with_nhrpd} %if %{with_nhrpd}
zebra_spec_add_service nhrpd 2610/tcp "NHRPd vty" zebra_spec_add_service nhrpd 2610/tcp "NHRPd vty"
%endif %endif
@ -516,8 +526,11 @@ rm -rf %{buildroot}
%if %{with_ldpd} %if %{with_ldpd}
%{_sbindir}/ldpd %{_sbindir}/ldpd
%endif %endif
%if %{with_eigrpd}
%{_sbindir}/eigrpd
%endif
%if %{with_nhrpd} %if %{with_nhrpd}
%{_sbindir}/nhrpd %{_sbindir}/nhrpd
%endif %endif
%if %{with_shared} %if %{with_shared}
%{_libdir}/lib*.so %{_libdir}/lib*.so
@ -561,9 +574,16 @@ rm -rf %{buildroot}
%dir %attr(755,root,root) %{_includedir}/%{name}/ospfapi %dir %attr(755,root,root) %{_includedir}/%{name}/ospfapi
%{_includedir}/%name/ospfapi/*.h %{_includedir}/%name/ospfapi/*.h
%endif %endif
%if %{with_eigrpd}
%dir %attr(755,root,root) %{_includedir}/%{name}/eigrpd
%{_includedir}/%name/eigrpd/*.h
%endif
%changelog %changelog
* Mon Apr 17 2017 Martin Winter <mwinter@opensourcerouting.org> - %{version} * Mon Jun 5 2017 Martin Winter <mwinter@opensourcerouting.org> - %{version}
- added NHRP and EIGRP daemon
* Mon Apr 17 2017 Martin Winter <mwinter@opensourcerouting.org>
- new subpackage frr-pythontools with python 2.7 restart script - new subpackage frr-pythontools with python 2.7 restart script
- remove PIMd from CentOS/RedHat 6 RPM packages (won't work - too old) - remove PIMd from CentOS/RedHat 6 RPM packages (won't work - too old)
- converted to single frr init script (not per daemon) based on debian init script - converted to single frr init script (not per daemon) based on debian init script

View File

@ -2586,6 +2586,7 @@ vtysh_write_config_integrated(void)
err++; err++;
} }
#ifdef FRR_USER
pwentry = getpwnam (FRR_USER); pwentry = getpwnam (FRR_USER);
if (pwentry) if (pwentry)
uid = pwentry->pw_uid; uid = pwentry->pw_uid;
@ -2594,7 +2595,8 @@ vtysh_write_config_integrated(void)
printf ("%% Warning: could not look up user \"%s\"\n", FRR_USER); printf ("%% Warning: could not look up user \"%s\"\n", FRR_USER);
err++; err++;
} }
#endif
#ifdef FRR_GROUP
grentry = getgrnam (FRR_GROUP); grentry = getgrnam (FRR_GROUP);
if (grentry) if (grentry)
gid = grentry->gr_gid; gid = grentry->gr_gid;
@ -2603,6 +2605,7 @@ vtysh_write_config_integrated(void)
printf ("%% Warning: could not look up group \"%s\"\n", FRR_GROUP); printf ("%% Warning: could not look up group \"%s\"\n", FRR_GROUP);
err++; err++;
} }
#endif
if (!fstat (fd, &st)) if (!fstat (fd, &st))
{ {

View File

@ -2172,7 +2172,6 @@ DEFUN (ipv6_route,
"IPv6 gateway address\n" "IPv6 gateway address\n"
"IPv6 gateway interface name\n" "IPv6 gateway interface name\n"
"Null interface\n" "Null interface\n"
"Null interface\n"
"Set tag for this route\n" "Set tag for this route\n"
"Tag value\n" "Tag value\n"
"Distance value for this prefix\n" "Distance value for this prefix\n"