/src/frr/zebra/zebra_mroute.c
Line | Count | Source |
1 | | // SPDX-License-Identifier: GPL-2.0-or-later |
2 | | /* zebra_mroute code |
3 | | * Copyright (C) 2016 Cumulus Networks, Inc. |
4 | | * Donald Sharp |
5 | | * |
6 | | * This file is part of Quagga |
7 | | */ |
8 | | |
9 | | #include <zebra.h> |
10 | | |
11 | | #include "stream.h" |
12 | | #include "prefix.h" |
13 | | #include "vrf.h" |
14 | | #include "rib.h" |
15 | | |
16 | | #include "zebra/zserv.h" |
17 | | #include "zebra/zebra_vrf.h" |
18 | | #include "zebra/zebra_mroute.h" |
19 | | #include "zebra/rt.h" |
20 | | #include "zebra/debug.h" |
21 | | |
22 | | void zebra_ipmr_route_stats(ZAPI_HANDLER_ARGS) |
23 | 0 | { |
24 | 0 | struct mcast_route_data mroute; |
25 | 0 | struct stream *s; |
26 | 0 | int suc = -1; |
27 | |
|
28 | 0 | memset(&mroute, 0, sizeof(mroute)); |
29 | 0 | STREAM_GETL(msg, mroute.family); |
30 | | |
31 | 0 | switch (mroute.family) { |
32 | 0 | case AF_INET: |
33 | 0 | SET_IPADDR_V4(&mroute.src); |
34 | 0 | SET_IPADDR_V4(&mroute.grp); |
35 | 0 | STREAM_GET(&mroute.src.ipaddr_v4, msg, |
36 | 0 | sizeof(mroute.src.ipaddr_v4)); |
37 | 0 | STREAM_GET(&mroute.grp.ipaddr_v4, msg, |
38 | 0 | sizeof(mroute.grp.ipaddr_v4)); |
39 | 0 | break; |
40 | 0 | case AF_INET6: |
41 | 0 | SET_IPADDR_V6(&mroute.src); |
42 | 0 | SET_IPADDR_V6(&mroute.grp); |
43 | 0 | STREAM_GET(&mroute.src.ipaddr_v6, msg, |
44 | 0 | sizeof(mroute.src.ipaddr_v6)); |
45 | 0 | STREAM_GET(&mroute.grp.ipaddr_v6, msg, |
46 | 0 | sizeof(mroute.grp.ipaddr_v6)); |
47 | 0 | break; |
48 | 0 | default: |
49 | 0 | zlog_warn("%s: Invalid address family received while parsing", |
50 | 0 | __func__); |
51 | 0 | return; |
52 | 0 | } |
53 | | |
54 | 0 | STREAM_GETL(msg, mroute.ifindex); |
55 | | |
56 | 0 | if (IS_ZEBRA_DEBUG_KERNEL) |
57 | 0 | zlog_debug("Asking for (%pIA,%pIA)[%s(%u)] mroute information", |
58 | 0 | &mroute.src, &mroute.grp, zvrf->vrf->name, |
59 | 0 | zvrf->vrf->vrf_id); |
60 | |
|
61 | 0 | suc = kernel_get_ipmr_sg_stats(zvrf, &mroute); |
62 | |
|
63 | 0 | stream_failure: |
64 | 0 | s = stream_new(ZEBRA_MAX_PACKET_SIZ); |
65 | |
|
66 | 0 | stream_reset(s); |
67 | |
|
68 | 0 | zclient_create_header(s, ZEBRA_IPMR_ROUTE_STATS, zvrf_id(zvrf)); |
69 | |
|
70 | 0 | if (mroute.family == AF_INET) { |
71 | 0 | stream_write(s, &mroute.src.ipaddr_v4, |
72 | 0 | sizeof(mroute.src.ipaddr_v4)); |
73 | 0 | stream_write(s, &mroute.grp.ipaddr_v4, |
74 | 0 | sizeof(mroute.grp.ipaddr_v4)); |
75 | 0 | } else { |
76 | 0 | stream_write(s, &mroute.src.ipaddr_v6, |
77 | 0 | sizeof(mroute.src.ipaddr_v6)); |
78 | 0 | stream_write(s, &mroute.grp.ipaddr_v6, |
79 | 0 | sizeof(mroute.grp.ipaddr_v6)); |
80 | 0 | } |
81 | |
|
82 | 0 | stream_put(s, &mroute.lastused, sizeof(mroute.lastused)); |
83 | 0 | stream_putl(s, (uint32_t)suc); |
84 | |
|
85 | 0 | stream_putw_at(s, 0, stream_get_endp(s)); |
86 | 0 | zserv_send_message(client, s); |
87 | 0 | } |