]>
Commit | Line | Data |
---|---|---|
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 | ||
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 | } | |
46c2687c | 26 | |
1e76492b | 27 | char *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 |
71 | int 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; |
90 | stream_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 | ||
97 | int 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; |
114 | stream_failure: | |
115 | return -1; | |
116 | } | |
117 | ||
83f8a12b SK |
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) | |
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; |
134 | stream_failure: | |
135 | return -1; | |
136 | } | |
137 | ||
1e76492b | 138 | int 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; | |
147 | stream_failure: | |
148 | return -1; | |
149 | } | |
150 | ||
1e76492b | 151 | int 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 | ||
160 | stream_failure: | |
161 | return -1; | |
162 | } | |
163 | ||
1e76492b | 164 | int 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; | |
171 | stream_failure: | |
172 | return -1; | |
173 | } |