]> git.puffer.fish Git - mirror/frr.git/commitdiff
pimd: Add additional IGMP stats (generic/group specific queries sent) 10788/head
authorDonatas Abraitis <donatas@opensourcerouting.org>
Mon, 14 Mar 2022 07:26:22 +0000 (09:26 +0200)
committerDonatas Abraitis <donatas@opensourcerouting.org>
Mon, 14 Mar 2022 08:50:28 +0000 (10:50 +0200)
```
exit1-debian-11# sh ip igmp statistics
IGMP statistics
Interface            : global
V1 query             : 0
V2 query             : 0
V3 query             : 6
V2 leave             : 0
V1 report            : 0
V2 report            : 0
V3 report            : 14
mtrace response      : 0
mtrace request       : 0
unsupported          : 0
joins failed         : 0
joins sent           : 16
general queries sent : 6
group queries sent   : 4
total groups         : 5
total source groups  : 1
exit1-debian-11# sh ip igmp statistics json
{
  "global":{
    "name":"global",
    "queryV1":0,
    "queryV2":0,
    "queryV3":6,
    "leaveV2":0,
    "reportV1":0,
    "reportV2":0,
    "reportV3":18,
    "mtraceResponse":0,
    "mtraceRequest":0,
    "unsupported":0,
    "totalGroups":5,
    "totalSourceGroups":1,
    "joinsFailed":0,
    "joinsSent":16,
    "generalQueriesSent":6,
    "groupQueriesSent":4
  }
}
```

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
pimd/pim_cmd.c
pimd/pim_igmp.c
pimd/pim_igmp.h
pimd/pim_igmp_stats.c
pimd/pim_igmp_stats.h
pimd/pim_igmpv3.c

index 1c7fcd62e0fa8e9daed255b3c377e09796ef5c27..3c2f59bf2f5af1a00b7d8cfd94bc08c471978ad3 100644 (file)
@@ -1356,36 +1356,48 @@ static void igmp_show_statistics(struct pim_instance *pim, struct vty *vty,
                                    igmp_stats.joins_failed);
                json_object_int_add(json_row, "joinsSent",
                                    igmp_stats.joins_sent);
+               json_object_int_add(json_row, "generalQueriesSent",
+                                   igmp_stats.general_queries_sent);
+               json_object_int_add(json_row, "groupQueriesSent",
+                                   igmp_stats.group_queries_sent);
                json_object_object_add(json, ifname ? ifname : "global",
                                       json_row);
                vty_json(vty, json);
        } else {
                vty_out(vty, "IGMP statistics\n");
-               vty_out(vty, "Interface           : %s\n",
+               vty_out(vty, "Interface            : %s\n",
                        ifname ? ifname : "global");
-               vty_out(vty, "V1 query            : %u\n", igmp_stats.query_v1);
-               vty_out(vty, "V2 query            : %u\n", igmp_stats.query_v2);
-               vty_out(vty, "V3 query            : %u\n", igmp_stats.query_v3);
-               vty_out(vty, "V2 leave            : %u\n", igmp_stats.leave_v2);
-               vty_out(vty, "V1 report           : %u\n",
+               vty_out(vty, "V1 query             : %u\n",
+                       igmp_stats.query_v1);
+               vty_out(vty, "V2 query             : %u\n",
+                       igmp_stats.query_v2);
+               vty_out(vty, "V3 query             : %u\n",
+                       igmp_stats.query_v3);
+               vty_out(vty, "V2 leave             : %u\n",
+                       igmp_stats.leave_v2);
+               vty_out(vty, "V1 report            : %u\n",
                        igmp_stats.report_v1);
-               vty_out(vty, "V2 report           : %u\n",
+               vty_out(vty, "V2 report            : %u\n",
                        igmp_stats.report_v2);
-               vty_out(vty, "V3 report           : %u\n",
+               vty_out(vty, "V3 report            : %u\n",
                        igmp_stats.report_v3);
-               vty_out(vty, "mtrace response     : %u\n",
+               vty_out(vty, "mtrace response      : %u\n",
                        igmp_stats.mtrace_rsp);
-               vty_out(vty, "mtrace request      : %u\n",
+               vty_out(vty, "mtrace request       : %u\n",
                        igmp_stats.mtrace_req);
-               vty_out(vty, "unsupported         : %u\n",
+               vty_out(vty, "unsupported          : %u\n",
                        igmp_stats.unsupported);
-               vty_out(vty, "joins failed        : %u\n",
+               vty_out(vty, "joins failed         : %u\n",
                        igmp_stats.joins_failed);
-               vty_out(vty, "joins sent          : %u\n",
+               vty_out(vty, "joins sent           : %u\n",
                        igmp_stats.joins_sent);
-               vty_out(vty, "total groups        : %u\n",
+               vty_out(vty, "general queries sent : %u\n",
+                       igmp_stats.general_queries_sent);
+               vty_out(vty, "group queries sent   : %u\n",
+                       igmp_stats.group_queries_sent);
+               vty_out(vty, "total groups         : %u\n",
                        igmp_stats.total_groups);
-               vty_out(vty, "total source groups : %u\n",
+               vty_out(vty, "total source groups  : %u\n",
                        igmp_stats.total_source_groups);
        }
 }
index fcb335a5b323d16e6e8cb76e868d74056a39c008..cfab9265fd941f27ce2d1276992cdb7ae2ac2f45 100644 (file)
@@ -909,13 +909,10 @@ static void pim_igmp_general_query(struct thread *t)
                           querier_str, dst_str, igmp->interface->name);
        }
 
-       igmp_send_query(pim_ifp->igmp_version, 0 /* igmp_group */, igmp->fd,
-                       igmp->interface->name, query_buf, sizeof(query_buf),
-                       0 /* num_sources */, dst_addr, group_addr,
-                       pim_ifp->gm_query_max_response_time_dsec,
-                       1 /* s_flag: always set for general queries */,
-                       igmp->querier_robustness_variable,
-                       igmp->querier_query_interval);
+       igmp_send_query(pim_ifp->igmp_version, 0 /* igmp_group */, query_buf,
+                       sizeof(query_buf), 0 /* num_sources */, dst_addr,
+                       group_addr, pim_ifp->gm_query_max_response_time_dsec,
+                       1 /* s_flag: always set for general queries */, igmp);
 
        pim_igmp_general_query_on(igmp);
 }
@@ -1454,23 +1451,29 @@ struct gm_group *igmp_add_group_by_addr(struct gm_sock *igmp,
        return group;
 }
 
-void igmp_send_query(int igmp_version, struct gm_group *group, int fd,
-                    const char *ifname, char *query_buf, int query_buf_size,
-                    int num_sources, struct in_addr dst_addr,
-                    struct in_addr group_addr,
+void igmp_send_query(int igmp_version, struct gm_group *group, char *query_buf,
+                    int query_buf_size, int num_sources,
+                    struct in_addr dst_addr, struct in_addr group_addr,
                     int query_max_response_time_dsec, uint8_t s_flag,
-                    uint8_t querier_robustness_variable,
-                    uint16_t querier_query_interval)
+                    struct gm_sock *igmp)
 {
+       if (pim_addr_is_any(group_addr) &&
+           ntohl(dst_addr.s_addr) == INADDR_ALLHOSTS_GROUP)
+               igmp->igmp_stats.general_queries_sent++;
+       else if (group)
+               igmp->igmp_stats.group_queries_sent++;
+
        if (igmp_version == 3) {
-               igmp_v3_send_query(group, fd, ifname, query_buf, query_buf_size,
-                                  num_sources, dst_addr, group_addr,
+               igmp_v3_send_query(group, igmp->fd, igmp->interface->name,
+                                  query_buf, query_buf_size, num_sources,
+                                  dst_addr, group_addr,
                                   query_max_response_time_dsec, s_flag,
-                                  querier_robustness_variable,
-                                  querier_query_interval);
+                                  igmp->querier_robustness_variable,
+                                  igmp->querier_query_interval);
        } else if (igmp_version == 2) {
-               igmp_v2_send_query(group, fd, ifname, query_buf, dst_addr,
-                                  group_addr, query_max_response_time_dsec);
+               igmp_v2_send_query(group, igmp->fd, igmp->interface->name,
+                                  query_buf, dst_addr, group_addr,
+                                  query_max_response_time_dsec);
        }
 }
 
@@ -1501,13 +1504,10 @@ void igmp_send_query_on_intf(struct interface *ifp, int igmp_ver)
 
                char query_buf[query_buf_size];
 
-               igmp_send_query(igmp_ver, 0 /* igmp_group */, igmp->fd,
-                               igmp->interface->name, query_buf,
-                               sizeof(query_buf), 0 /* num_sources */,
-                               dst_addr, group_addr,
-                               pim_ifp->gm_query_max_response_time_dsec,
-                               1 /* s_flag: always set for general queries */,
-                               igmp->querier_robustness_variable,
-                               igmp->querier_query_interval);
+               igmp_send_query(
+                       igmp_ver, 0 /* igmp_group */, query_buf,
+                       sizeof(query_buf), 0 /* num_sources */, dst_addr,
+                       group_addr, pim_ifp->gm_query_max_response_time_dsec,
+                       1 /* s_flag: always set for general queries */, igmp);
        }
 }
index 4160dcb118ddc1fce43b79353d001bb3dd1ec3d7..a642469f273286f5cb084157bcbd88adce6248a5 100644 (file)
@@ -240,13 +240,11 @@ void igmp_startup_mode_on(struct gm_sock *igmp);
 void igmp_group_timer_on(struct gm_group *group, long interval_msec,
                         const char *ifname);
 
-void igmp_send_query(int igmp_version, struct gm_group *group, int fd,
-                    const char *ifname, char *query_buf, int query_buf_size,
-                    int num_sources, struct in_addr dst_addr,
-                    struct in_addr group_addr,
+void igmp_send_query(int igmp_version, struct gm_group *group, char *query_buf,
+                    int query_buf_size, int num_sources,
+                    struct in_addr dst_addr, struct in_addr group_addr,
                     int query_max_response_time_dsec, uint8_t s_flag,
-                    uint8_t querier_robustness_variable,
-                    uint16_t querier_query_interval);
+                    struct gm_sock *igmp);
 void igmp_group_delete(struct gm_group *group);
 
 void igmp_send_query_on_intf(struct interface *ifp, int igmp_ver);
index e1eb166b655722a83d9263aa8ac839299f6bb12e..b2f1d6b3cc8f4ebd95ecb65f173f3b87b6ebc071 100644 (file)
@@ -47,4 +47,6 @@ void igmp_stats_add(struct igmp_stats *a, struct igmp_stats *b)
        a->total_source_groups += b->total_source_groups;
        a->joins_sent += b->joins_sent;
        a->joins_failed += b->joins_failed;
+       a->general_queries_sent += b->general_queries_sent;
+       a->group_queries_sent += b->group_queries_sent;
 }
index ee74d939d550c8bb9f9e6c8d09b8ec1b600d95d4..c22922a31683523bbac13dff4dabc76b2cf6c157 100644 (file)
@@ -37,6 +37,8 @@ struct igmp_stats {
        uint32_t total_source_groups;
        uint32_t joins_sent;
        uint32_t joins_failed;
+       uint32_t general_queries_sent;
+       uint32_t group_queries_sent;
 };
 
 #if PIM_IPV == 4
index 1ce5fdc4b07b88291c4c97cb9d3a9d63ae004a83..027a79da98f95f911deec38014bd4a61b088267c 100644 (file)
@@ -984,12 +984,10 @@ static void igmp_send_query_group(struct gm_group *group, char *query_buf,
 
        for (ALL_LIST_ELEMENTS_RO(pim_ifp->gm_socket_list, sock_node, igmp)) {
                igmp_send_query(
-                       pim_ifp->igmp_version, group, igmp->fd, ifp->name,
-                       query_buf, query_buf_size, num_sources,
-                       group->group_addr, group->group_addr,
+                       pim_ifp->igmp_version, group, query_buf, query_buf_size,
+                       num_sources, group->group_addr, group->group_addr,
                        pim_ifp->gm_specific_query_max_response_time_dsec,
-                       s_flag, igmp->querier_robustness_variable,
-                       igmp->querier_query_interval);
+                       s_flag, igmp);
        }
 }