]> git.proxmox.com Git - mirror_frr.git/blob - lib/mlag.h
Merge pull request #12795 from pguibert6WIND/vpnv6_nexthop_encoding
[mirror_frr.git] / lib / mlag.h
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* mlag header.
3 * Copyright (C) 2018 Cumulus Networks, Inc.
4 * Donald Sharp
5 */
6 #ifndef __MLAG_H__
7 #define __MLAG_H__
8
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12
13 #include "lib/if.h"
14 #include "lib/vrf.h"
15 #include "lib/stream.h"
16
17 #define MLAG_MSG_NULL_PAYLOAD 0
18 #define MLAG_MSG_NO_BATCH 1
19 #define MLAG_BUF_LIMIT 2048
20
21 enum mlag_role {
22 MLAG_ROLE_NONE,
23 MLAG_ROLE_PRIMARY,
24 MLAG_ROLE_SECONDARY
25 };
26
27 enum mlag_state {
28 MLAG_STATE_DOWN,
29 MLAG_STATE_RUNNING,
30 };
31
32 enum mlag_frr_state {
33 MLAG_FRR_STATE_NONE,
34 MLAG_FRR_STATE_DOWN,
35 MLAG_FRR_STATE_UP,
36 };
37
38 enum mlag_owner {
39 MLAG_OWNER_NONE,
40 MLAG_OWNER_INTERFACE,
41 MLAG_OWNER_VXLAN,
42 };
43
44 /*
45 * This message definition should match mlag.proto
46 * Because message registration is based on this
47 */
48 enum mlag_msg_type {
49 MLAG_MSG_NONE = 0,
50 MLAG_REGISTER = 1,
51 MLAG_DEREGISTER = 2,
52 MLAG_STATUS_UPDATE = 3,
53 MLAG_MROUTE_ADD = 4,
54 MLAG_MROUTE_DEL = 5,
55 MLAG_DUMP = 6,
56 MLAG_MROUTE_ADD_BULK = 7,
57 MLAG_MROUTE_DEL_BULK = 8,
58 MLAG_PIM_CFG_DUMP = 10,
59 MLAG_VXLAN_UPDATE = 11,
60 MLAG_PEER_FRR_STATUS = 12,
61 };
62
63 struct mlag_frr_status {
64 enum mlag_frr_state frr_state;
65 };
66
67 struct mlag_status {
68 char peerlink_rif[INTERFACE_NAMSIZ];
69 enum mlag_role my_role;
70 enum mlag_state peer_state;
71 };
72
73 #define MLAG_ROLE_STRSIZE 16
74
75 struct mlag_vxlan {
76 uint32_t anycast_ip;
77 uint32_t local_ip;
78 };
79
80 struct mlag_mroute_add {
81 char vrf_name[VRF_NAMSIZ];
82 uint32_t source_ip;
83 uint32_t group_ip;
84 uint32_t cost_to_rp;
85 enum mlag_owner owner_id;
86 bool am_i_dr;
87 bool am_i_dual_active;
88 vrf_id_t vrf_id;
89 char intf_name[INTERFACE_NAMSIZ];
90 };
91
92 struct mlag_mroute_del {
93 char vrf_name[VRF_NAMSIZ];
94 uint32_t source_ip;
95 uint32_t group_ip;
96 enum mlag_owner owner_id;
97 vrf_id_t vrf_id;
98 char intf_name[INTERFACE_NAMSIZ];
99 };
100
101 struct mlag_msg {
102 enum mlag_msg_type msg_type;
103 uint16_t data_len;
104 uint16_t msg_cnt;
105 uint8_t data[0];
106 } __attribute__((packed));
107
108
109 extern char *mlag_role2str(enum mlag_role role, char *buf, size_t size);
110 extern char *mlag_lib_msgid_to_str(enum mlag_msg_type msg_type, char *buf,
111 size_t size);
112 extern int mlag_lib_decode_mlag_hdr(struct stream *s, struct mlag_msg *msg,
113 size_t *length);
114 extern int mlag_lib_decode_mroute_add(struct stream *s,
115 struct mlag_mroute_add *msg,
116 size_t *length);
117 extern int mlag_lib_decode_mroute_del(struct stream *s,
118 struct mlag_mroute_del *msg,
119 size_t *length);
120 extern int mlag_lib_decode_mlag_status(struct stream *s,
121 struct mlag_status *msg);
122 extern int mlag_lib_decode_vxlan_update(struct stream *s,
123 struct mlag_vxlan *msg);
124 extern int mlag_lib_decode_frr_status(struct stream *s,
125 struct mlag_frr_status *msg);
126 #ifdef __cplusplus
127 }
128 #endif
129
130 #endif