]> git.proxmox.com Git - mirror_frr.git/blame - lib/mlag.c
Merge pull request #13649 from donaldsharp/unlock_the_node_or_else
[mirror_frr.git] / lib / mlag.c
CommitLineData
acddc0ed 1// SPDX-License-Identifier: GPL-2.0-or-later
6edbb8b2
DS
2/* mlag generic code.
3 * Copyright (C) 2018 Cumulus Networks, Inc.
4 * Donald Sharp
6edbb8b2
DS
5 */
6#include <zebra.h>
7
8#include <mlag.h>
9
10char *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}
46c2687c 26
1e76492b 27char *mlag_lib_msgid_to_str(enum mlag_msg_type msg_type, char *buf, size_t size)
46c2687c
SK
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;
5c260548
DS
60 case MLAG_PIM_CFG_DUMP:
61 snprintf(buf, size, "Mlag Pim Configuration Dump");
62 break;
63 case MLAG_MSG_NONE:
46c2687c
SK
64 snprintf(buf, size, "Unknown %d", msg_type);
65 break;
66 }
67 return buf;
68}
69
70
83f8a12b
SK
71int mlag_lib_decode_mlag_hdr(struct stream *s, struct mlag_msg *msg,
72 size_t *length)
46c2687c 73{
83f8a12b 74#define LIB_MLAG_HDR_LENGTH 8
d1ba1814
DS
75 if (s == NULL || msg == NULL)
76 return -1;
77
83f8a12b
SK
78 *length = stream_get_endp(s);
79
d1ba1814 80 if (*length < LIB_MLAG_HDR_LENGTH)
46c2687c
SK
81 return -1;
82
83f8a12b
SK
83 *length -= LIB_MLAG_HDR_LENGTH;
84
46c2687c
SK
85 STREAM_GETL(s, msg->msg_type);
86 STREAM_GETW(s, msg->data_len);
87 STREAM_GETW(s, msg->msg_cnt);
83f8a12b 88
46c2687c
SK
89 return 0;
90stream_failure:
91 return -1;
92}
93
83f8a12b
SK
94#define MLAG_MROUTE_ADD_LENGTH \
95 (VRF_NAMSIZ + INTERFACE_NAMSIZ + 4 + 4 + 4 + 4 + 1 + 1 + 4)
96
97int mlag_lib_decode_mroute_add(struct stream *s, struct mlag_mroute_add *msg,
98 size_t *length)
46c2687c 99{
83f8a12b 100 if (s == NULL || msg == NULL || *length < MLAG_MROUTE_ADD_LENGTH)
46c2687c
SK
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);
83f8a12b 112
46c2687c
SK
113 return 0;
114stream_failure:
115 return -1;
116}
117
83f8a12b
SK
118#define MLAG_MROUTE_DEL_LENGTH (VRF_NAMSIZ + INTERFACE_NAMSIZ + 4 + 4 + 4 + 4)
119
120int mlag_lib_decode_mroute_del(struct stream *s, struct mlag_mroute_del *msg,
121 size_t *length)
46c2687c 122{
83f8a12b 123 if (s == NULL || msg == NULL || *length < MLAG_MROUTE_DEL_LENGTH)
46c2687c
SK
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);
83f8a12b 132
46c2687c
SK
133 return 0;
134stream_failure:
135 return -1;
136}
137
1e76492b 138int mlag_lib_decode_mlag_status(struct stream *s, struct mlag_status *msg)
46c2687c
SK
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;
147stream_failure:
148 return -1;
149}
150
1e76492b 151int mlag_lib_decode_vxlan_update(struct stream *s, struct mlag_vxlan *msg)
46c2687c
SK
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
160stream_failure:
161 return -1;
162}
163
1e76492b 164int mlag_lib_decode_frr_status(struct stream *s, struct mlag_frr_status *msg)
46c2687c
SK
165{
166 if (s == NULL || msg == NULL)
167 return -1;
168
169 STREAM_GETL(s, msg->frr_state);
170 return 0;
171stream_failure:
172 return -1;
173}