#include "pim_zebra.h"
#include "pim_join.h"
#include "pim_util.h"
+#include "pim_ssm.h"
struct thread *send_test_packet_timer = NULL;
+void
+pim_register_join (struct pim_upstream *up)
+{
+ if (pim_is_grp_ssm (up->sg.grp))
+ {
+ if (PIM_DEBUG_PIM_EVENTS)
+ zlog_debug ("%s register setup skipped as group is SSM", up->sg_str);
+ return;
+ }
+
+ pim_channel_add_oif (up->channel_oil, pim_regiface, PIM_OIF_FLAG_PROTO_PIM);
+ up->reg_state = PIM_REG_JOIN;
+}
+
void
pim_register_stop_send (struct interface *ifp, struct prefix_sg *sg,
struct in_addr src, struct in_addr originator)
{
struct pim_upstream *upstream = NULL;
struct prefix source;
- struct prefix group;
struct prefix_sg sg;
int l;
- l = pim_parse_addr_group (&group, buf, buf_size);
+ memset (&sg, 0, sizeof (struct prefix_sg));
+ l = pim_parse_addr_group (&sg, buf, buf_size);
buf += l;
buf_size -= l;
pim_parse_addr_ucast (&source, buf, buf_size);
- memset (&sg, 0, sizeof (struct prefix_sg));
sg.src = source.u.prefix4;
- sg.grp = group.u.prefix4;
-
- if (PIM_DEBUG_PIM_REG)
- {
- zlog_debug ("Received Register stop for %s",
- pim_str_sg_dump (&sg));
- }
upstream = pim_upstream_find (&sg);
if (!upstream)
return 0;
}
- switch (upstream->join_state)
+ if (PIM_DEBUG_PIM_REG)
+ zlog_debug ("Received Register stop for %s",
+ upstream->sg_str);
+
+ switch (upstream->reg_state)
{
- case PIM_UPSTREAM_NOTJOINED:
- case PIM_UPSTREAM_PRUNE:
+ case PIM_REG_NOINFO:
+ case PIM_REG_PRUNE:
return 0;
break;
- case PIM_UPSTREAM_JOINED:
- upstream->join_state = PIM_UPSTREAM_PRUNE;
+ case PIM_REG_JOIN:
+ upstream->reg_state = PIM_REG_PRUNE;
pim_channel_del_oif (upstream->channel_oil, pim_regiface, PIM_OIF_FLAG_PROTO_PIM);
pim_upstream_start_register_stop_timer (upstream, 0);
- case PIM_UPSTREAM_JOIN_PENDING:
- upstream->join_state = PIM_UPSTREAM_PRUNE;
+ break;
+ case PIM_REG_JOIN_PENDING:
+ upstream->reg_state = PIM_REG_PRUNE;
pim_upstream_start_register_stop_timer (upstream, 0);
return 0;
break;
}
void
-pim_register_send (const uint8_t *buf, int buf_size, struct in_addr src, struct pim_rpf *rpg, int null_register)
+pim_register_send (const uint8_t *buf, int buf_size, struct in_addr src, struct pim_rpf *rpg, int null_register, struct pim_upstream *up)
{
unsigned char buffer[10000];
unsigned char *b1;
if (PIM_DEBUG_PIM_REG)
{
- char rp_str[INET_ADDRSTRLEN];
- strcpy (rp_str, inet_ntoa (rpg->rpf_addr.u.prefix4));
- zlog_debug ("Sending %sRegister Packet to %s", null_register ? "NULL " : "", rp_str);
+ zlog_debug ("Sending %s %sRegister Packet to %s",
+ up->sg_str, null_register ? "NULL " : "",
+ inet_ntoa (rpg->rpf_addr.u.prefix4));
}
ifp = rpg->source_nexthop.interface;
return;
}
+ if (PIM_DEBUG_PIM_REG)
+ {
+ char rp_str[INET_ADDRSTRLEN];
+ strncpy (rp_str, inet_ntoa (rpg->rpf_addr.u.prefix4), INET_ADDRSTRLEN-1);
+ zlog_debug ("%s: Sending %s %sRegister Packet to %s on %s",
+ __PRETTY_FUNCTION__, up->sg_str,
+ null_register ? "NULL " : "", rp_str, ifp->name);
+ }
+
memset(buffer, 0, 10000);
b1 = buffer + PIM_MSG_HEADER_LEN;
*b1 |= null_register << 6;
*/
if (!upstream)
{
- upstream = pim_upstream_add (&sg, ifp,
- PIM_UPSTREAM_FLAG_MASK_SRC_STREAM,
- __PRETTY_FUNCTION__);
+ upstream = pim_upstream_add (&sg, ifp,
+ PIM_UPSTREAM_FLAG_MASK_SRC_STREAM,
+ __PRETTY_FUNCTION__);
if (!upstream)
{
zlog_warn ("Failure to create upstream state");
return 1;
}
- PIM_UPSTREAM_FLAG_SET_CREATED_BY_UPSTREAM(upstream->flags);
upstream->upstream_register = src_addr;
- pim_rp_set_upstream_addr (&upstream->upstream_addr, sg.src, sg.grp);
- pim_nexthop_lookup (&upstream->rpf.source_nexthop,
- upstream->upstream_addr, 1);
- upstream->sg.src = sg.src;
- upstream->rpf.rpf_addr = upstream->rpf.source_nexthop.mrib_nexthop_addr;
-
- upstream->join_state = PIM_UPSTREAM_PRUNE;
-
}
if ((upstream->sptbit == PIM_UPSTREAM_SPTBIT_TRUE) ||
sentRegisterStop = 1;
} else {
if (PIM_DEBUG_PIM_REG)
- zlog_debug ("(%s) sptbit: %d", pim_str_sg_dump (&upstream->sg), upstream->sptbit);
+ zlog_debug ("(%s) sptbit: %d", upstream->sg_str, upstream->sptbit);
}
if ((upstream->sptbit == PIM_UPSTREAM_SPTBIT_TRUE) ||
(SwitchToSptDesired(&sg))) {
//inherited_olist(S,G,rpt)
// This is taken care of by the kernel for us
}
+ pim_upstream_msdp_reg_timer_start(upstream);
} else {
if (PIM_DEBUG_PIM_REG)
{
return 1;
}
-
-
-static int
-pim_register_send_test_packet (struct thread *t)
-{
- uint8_t *packet;
-
- packet = THREAD_ARG(t);
-
- *packet = 4;
-
- return 1;
-}
-
-/*
- * pim_register_send_test_packet
- *
- * Send a test packet to the RP from source, in group and pps packets per second
- */
-void
-pim_register_send_test_packet_start (struct in_addr source,
- struct in_addr group,
- uint32_t pps)
-{
- uint8_t *packet = NULL;
-
- THREAD_TIMER_MSEC_ON(master, send_test_packet_timer,
- pim_register_send_test_packet, packet, 1000/pps);
-
- return;
-}