summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Lamparter <equinox@diac24.net>2018-08-31 08:51:01 +0200
committerGitHub <noreply@github.com>2018-08-31 08:51:01 +0200
commit5c724747c122cf7be0dcded9af6b88b31bf5f6c6 (patch)
treeb9f1056ca504225b46089d69d25a12e40b2f72b1
parenta91a5dcdd6f797336fc1e6ccf69567a384a76097 (diff)
parent0e4864eaf0dfd5d883d8192a905405b9a72af68e (diff)
Merge pull request #2923 from pguibert6WIND/fix_veth_namespace
zebra: when veth link is used across vrf, the link may not be good
-rw-r--r--zebra/if_netlink.c6
-rw-r--r--zebra/interface.c11
-rw-r--r--zebra/interface.h9
3 files changed, 20 insertions, 6 deletions
diff --git a/zebra/if_netlink.c b/zebra/if_netlink.c
index a15d914243..0dcf5082a2 100644
--- a/zebra/if_netlink.c
+++ b/zebra/if_netlink.c
@@ -259,6 +259,8 @@ static void netlink_determine_zebra_iftype(char *kind, zebra_iftype_t *zif_type)
*zif_type = ZEBRA_IF_VXLAN;
else if (strcmp(kind, "macvlan") == 0)
*zif_type = ZEBRA_IF_MACVLAN;
+ else if (strcmp(kind, "veth") == 0)
+ *zif_type = ZEBRA_IF_VETH;
}
#define parse_rtattr_nested(tb, max, rta) \
@@ -675,7 +677,7 @@ static int netlink_interface(struct nlmsghdr *h, ns_id_t ns_id, int startup)
SET_FLAG(ifp->status, ZEBRA_INTERFACE_VRF_LOOPBACK);
/* Update link. */
- zebra_if_update_link(ifp, link_ifindex);
+ zebra_if_update_link(ifp, link_ifindex, ns_id);
/* Hardware type and address. */
ifp->ll_type = netlink_to_zebra_link_type(ifi->ifi_type);
@@ -1262,7 +1264,7 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup)
ZEBRA_INTERFACE_VRF_LOOPBACK);
/* Update link. */
- zebra_if_update_link(ifp, link_ifindex);
+ zebra_if_update_link(ifp, link_ifindex, ns_id);
netlink_interface_update_hw_addr(tb, ifp);
diff --git a/zebra/interface.c b/zebra/interface.c
index 763931d350..32ee1a566a 100644
--- a/zebra/interface.c
+++ b/zebra/interface.c
@@ -1002,13 +1002,16 @@ void if_refresh(struct interface *ifp)
if_get_flags(ifp);
}
-void zebra_if_update_link(struct interface *ifp, ifindex_t link_ifindex)
+void zebra_if_update_link(struct interface *ifp, ifindex_t link_ifindex,
+ ns_id_t ns_id)
{
struct zebra_if *zif;
+ if (IS_ZEBRA_IF_VETH(ifp))
+ return;
zif = (struct zebra_if *)ifp->info;
zif->link_ifindex = link_ifindex;
- zif->link = if_lookup_by_index_per_ns(zebra_ns_lookup(NS_DEFAULT),
+ zif->link = if_lookup_by_index_per_ns(zebra_ns_lookup(ns_id),
link_ifindex);
}
@@ -1093,6 +1096,10 @@ static const char *zebra_ziftype_2str(zebra_iftype_t zif_type)
return "VRF";
break;
+ case ZEBRA_IF_VETH:
+ return "VETH";
+ break;
+
default:
return "Unknown";
break;
diff --git a/zebra/interface.h b/zebra/interface.h
index 9634bfdb3f..956d430cf9 100644
--- a/zebra/interface.h
+++ b/zebra/interface.h
@@ -191,6 +191,7 @@ typedef enum {
ZEBRA_IF_BRIDGE, /* bridge device */
ZEBRA_IF_VLAN, /* VLAN sub-interface */
ZEBRA_IF_MACVLAN, /* MAC VLAN interface*/
+ ZEBRA_IF_VETH, /* VETH interface*/
} zebra_iftype_t;
/* Zebra "slave" interface type */
@@ -312,7 +313,10 @@ static inline void zebra_if_set_ziftype(struct interface *ifp,
#define IS_ZEBRA_IF_MACVLAN(ifp) \
(((struct zebra_if *)(ifp->info))->zif_type == ZEBRA_IF_MACVLAN)
-#define IS_ZEBRA_IF_BRIDGE_SLAVE(ifp) \
+#define IS_ZEBRA_IF_VETH(ifp) \
+ (((struct zebra_if *)(ifp->info))->zif_type == ZEBRA_IF_VETH)
+
+#define IS_ZEBRA_IF_BRIDGE_SLAVE(ifp) \
(((struct zebra_if *)(ifp->info))->zif_slave_type \
== ZEBRA_IF_SLAVE_BRIDGE)
@@ -344,7 +348,8 @@ extern int if_subnet_add(struct interface *, struct connected *);
extern int if_subnet_delete(struct interface *, struct connected *);
extern int ipv6_address_configured(struct interface *ifp);
extern void if_handle_vrf_change(struct interface *ifp, vrf_id_t vrf_id);
-extern void zebra_if_update_link(struct interface *ifp, ifindex_t link_ifindex);
+extern void zebra_if_update_link(struct interface *ifp, ifindex_t link_ifindex,
+ ns_id_t ns_id);
extern void vrf_add_update(struct vrf *vrfp);