json_object_object_add(json, ifp->name,
json_row);
+ if (igmp->mtrace_only) {
+ json_object_boolean_true_add(
+ json_row, "mtraceOnly");
+ }
} else {
vty_out(vty,
"%-9s %5s %15s %d %7s %11s %8s\n",
ifp->name,
- if_is_up(ifp) ? "up" : "down",
+ if_is_up(ifp)
+ ? (igmp->mtrace_only ? "mtrc"
+ : "up")
+ : "down",
inet_ntoa(igmp->ifaddr),
pim_ifp->igmp_version,
igmp->t_igmp_query_timer ? "local"
json_object_object_add(json, ifp->name,
json_row);
+ if (igmp->mtrace_only) {
+ json_object_boolean_true_add(
+ json_row, "mtraceOnly");
+ }
} else {
vty_out(vty, "Interface : %s\n", ifp->name);
vty_out(vty, "State : %s\n",
- if_is_up(ifp) ? "up" : "down");
+ if_is_up(ifp)
+ ? (igmp->mtrace_only ? "mtrace"
+ : "up")
+ : "down");
vty_out(vty, "Address : %s\n",
inet_ntoa(pim_ifp->primary_address));
vty_out(vty, "Uptime : %s\n", uptime);
/* if addr new, add IGMP socket */
if (ifc->address->family == AF_INET)
pim_igmp_sock_add(pim_ifp->igmp_socket_list,
- ifaddr, ifp);
+ ifaddr, ifp, false);
+ } else if (igmp->mtrace_only) {
+ igmp_sock_delete(igmp);
+ pim_igmp_sock_add(pim_ifp->igmp_socket_list, ifaddr,
+ ifp, false);
}
/* Replay Static IGMP groups */
}
}
} /* igmp */
+ else {
+ struct igmp_sock *igmp;
+
+ /* lookup IGMP socket */
+ igmp = pim_igmp_sock_lookup_ifaddr(pim_ifp->igmp_socket_list,
+ ifaddr);
+ if (ifc->address->family == AF_INET) {
+ if (igmp)
+ igmp_sock_delete(igmp);
+ /* if addr new, add IGMP socket */
+ pim_igmp_sock_add(pim_ifp->igmp_socket_list, ifaddr,
+ ifp, true);
+ }
+ } /* igmp mtrace only */
if (PIM_IF_TEST_PIM(pim_ifp->options)) {
uint16_t recv_checksum;
uint16_t checksum;
+ if (igmp->mtrace_only)
+ return 0;
+
memcpy(&group_addr, igmp_msg + 4, sizeof(struct in_addr));
ifp = igmp->interface;
on_trace(__PRETTY_FUNCTION__, igmp->interface, from);
+ if (igmp->mtrace_only)
+ return 0;
+
if (igmp_msg_len != IGMP_V12_MSG_SIZE) {
zlog_warn(
"Recv IGMP report v1 from %s on %s: size=%d other than correct=%d",
return igmp_mtrace_recv_response(igmp, ip_hdr, ip_hdr->ip_src,
from_str, igmp_msg,
igmp_msg_len);
- break;
case PIM_IGMP_MTRACE_QUERY_REQUEST:
return igmp_mtrace_recv_qry_req(igmp, ip_hdr, ip_hdr->ip_src,
from_str, igmp_msg,
}
static struct igmp_sock *igmp_sock_new(int fd, struct in_addr ifaddr,
- struct interface *ifp)
+ struct interface *ifp, int mtrace_only)
{
struct pim_interface *pim_ifp;
struct igmp_sock *igmp;
pim_ifp->igmp_default_robustness_variable;
igmp->sock_creation = pim_time_monotonic_sec();
+ if (mtrace_only) {
+ igmp->mtrace_only = mtrace_only;
+ return igmp;
+ }
+
+ igmp->mtrace_only = false;
+
/*
igmp_startup_mode_on() will reset QQI:
struct igmp_sock *pim_igmp_sock_add(struct list *igmp_sock_list,
struct in_addr ifaddr,
- struct interface *ifp)
+ struct interface *ifp,
+ bool mtrace_only)
{
struct pim_interface *pim_ifp;
struct igmp_sock *igmp;
return 0;
}
- igmp = igmp_sock_new(fd, ifaddr, ifp);
+ igmp = igmp_sock_new(fd, ifaddr, ifp, mtrace_only);
if (!igmp) {
zlog_err("%s %s: igmp_sock_new() failure", __FILE__,
__PRETTY_FUNCTION__);
int querier_robustness_variable; /* QRV */
int startup_query_count;
+ bool mtrace_only;
+
struct list *igmp_group_list; /* list of struct igmp_group */
struct hash *igmp_group_hash;
};
struct igmp_sock *igmp_sock_lookup_by_fd(struct list *igmp_sock_list, int fd);
struct igmp_sock *pim_igmp_sock_add(struct list *igmp_sock_list,
struct in_addr ifaddr,
- struct interface *ifp);
+ struct interface *ifp,
+ bool mtrace_only);
void igmp_sock_delete(struct igmp_sock *igmp);
void igmp_sock_free(struct igmp_sock *igmp);
void igmp_sock_delete_all(struct interface *ifp);
on_trace(__PRETTY_FUNCTION__, igmp->interface, from);
+ if (igmp->mtrace_only)
+ return 0;
+
if (igmp_msg_len != IGMP_V12_MSG_SIZE) {
zlog_warn(
"Recv IGMPv2 REPORT from %s on %s: size=%d other than correct=%d",
on_trace(__PRETTY_FUNCTION__, igmp->interface, from);
+ if (igmp->mtrace_only)
+ return 0;
+
if (igmp_msg_len != IGMP_V12_MSG_SIZE) {
zlog_warn(
"Recv IGMPv2 LEAVE from %s on %s: size=%d other than correct=%d",
int local_ncb = 0;
struct pim_interface *pim_ifp;
+ if (igmp->mtrace_only)
+ return 0;
+
pim_ifp = igmp->interface->info;
if (igmp_msg_len < IGMP_V3_MSG_MIN_SIZE) {