2 * Zebra Layer-2 interface handling code
3 * Copyright (C) 2016, 2017 Cumulus Networks, Inc.
5 * This file is part of FRR.
7 * FRR is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2, or (at your option) any
12 * FRR is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with FRR; see the file COPYING. If not, write to the Free
19 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
35 #include "zebra/rib.h"
37 #include "zebra/zebra_ns.h"
38 #include "zebra/zserv.h"
39 #include "zebra/debug.h"
40 #include "zebra/interface.h"
41 #include "zebra/zebra_memory.h"
42 #include "zebra/zebra_vrf.h"
43 #include "zebra/rt_netlink.h"
44 #include "zebra/zebra_l2.h"
45 #include "zebra/zebra_vxlan.h"
49 /* static function declarations */
51 /* Private functions */
53 map_slaves_to_bridge (struct interface
*br_if
, int link
)
56 struct listnode
*node
;
57 struct interface
*ifp
;
59 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
)
61 for (ALL_LIST_ELEMENTS_RO (vrf
->iflist
, node
, ifp
))
64 struct zebra_l2info_brslave
*br_slave
;
66 if (ifp
->ifindex
== IFINDEX_INTERNAL
||
69 if (!IS_ZEBRA_IF_BRIDGE_SLAVE (ifp
))
72 /* NOTE: This assumes 'zebra_l2info_brslave' is the first field
73 * for any L2 interface.
75 zif
= (struct zebra_if
*) ifp
->info
;
76 br_slave
= &zif
->brslave_info
;
80 if (br_slave
->bridge_ifindex
== br_if
->ifindex
)
81 br_slave
->br_if
= br_if
;
85 if (br_slave
->br_if
== br_if
)
86 br_slave
->br_if
= NULL
;
92 /* Public functions */
94 zebra_l2_map_slave_to_bridge (struct zebra_l2info_brslave
*br_slave
)
96 struct interface
*br_if
;
98 /* TODO: Handle change of master */
99 br_if
= if_lookup_by_index_per_ns (zebra_ns_lookup (NS_DEFAULT
),
100 br_slave
->bridge_ifindex
);
102 br_slave
->br_if
= br_if
;
106 zebra_l2_unmap_slave_from_bridge (struct zebra_l2info_brslave
*br_slave
)
108 br_slave
->br_if
= NULL
;
112 * Handle Bridge interface add or update. Update relevant info,
113 * map slaves (if any) to the bridge.
116 zebra_l2_bridge_add_update (struct interface
*ifp
,
117 struct zebra_l2info_bridge
*bridge_info
,
120 struct zebra_if
*zif
;
125 /* Copy over the L2 information. */
126 memcpy (&zif
->l2info
.br
, bridge_info
, sizeof (*bridge_info
));
128 /* Link all slaves to this bridge */
129 map_slaves_to_bridge (ifp
, 1);
133 * Handle Bridge interface delete.
136 zebra_l2_bridge_del (struct interface
*ifp
)
138 /* Unlink all slaves to this bridge */
139 map_slaves_to_bridge (ifp
, 0);
143 * Update L2 info for a VLAN interface. Only relevant parameter is the
144 * VLAN Id and this cannot change.
147 zebra_l2_vlanif_update (struct interface
*ifp
,
148 struct zebra_l2info_vlan
*vlan_info
)
150 struct zebra_if
*zif
;
155 /* Copy over the L2 information. */
156 memcpy (&zif
->l2info
.vl
, vlan_info
, sizeof (*vlan_info
));
160 * Update L2 info for a VxLAN interface. This is called upon interface
161 * addition as well as update. Upon add, need to invoke the VNI create
162 * function. Upon update, the params of interest are the local tunnel
163 * IP and VLAN mapping, but the latter is handled separately.
166 zebra_l2_vxlanif_add_update (struct interface
*ifp
,
167 struct zebra_l2info_vxlan
*vxlan_info
,
170 struct zebra_if
*zif
;
171 struct in_addr old_vtep_ip
;
178 memcpy (&zif
->l2info
.vxl
, vxlan_info
, sizeof (*vxlan_info
));
179 zebra_vxlan_if_add (ifp
);
183 old_vtep_ip
= zif
->l2info
.vxl
.vtep_ip
;
184 if (IPV4_ADDR_SAME(&old_vtep_ip
, &vxlan_info
->vtep_ip
))
187 zif
->l2info
.vxl
.vtep_ip
= vxlan_info
->vtep_ip
;
188 zebra_vxlan_if_update (ifp
, ZEBRA_VXLIF_LOCAL_IP_CHANGE
);
192 * Handle change to VLAN to VNI mapping.
195 zebra_l2_vxlanif_update_access_vlan (struct interface
*ifp
,
196 vlanid_t access_vlan
)
198 struct zebra_if
*zif
;
199 vlanid_t old_access_vlan
;
204 old_access_vlan
= zif
->l2info
.vxl
.access_vlan
;
205 if (old_access_vlan
== access_vlan
)
208 zif
->l2info
.vxl
.access_vlan
= access_vlan
;
209 zebra_vxlan_if_update (ifp
, ZEBRA_VXLIF_VLAN_CHANGE
);
213 * Handle VxLAN interface delete.
216 zebra_l2_vxlanif_del (struct interface
*ifp
)
218 zebra_vxlan_if_del (ifp
);
222 * Map or unmap interface from bridge.
223 * NOTE: It is currently assumped that an interface has to be unmapped
224 * from a bridge before it can be mapped to another bridge.
227 zebra_l2if_update_bridge_slave (struct interface
*ifp
,
228 ifindex_t bridge_ifindex
)
230 struct zebra_if
*zif
;
231 ifindex_t old_bridge_ifindex
;
236 old_bridge_ifindex
= zif
->brslave_info
.bridge_ifindex
;
237 if (old_bridge_ifindex
== bridge_ifindex
)
240 zif
->brslave_info
.bridge_ifindex
= bridge_ifindex
;
242 /* Set up or remove link with master */
243 if (bridge_ifindex
!= IFINDEX_INTERNAL
)
244 zebra_l2_map_slave_to_bridge (&zif
->brslave_info
);
245 else if (old_bridge_ifindex
!= IFINDEX_INTERNAL
)
246 zebra_l2_unmap_slave_from_bridge (&zif
->brslave_info
);
248 /* In the case of VxLAN, invoke the handler for EVPN. */
249 if (zif
->zif_type
== ZEBRA_IF_VXLAN
)
250 zebra_vxlan_if_update (ifp
, ZEBRA_VXLIF_MASTER_CHANGE
);