summaryrefslogtreecommitdiffstats
path: root/zebra/zebra_l2.h
blob: 1c3e98158d4765a6bd80404306ea03e6c628792f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/*
 * Zebra Layer-2 interface Data structures and definitions
 * Copyright (C) 2016, 2017 Cumulus Networks, Inc.
 *
 * This file is part of FRR.
 *
 * FRR is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2, or (at your option) any
 * later version.
 *
 * FRR is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with FRR; see the file COPYING.  If not, write to the Free
 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 * 02111-1307, USA.
 */

#ifndef _ZEBRA_L2_H
#define _ZEBRA_L2_H

#include <zebra.h>

#include "if.h"
#include "vlan.h"
#include "vxlan.h"
#include "zebra/zebra_vrf.h"

#ifdef __cplusplus
extern "C" {
#endif

#define ZEBRA_BRIDGE_NO_ACTION (0)
#define ZEBRA_BRIDGE_MASTER_MAC_CHANGE (1 << 1)
#define ZEBRA_BRIDGE_MASTER_UP (1 << 2)

/* zebra L2 interface information - bridge slave (linkage to bridge) */
struct zebra_l2info_brslave {
	ifindex_t bridge_ifindex; /* Bridge Master */
	struct interface *br_if;  /* Pointer to master */
	ns_id_t ns_id; /* network namespace where bridge is */
};

struct zebra_l2info_bond {
	struct list *mbr_zifs; /* slaves using this bond as a master */
};

/* zebra L2 interface information - bridge interface */
struct zebra_l2info_bridge {
	uint8_t vlan_aware; /* VLAN-aware bridge? */
};

/* zebra L2 interface information - VLAN interface */
struct zebra_l2info_vlan {
	vlanid_t vid; /* VLAN id */
};

/* zebra L2 interface information - GRE interface */
struct zebra_l2info_gre {
	struct in_addr vtep_ip; /* IFLA_GRE_LOCAL */
	struct in_addr vtep_ip_remote; /* IFLA_GRE_REMOTE */
	uint32_t ikey;
	uint32_t okey;
	ifindex_t ifindex_link; /* Interface index of interface
				 * linked with GRE
				 */
	ns_id_t link_nsid;
};

/* zebra L2 interface information - VXLAN interface */
struct zebra_l2info_vxlan {
	vni_t vni;		/* VNI */
	struct in_addr vtep_ip; /* Local tunnel IP */
	vlanid_t access_vlan;   /* Access VLAN - for VLAN-aware bridge. */
	struct in_addr mcast_grp;
	ifindex_t ifindex_link; /* Interface index of interface
				 * linked with VXLAN
				 */
	ns_id_t link_nsid;
};

struct zebra_l2info_bondslave {
	ifindex_t bond_ifindex;    /* Bridge Master */
	struct interface *bond_if; /* Pointer to master */
};

union zebra_l2if_info {
	struct zebra_l2info_bridge br;
	struct zebra_l2info_vlan vl;
	struct zebra_l2info_vxlan vxl;
	struct zebra_l2info_gre gre;
};

/* NOTE: These macros are to be invoked only in the "correct" context.
 * IOW, the macro VNI_FROM_ZEBRA_IF() will assume the interface is
 * of type ZEBRA_IF_VXLAN.
 */
#define VNI_FROM_ZEBRA_IF(zif) (zif)->l2info.vxl.vni
#define VLAN_ID_FROM_ZEBRA_IF(zif) (zif)->l2info.vl.vid

#define IS_ZEBRA_IF_BRIDGE_VLAN_AWARE(zif) ((zif)->l2info.br.vlan_aware == 1)

extern void zebra_l2_map_slave_to_bridge(struct zebra_l2info_brslave *br_slave,
					 struct zebra_ns *zns);
extern void
zebra_l2_unmap_slave_from_bridge(struct zebra_l2info_brslave *br_slave);
extern void zebra_l2_bridge_add_update(struct interface *ifp,
				       struct zebra_l2info_bridge *bridge_info,
				       int add);
extern void zebra_l2_bridge_del(struct interface *ifp);
extern void zebra_l2_vlanif_update(struct interface *ifp,
				   struct zebra_l2info_vlan *vlan_info);
extern void zebra_l2_greif_add_update(struct interface *ifp,
				      struct zebra_l2info_gre *vxlan_info,
				      int add);
extern void zebra_l2_vxlanif_add_update(struct interface *ifp,
					struct zebra_l2info_vxlan *vxlan_info,
					int add);
extern void zebra_l2_vxlanif_update_access_vlan(struct interface *ifp,
						vlanid_t access_vlan);
extern void zebra_l2_greif_del(struct interface *ifp);
extern void zebra_l2_vxlanif_del(struct interface *ifp);
extern void zebra_l2if_update_bridge_slave(struct interface *ifp,
					   ifindex_t bridge_ifindex,
					   ns_id_t ns_id, uint8_t chgflags);

extern void zebra_l2if_update_bond_slave(struct interface *ifp,
					 ifindex_t bond_ifindex, bool bypass);
extern void zebra_vlan_bitmap_compute(struct interface *ifp,
		uint32_t vid_start, uint16_t vid_end);
extern void zebra_vlan_mbr_re_eval(struct interface *ifp,
		bitfield_t vlan_bitmap);
extern void zebra_l2if_update_bond(struct interface *ifp, bool add);
extern void zebra_l2if_update_bridge(struct interface *ifp, uint8_t chgflags);

#ifdef __cplusplus
}
#endif

#endif /* _ZEBRA_L2_H */