• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/router/quagga/pimd/

Lines Matching refs:group

37 static void group_retransmit_timer_on(struct igmp_group *group);
38 static long igmp_group_timer_remain_msec(struct igmp_group *group);
40 static void group_query_send(struct igmp_group *group);
41 static void source_query_send_by_flag(struct igmp_group *group,
54 pim_inet4_dump("<group?>", group_addr, group_str, sizeof(group_str));
56 zlog_debug("%s: from %s on %s: group=%s sources=%d",
62 const struct igmp_group *group)
96 if ((now_dsec - group->last_igmp_v1_report_dsec) < older_host_present_interval_dsec)
99 if ((now_dsec - group->last_igmp_v2_report_dsec) < older_host_present_interval_dsec)
105 void igmp_group_reset_gmi(struct igmp_group *group)
112 igmp = group->group_igmp_sock;
121 group or a particular source on a network.
137 pim_inet4_dump("<group?>", group->group_addr, group_str, sizeof(group_str));
138 zlog_debug("Resetting group %s timer to GMI=%ld.%03ld sec on %s",
148 The group timer is only used when a group is in EXCLUDE mode and
149 it represents the time for the *filter-mode* of the group to
152 zassert(group->group_filtermode_isexcl);
154 igmp_group_timer_on(group, group_membership_interval_msec, ifp->name);
160 struct igmp_group *group;
166 group = source->source_group;
171 pim_inet4_dump("<group?>", group->group_addr, group_str, sizeof(group_str));
173 zlog_debug("%s: Source timer expired for group %s source %s on %s",
176 group->group_igmp_sock->interface->name);
192 records for the group, delete
193 group record.
204 if (group->group_filtermode_isexcl) {
216 If there are no more source records for the group, delete group
219 if (!listcount(group->group_source_list)) {
220 igmp_group_delete_empty_include(group);
227 static void source_timer_off(struct igmp_group *group,
236 pim_inet4_dump("<group?>", group->group_addr, group_str, sizeof(group_str));
238 zlog_debug("Cancelling TIMER event for group %s source %s on %s",
240 group->group_igmp_sock->interface->name);
247 static void igmp_source_timer_on(struct igmp_group *group,
251 source_timer_off(group, source);
256 pim_inet4_dump("<group?>", group->group_addr, group_str, sizeof(group_str));
258 zlog_debug("Scheduling %ld.%03ld sec TIMER event for group %s source %s on %s",
262 group->group_igmp_sock->interface->name);
279 struct igmp_group *group,
298 pim_inet4_dump("<group?>", group->group_addr, group_str, sizeof(group_str));
301 zlog_debug("Resetting source %s timer to GMI=%ld.%03ld sec for group %s on %s",
309 igmp_source_timer_on(group, source,
366 static void group_exclude_fwd_anysrc_ifempty(struct igmp_group *group)
368 zassert(group->group_filtermode_isexcl);
370 if (listcount(group->group_source_list) < 1) {
371 igmp_anysource_forward_start(group);
397 struct igmp_group *group;
399 group = source->source_group;
404 pim_inet4_dump("<group?>", group->group_addr, group_str, sizeof(group_str));
406 zlog_debug("Deleting IGMP source %s for group %s from socket %d interface %s",
408 group->group_igmp_sock->fd,
409 group->group_igmp_sock->interface->name);
412 source_timer_off(group, source);
419 pim_inet4_dump("<group?>", group->group_addr, group_str, sizeof(group_str));
421 zlog_warn("%s: forwarding=ON(!) IGMP source %s for group %s from socket %d interface %s",
424 group->group_igmp_sock->fd,
425 group->group_igmp_sock->interface->name);
436 listnode_delete(group->group_source_list, source);
440 if (group->group_filtermode_isexcl) {
441 group_exclude_fwd_anysrc_ifempty(group);
467 struct igmp_source *igmp_find_source_by_addr(struct igmp_group *group,
473 for (ALL_LIST_ELEMENTS_RO(group->group_source_list, src_node, src))
480 static struct igmp_source *source_new(struct igmp_group *group,
489 pim_inet4_dump("<group?>", group->group_addr, group_str, sizeof(group_str));
491 zlog_debug("Creating new IGMP source %s for group %s on socket %d interface %s",
493 group->group_igmp_sock->fd,
505 src->source_group = group; /* back pointer */
512 listnode_add(group->group_source_list, src);
517 igmp_anysource_forward_stop(group);
523 struct igmp_group *group,
529 src = igmp_find_source_by_addr(group, src_addr);
534 src = source_new(group, src_addr, ifname);
547 struct igmp_group *group;
550 /* non-existant group is created as INCLUDE {empty} */
551 group = igmp_add_group_by_addr(igmp, group_addr, ifp->name);
552 if (!group) {
563 source = add_source_by_addr(igmp, group, *src_addr, ifp->name);
578 igmp_source_reset_gmi(igmp, group, source);
593 static void isex_excl(struct igmp_group *group,
599 zassert(group->group_filtermode_isexcl);
602 source_mark_delete_flag(group->group_source_list);
612 source = igmp_find_source_by_addr(group, *src_addr);
619 source = source_new(group, *src_addr,
620 group->group_igmp_sock->interface->name);
626 igmp_source_reset_gmi(group->group_igmp_sock, group, source);
633 source_delete_by_flag(group->group_source_list);
636 static void isex_incl(struct igmp_group *group,
642 zassert(!group->group_filtermode_isexcl);
645 source_mark_delete_flag(group->group_source_list);
655 source = igmp_find_source_by_addr(group, *src_addr);
662 source = source_new(group, *src_addr,
663 group->group_igmp_sock->interface->name);
674 source_delete_by_flag(group->group_source_list);
676 group->group_filtermode_isexcl = 1; /* boolean=true */
678 zassert(group->group_filtermode_isexcl);
680 group_exclude_fwd_anysrc_ifempty(group);
688 struct igmp_group *group;
693 /* non-existant group is created as INCLUDE {empty} */
694 group = igmp_add_group_by_addr(igmp, group_addr, ifp->name);
695 if (!group) {
699 if (group->group_filtermode_isexcl) {
701 isex_excl(group, num_sources, sources);
705 isex_incl(group, num_sources, sources);
706 zassert(group->group_filtermode_isexcl);
709 zassert(group->group_filtermode_isexcl);
711 igmp_group_reset_gmi(group);
714 static void toin_incl(struct igmp_group *group,
717 struct igmp_sock *igmp = group->group_igmp_sock;
718 int num_sources_tosend = listcount(group->group_source_list);
722 source_mark_send_flag(group->group_source_list);
732 source = igmp_find_source_by_addr(group, *src_addr);
740 source = source_new(group, *src_addr,
741 group->group_igmp_sock->interface->name);
749 igmp_source_reset_gmi(igmp, group, source);
754 source_query_send_by_flag(group, num_sources_tosend);
758 static void toin_excl(struct igmp_group *group,
761 struct igmp_sock *igmp = group->group_igmp_sock;
766 num_sources_tosend = source_mark_send_flag_by_timer(group->group_source_list);
776 source = igmp_find_source_by_addr(group, *src_addr);
786 source = source_new(group, *src_addr,
787 group->group_igmp_sock->interface->name);
795 igmp_source_reset_gmi(igmp, group, source);
800 source_query_send_by_flag(group, num_sources_tosend);
804 group_query_send(group);
812 struct igmp_group *group;
817 /* non-existant group is created as INCLUDE {empty} */
818 group = igmp_add_group_by_addr(igmp, group_addr, ifp->name);
819 if (!group) {
823 if (group->group_filtermode_isexcl) {
825 toin_excl(group, num_sources, sources);
829 toin_incl(group, num_sources, sources);
833 static void toex_incl(struct igmp_group *group,
839 zassert(!group->group_filtermode_isexcl);
842 source_mark_delete_flag(group->group_source_list);
845 source_clear_send_flag(group->group_source_list);
855 source = igmp_find_source_by_addr(group, *src_addr);
865 source = source_new(group, *src_addr,
866 group->group_igmp_sock->interface->name);
876 group->group_filtermode_isexcl = 1; /* boolean=true */
879 source_delete_by_flag(group->group_source_list);
883 source_query_send_by_flag(group, num_sources_tosend);
886 zassert(group->group_filtermode_isexcl);
888 group_exclude_fwd_anysrc_ifempty(group);
891 static void toex_excl(struct igmp_group *group,
898 source_mark_delete_flag(group->group_source_list);
901 source_clear_send_flag(group->group_source_list);
911 source = igmp_find_source_by_addr(group, *src_addr);
919 source = source_new(group, *src_addr,
920 group->group_igmp_sock->interface->name);
927 group_timer_msec = igmp_group_timer_remain_msec(group);
928 igmp_source_timer_on(group, source, group_timer_msec);
951 source_delete_by_flag(group->group_source_list);
955 source_query_send_by_flag(group, num_sources_tosend);
964 struct igmp_group *group;
969 /* non-existant group is created as INCLUDE {empty} */
970 group = igmp_add_group_by_addr(igmp, group_addr, ifp->name);
971 if (!group) {
975 if (group->group_filtermode_isexcl) {
977 toex_excl(group, num_sources, sources);
981 toex_incl(group, num_sources, sources);
982 zassert(group->group_filtermode_isexcl);
984 zassert(group->group_filtermode_isexcl);
987 igmp_group_reset_gmi(group);
1003 When transmitting a group specific query, if the group timer is
1007 static void group_retransmit_group(struct igmp_group *group)
1017 igmp = group->group_igmp_sock;
1027 When transmitting a group specific query, if the group timer is
1031 s_flag = igmp_group_timer_remain_msec(group) > lmqt_msec;
1035 pim_inet4_dump("<group?>", group->group_addr, group_str, sizeof(group_str));
1036 zlog_debug("retransmit_group_specific_query: group %s on %s: s_flag=%d count=%d",
1038 group->group_specific_query_retransmit_count);
1049 pim_igmp_send_membership_query(group,
1055 group->group_addr /* dst_addr */,
1056 group->group_addr /* group_addr */,
1066 When building a group and source specific query for a group G, two
1067 separate query messages are sent for the group. The first one has
1075 static int group_retransmit_sources(struct igmp_group *group,
1101 igmp = group->group_igmp_sock;
1108 /* Scan all group sources */
1109 for (ALL_LIST_ELEMENTS_RO(group->group_source_list, src_node, src)) {
1136 pim_inet4_dump("<group?>", group->group_addr, group_str, sizeof(group_str));
1137 zlog_debug("retransmit_grp&src_specific_query: group %s on %s: srcs_with_sflag=%d srcs_wo_sflag=%d will_send_sflag=%d retransmit_src_left=%d",
1147 Send group-and-source-specific query with s_flag set and all
1156 pim_inet4_dump("<group?>", group->group_addr, group_str, sizeof(group_str));
1157 zlog_warn("%s: group %s on %s: s_flag=1 unable to fit %d sources into buf_size=%zu (max_sources=%d)",
1170 pim_igmp_send_membership_query(group,
1176 group->group_addr,
1177 group->group_addr,
1191 Send group-and-source-specific query with s_flag clear and all
1198 pim_inet4_dump("<group?>", group->group_addr, group_str, sizeof(group_str));
1199 zlog_warn("%s: group %s on %s: s_flag=0 unable to fit %d sources into buf_size=%zu (max_sources=%d)",
1212 pim_igmp_send_membership_query(group,
1218 group->group_addr,
1219 group->group_addr,
1233 struct igmp_group *group;
1238 group = THREAD_ARG(t);
1239 zassert(group);
1243 pim_inet4_dump("<group?>", group->group_addr, group_str, sizeof(group_str));
1244 zlog_debug("group_retransmit_timer: group %s on %s",
1245 group_str, group->group_igmp_sock->interface->name);
1248 /* Retransmit group-specific queries? (RFC3376: 6.6.3.1) */
1249 if (group->group_specific_query_retransmit_count > 0) {
1251 /* Retransmit group-specific queries (RFC3376: 6.6.3.1) */
1252 group_retransmit_group(group);
1253 --group->group_specific_query_retransmit_count;
1257 If a group specific query is scheduled to be transmitted at the
1258 same time as a group and source specific query for the same group,
1259 then transmission of the group and source specific message with the
1268 /* Retransmit group-and-source-specific queries (RFC3376: 6.6.3.2) */
1269 num_retransmit_sources_left = group_retransmit_sources(group,
1272 group->t_group_query_retransmit_timer = 0;
1275 Keep group retransmit timer running if there is any retransmit
1279 (group->group_specific_query_retransmit_count > 0)) {
1280 group_retransmit_timer_on(group);
1288 if group retransmit timer isn't running, starts it;
1291 static void group_retransmit_timer_on(struct igmp_group *group)
1297 /* if group retransmit timer is running, do nothing */
1298 if (group->t_group_query_retransmit_timer) {
1302 igmp = group->group_igmp_sock;
1309 pim_inet4_dump("<group?>", group->group_addr, group_str, sizeof(group_str));
1310 zlog_debug("Scheduling %ld.%03ld sec retransmit timer for group %s on %s",
1317 THREAD_TIMER_MSEC_ON(master, group->t_group_query_retransmit_timer,
1319 group, lmqi_msec);
1322 static long igmp_group_timer_remain_msec(struct igmp_group *group)
1324 return pim_time_timer_remain_msec(group->t_group_timer);
1335 static void group_query_send(struct igmp_group *group)
1339 lmqc = group->group_igmp_sock->querier_robustness_variable;
1341 /* lower group timer to lmqt */
1342 igmp_group_timer_lower_to_lmqt(group);
1345 group->group_specific_query_retransmit_count = lmqc;
1347 /* immediately send group specific query (decrease retransmit counter by 1)*/
1348 group_retransmit_group(group);
1350 /* make sure group retransmit timer is running */
1351 group_retransmit_timer_on(group);
1357 static void source_query_send_by_flag(struct igmp_group *group,
1370 igmp = group->group_igmp_sock;
1380 (...) for each of the sources in X of group G, with source timer larger
1386 for (ALL_LIST_ELEMENTS_RO(group->group_source_list, src_node, src)) {
1388 /* source "src" in X of group G */
1396 /* send group-and-source specific queries */
1397 group_retransmit_sources(group, 1 /* send_with_sflag_set=true */);
1399 /* make sure group retransmit timer is running */
1400 group_retransmit_timer_on(group);
1403 static void block_excl(struct igmp_group *group,
1410 source_clear_send_flag(group->group_source_list);
1420 source = igmp_find_source_by_addr(group, *src_addr);
1424 source = source_new(group, *src_addr,
1425 group->group_igmp_sock->interface->name);
1432 group_timer_msec = igmp_group_timer_remain_msec(group);
1433 igmp_source_timer_on(group, source, group_timer_msec);
1446 source_query_send_by_flag(group, num_sources_tosend);
1450 static void block_incl(struct igmp_group *group,
1457 source_clear_send_flag(group->group_source_list);
1467 source = igmp_find_source_by_addr(group, *src_addr);
1477 source_query_send_by_flag(group, num_sources_tosend);
1486 struct igmp_group *group;
1491 /* non-existant group is created as INCLUDE {empty} */
1492 group = igmp_add_group_by_addr(igmp, group_addr, ifp->name);
1493 if (!group) {
1497 if (group->group_filtermode_isexcl) {
1499 block_excl(group, num_sources, sources);
1503 block_incl(group, num_sources, sources);
1507 void igmp_group_timer_lower_to_lmqt(struct igmp_group *group)
1520 The group timer is only used when a group is in EXCLUDE mode and
1521 it represents the time for the *filter-mode* of the group to
1524 if (!group->group_filtermode_isexcl) {
1528 igmp = group->group_igmp_sock;
1539 pim_inet4_dump("<group?>", group->group_addr, group_str, sizeof(group_str));
1540 zlog_debug("%s: group %s on %s: LMQC=%d LMQI=%d dsec LMQT=%d msec",
1546 zassert(group->group_filtermode_isexcl);
1548 igmp_group_timer_on(group, lmqt_msec, ifname);
1553 struct igmp_group *group;
1562 group = source->source_group;
1563 igmp = group->group_igmp_sock;
1575 pim_inet4_dump("<group?>", group->group_addr, group_str, sizeof(group_str));
1577 zlog_debug("%s: group %s source %s on %s: LMQC=%d LMQI=%d dsec LMQT=%d msec",
1583 igmp_source_timer_on(group, source, lmqt_msec);
1600 void pim_igmp_send_membership_query(struct igmp_group *group,
1665 pim_inet4_dump("<group?>", group_addr, group_str, sizeof(group_str));
1666 zlog_debug("%s: to %s on %s: group=%s sources=%d msg_size=%zd s_flag=%x QRV=%u QQI=%u QQIC=%02x checksum=%x",
1689 pim_inet4_dump("<group?>", group_addr, group_str, sizeof(group_str));
1691 zlog_warn("%s: sendto() failure to %s on %s: group=%s msg_size=%zd: errno=%d: %s",
1697 zlog_warn("%s: sendto() partial to %s on %s: group=%s msg_size=%zd: sent=%zd",
1712 the correct timeout values for the group or sources being queried.
1722 pim_inet4_dump("<group?>", group_addr, group_str, sizeof(group_str));
1723 zlog_warn("%s: to %s on %s: group=%s sources=%d: s_flag is clear for general query!",