]> git.proxmox.com Git - mirror_frr.git/blob - lib/mlag.c
Merge pull request #12366 from manojvn/ospfv2-flood-reduction
[mirror_frr.git] / lib / mlag.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* mlag generic code.
3 * Copyright (C) 2018 Cumulus Networks, Inc.
4 * Donald Sharp
5 */
6 #include <zebra.h>
7
8 #include <mlag.h>
9
10 char *mlag_role2str(enum mlag_role role, char *buf, size_t size)
11 {
12 switch (role) {
13 case MLAG_ROLE_NONE:
14 snprintf(buf, size, "NONE");
15 break;
16 case MLAG_ROLE_PRIMARY:
17 snprintf(buf, size, "PRIMARY");
18 break;
19 case MLAG_ROLE_SECONDARY:
20 snprintf(buf, size, "SECONDARY");
21 break;
22 }
23
24 return buf;
25 }
26
27 char *mlag_lib_msgid_to_str(enum mlag_msg_type msg_type, char *buf, size_t size)
28 {
29 switch (msg_type) {
30 case MLAG_REGISTER:
31 snprintf(buf, size, "Register");
32 break;
33 case MLAG_DEREGISTER:
34 snprintf(buf, size, "De-Register");
35 break;
36 case MLAG_MROUTE_ADD:
37 snprintf(buf, size, "Mroute add");
38 break;
39 case MLAG_MROUTE_DEL:
40 snprintf(buf, size, "Mroute del");
41 break;
42 case MLAG_DUMP:
43 snprintf(buf, size, "Mlag Replay");
44 break;
45 case MLAG_MROUTE_ADD_BULK:
46 snprintf(buf, size, "Mroute Add Batch");
47 break;
48 case MLAG_MROUTE_DEL_BULK:
49 snprintf(buf, size, "Mroute Del Batch");
50 break;
51 case MLAG_STATUS_UPDATE:
52 snprintf(buf, size, "Mlag Status");
53 break;
54 case MLAG_VXLAN_UPDATE:
55 snprintf(buf, size, "Mlag vxlan update");
56 break;
57 case MLAG_PEER_FRR_STATUS:
58 snprintf(buf, size, "Mlag Peer FRR Status");
59 break;
60 case MLAG_PIM_CFG_DUMP:
61 snprintf(buf, size, "Mlag Pim Configuration Dump");
62 break;
63 case MLAG_MSG_NONE:
64 snprintf(buf, size, "Unknown %d", msg_type);
65 break;
66 }
67 return buf;
68 }
69
70
71 int mlag_lib_decode_mlag_hdr(struct stream *s, struct mlag_msg *msg,
72 size_t *length)
73 {
74 #define LIB_MLAG_HDR_LENGTH 8
75 if (s == NULL || msg == NULL)
76 return -1;
77
78 *length = stream_get_endp(s);
79
80 if (*length < LIB_MLAG_HDR_LENGTH)
81 return -1;
82
83 *length -= LIB_MLAG_HDR_LENGTH;
84
85 STREAM_GETL(s, msg->msg_type);
86 STREAM_GETW(s, msg->data_len);
87 STREAM_GETW(s, msg->msg_cnt);
88
89 return 0;
90 stream_failure:
91 return -1;
92 }
93
94 #define MLAG_MROUTE_ADD_LENGTH \
95 (VRF_NAMSIZ + INTERFACE_NAMSIZ + 4 + 4 + 4 + 4 + 1 + 1 + 4)
96
97 int mlag_lib_decode_mroute_add(struct stream *s, struct mlag_mroute_add *msg,
98 size_t *length)
99 {
100 if (s == NULL || msg == NULL || *length < MLAG_MROUTE_ADD_LENGTH)
101 return -1;
102
103 STREAM_GET(msg->vrf_name, s, VRF_NAMSIZ);
104 STREAM_GETL(s, msg->source_ip);
105 STREAM_GETL(s, msg->group_ip);
106 STREAM_GETL(s, msg->cost_to_rp);
107 STREAM_GETL(s, msg->owner_id);
108 STREAM_GETC(s, msg->am_i_dr);
109 STREAM_GETC(s, msg->am_i_dual_active);
110 STREAM_GETL(s, msg->vrf_id);
111 STREAM_GET(msg->intf_name, s, INTERFACE_NAMSIZ);
112
113 return 0;
114 stream_failure:
115 return -1;
116 }
117
118 #define MLAG_MROUTE_DEL_LENGTH (VRF_NAMSIZ + INTERFACE_NAMSIZ + 4 + 4 + 4 + 4)
119
120 int mlag_lib_decode_mroute_del(struct stream *s, struct mlag_mroute_del *msg,
121 size_t *length)
122 {
123 if (s == NULL || msg == NULL || *length < MLAG_MROUTE_DEL_LENGTH)
124 return -1;
125
126 STREAM_GET(msg->vrf_name, s, VRF_NAMSIZ);
127 STREAM_GETL(s, msg->source_ip);
128 STREAM_GETL(s, msg->group_ip);
129 STREAM_GETL(s, msg->owner_id);
130 STREAM_GETL(s, msg->vrf_id);
131 STREAM_GET(msg->intf_name, s, INTERFACE_NAMSIZ);
132
133 return 0;
134 stream_failure:
135 return -1;
136 }
137
138 int mlag_lib_decode_mlag_status(struct stream *s, struct mlag_status *msg)
139 {
140 if (s == NULL || msg == NULL)
141 return -1;
142
143 STREAM_GET(msg->peerlink_rif, s, INTERFACE_NAMSIZ);
144 STREAM_GETL(s, msg->my_role);
145 STREAM_GETL(s, msg->peer_state);
146 return 0;
147 stream_failure:
148 return -1;
149 }
150
151 int mlag_lib_decode_vxlan_update(struct stream *s, struct mlag_vxlan *msg)
152 {
153 if (s == NULL || msg == NULL)
154 return -1;
155
156 STREAM_GETL(s, msg->anycast_ip);
157 STREAM_GETL(s, msg->local_ip);
158 return 0;
159
160 stream_failure:
161 return -1;
162 }
163
164 int mlag_lib_decode_frr_status(struct stream *s, struct mlag_frr_status *msg)
165 {
166 if (s == NULL || msg == NULL)
167 return -1;
168
169 STREAM_GETL(s, msg->frr_state);
170 return 0;
171 stream_failure:
172 return -1;
173 }