mirror of
https://github.com/systemd/systemd.git
synced 2024-11-27 04:03:36 +08:00
networkd: added support for vrf interfaces (#3316)
This commit is contained in:
parent
a1feacf77f
commit
20897a0d6e
@ -5462,6 +5462,8 @@ libnetworkd_core_la_SOURCES = \
|
||||
src/network/networkd-link.c \
|
||||
src/network/networkd-netdev.h \
|
||||
src/network/networkd-netdev.c \
|
||||
src/network/networkd-netdev-vrf.h \
|
||||
src/network/networkd-netdev-vrf.c \
|
||||
src/network/networkd-netdev-tunnel.h \
|
||||
src/network/networkd-netdev-tunnel.c \
|
||||
src/network/networkd-netdev-veth.h \
|
||||
|
@ -325,6 +325,7 @@ AC_CHECK_TYPES([char16_t, char32_t, key_serial_t],
|
||||
|
||||
AC_CHECK_DECLS([IFLA_INET6_ADDR_GEN_MODE,
|
||||
IN6_ADDR_GEN_MODE_STABLE_PRIVACY,
|
||||
IFLA_VRF_TABLE,
|
||||
IFLA_MACVLAN_FLAGS,
|
||||
IFLA_IPVLAN_MODE,
|
||||
IFLA_VTI_REMOTE,
|
||||
|
@ -161,6 +161,10 @@
|
||||
|
||||
<row><entry><varname>vxlan</varname></entry>
|
||||
<entry>A virtual extensible LAN (vxlan), for connecting Cloud computing deployments.</entry></row>
|
||||
|
||||
<row><entry><varname>vrf</varname></entry>
|
||||
<entry>A Virtual Routing and Forwarding (<ulink url="https://www.kernel.org/doc/Documentation/networking/vrf.txt">VRF</ulink>) interface to create seperate routing and forwarding domains.</entry></row>
|
||||
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
@ -1137,7 +1141,16 @@ Name=dummy-test
|
||||
Kind=dummy
|
||||
MACAddress=12:34:56:78:9a:bc</programlisting>
|
||||
</example>
|
||||
<example>
|
||||
<title>/etc/systemd/network/25-vrf.netdev</title>
|
||||
<para>Create an VRF interface with table 42.</para>
|
||||
<programlisting>[NetDev]
|
||||
Name=vrf-test
|
||||
Kind=vrf
|
||||
|
||||
[VRF]
|
||||
TableId=42</programlisting>
|
||||
</example>
|
||||
</refsect1>
|
||||
<refsect1>
|
||||
<title>See Also</title>
|
||||
|
@ -837,6 +837,10 @@ struct btrfs_ioctl_quota_ctl_args {
|
||||
#define IFLA_BRPORT_PROXYARP 10
|
||||
#endif
|
||||
|
||||
#if !HAVE_DECL_IFLA_VRF_TABLE
|
||||
#define IFLA_VRF_TABLE 1
|
||||
#endif
|
||||
|
||||
#if !HAVE_DECL_NDA_IFINDEX
|
||||
#define NDA_UNSPEC 0
|
||||
#define NDA_DST 1
|
||||
|
@ -278,6 +278,10 @@ static const NLType rtnl_link_info_data_ip6tnl_types[] = {
|
||||
[IFLA_IPTUN_FLOWINFO] = { .type = NETLINK_TYPE_U32 },
|
||||
};
|
||||
|
||||
static const NLType rtnl_link_info_data_vrf_types[] = {
|
||||
[IFLA_VRF_TABLE] = { .type = NETLINK_TYPE_U32 },
|
||||
};
|
||||
|
||||
/* these strings must match the .kind entries in the kernel */
|
||||
static const char* const nl_union_link_info_data_table[] = {
|
||||
[NL_UNION_LINK_INFO_DATA_BOND] = "bond",
|
||||
@ -298,6 +302,7 @@ static const char* const nl_union_link_info_data_table[] = {
|
||||
[NL_UNION_LINK_INFO_DATA_VTI_TUNNEL] = "vti",
|
||||
[NL_UNION_LINK_INFO_DATA_VTI6_TUNNEL] = "vti6",
|
||||
[NL_UNION_LINK_INFO_DATA_IP6TNL_TUNNEL] = "ip6tnl",
|
||||
[NL_UNION_LINK_INFO_DATA_VRF] = "vrf",
|
||||
};
|
||||
|
||||
DEFINE_STRING_TABLE_LOOKUP(nl_union_link_info_data, NLUnionLinkInfoData);
|
||||
@ -338,6 +343,9 @@ static const NLTypeSystem rtnl_link_info_data_type_systems[] = {
|
||||
[NL_UNION_LINK_INFO_DATA_IP6TNL_TUNNEL] = { .count = ELEMENTSOF(rtnl_link_info_data_ip6tnl_types),
|
||||
.types = rtnl_link_info_data_ip6tnl_types },
|
||||
|
||||
[NL_UNION_LINK_INFO_DATA_VRF] = { .count = ELEMENTSOF(rtnl_link_info_data_vrf_types),
|
||||
.types = rtnl_link_info_data_vrf_types },
|
||||
|
||||
};
|
||||
|
||||
static const NLTypeSystemUnion rtnl_link_info_data_type_system_union = {
|
||||
|
@ -86,6 +86,7 @@ typedef enum NLUnionLinkInfoData {
|
||||
NL_UNION_LINK_INFO_DATA_VTI_TUNNEL,
|
||||
NL_UNION_LINK_INFO_DATA_VTI6_TUNNEL,
|
||||
NL_UNION_LINK_INFO_DATA_IP6TNL_TUNNEL,
|
||||
NL_UNION_LINK_INFO_DATA_VRF,
|
||||
_NL_UNION_LINK_INFO_DATA_MAX,
|
||||
_NL_UNION_LINK_INFO_DATA_INVALID = -1
|
||||
} NLUnionLinkInfoData;
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include "networkd-netdev-veth.h"
|
||||
#include "networkd-netdev-vlan.h"
|
||||
#include "networkd-netdev-vxlan.h"
|
||||
#include "networkd-netdev-vrf.h"
|
||||
#include "networkd-netdev.h"
|
||||
#include "vlan-util.h"
|
||||
%}
|
||||
@ -105,3 +106,4 @@ Bridge.ForwardDelaySec, config_parse_sec, 0,
|
||||
Bridge.MulticastQuerier, config_parse_tristate, 0, offsetof(Bridge, mcast_querier)
|
||||
Bridge.MulticastSnooping, config_parse_tristate, 0, offsetof(Bridge, mcast_snooping)
|
||||
Bridge.VLANFiltering, config_parse_tristate, 0, offsetof(Bridge, vlan_filtering)
|
||||
VRF.TableId, config_parse_uint32, 0, offsetof(Vrf, table_id)
|
||||
|
50
src/network/networkd-netdev-vrf.c
Normal file
50
src/network/networkd-netdev-vrf.c
Normal file
@ -0,0 +1,50 @@
|
||||
/***
|
||||
This file is part of systemd.
|
||||
|
||||
Copyright 2016 Andreas Rammhold <andreas@rammhold.de>
|
||||
|
||||
systemd is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
systemd 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||
***/
|
||||
|
||||
#include <net/if.h>
|
||||
|
||||
#include "sd-netlink.h"
|
||||
#include "missing.h"
|
||||
#include "networkd-netdev-vrf.h"
|
||||
|
||||
static int netdev_vrf_fill_message_create(NetDev *netdev, Link *link, sd_netlink_message *m) {
|
||||
Vrf *v;
|
||||
int r;
|
||||
|
||||
assert(netdev);
|
||||
assert(!link);
|
||||
assert(m);
|
||||
|
||||
v = VRF(netdev);
|
||||
|
||||
assert(v);
|
||||
|
||||
r = sd_netlink_message_append_u32(m, IFLA_VRF_TABLE, v->table_id);
|
||||
if (r < 0)
|
||||
return log_netdev_error_errno(netdev, r, "Could not append IPLA_VRF_TABLE attribute: %m");
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
const NetDevVTable vrf_vtable = {
|
||||
.object_size = sizeof(Vrf),
|
||||
.sections = "Match\0NetDev\0VRF\0",
|
||||
.fill_message_create = netdev_vrf_fill_message_create,
|
||||
.create_type = NETDEV_CREATE_MASTER,
|
||||
};
|
33
src/network/networkd-netdev-vrf.h
Normal file
33
src/network/networkd-netdev-vrf.h
Normal file
@ -0,0 +1,33 @@
|
||||
#pragma once
|
||||
|
||||
/***
|
||||
This file is part of systemd.
|
||||
|
||||
Copyright 2016 Andreas Rammhold <andreas@rammhold.de>
|
||||
|
||||
systemd is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
systemd 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||
***/
|
||||
|
||||
typedef struct Vrf Vrf;
|
||||
|
||||
#include "networkd-netdev.h"
|
||||
|
||||
struct Vrf {
|
||||
NetDev meta;
|
||||
|
||||
uint32_t table_id;
|
||||
};
|
||||
|
||||
DEFINE_NETDEV_CAST(VRF, Vrf);
|
||||
extern const NetDevVTable vrf_vtable;
|
@ -55,6 +55,8 @@ const NetDevVTable * const netdev_vtable[_NETDEV_KIND_MAX] = {
|
||||
[NETDEV_KIND_TUN] = &tun_vtable,
|
||||
[NETDEV_KIND_TAP] = &tap_vtable,
|
||||
[NETDEV_KIND_IP6TNL] = &ip6tnl_vtable,
|
||||
[NETDEV_KIND_VRF] = &vrf_vtable,
|
||||
|
||||
};
|
||||
|
||||
static const char* const netdev_kind_table[_NETDEV_KIND_MAX] = {
|
||||
@ -78,6 +80,8 @@ static const char* const netdev_kind_table[_NETDEV_KIND_MAX] = {
|
||||
[NETDEV_KIND_TUN] = "tun",
|
||||
[NETDEV_KIND_TAP] = "tap",
|
||||
[NETDEV_KIND_IP6TNL] = "ip6tnl",
|
||||
[NETDEV_KIND_VRF] = "vrf",
|
||||
|
||||
};
|
||||
|
||||
DEFINE_STRING_TABLE_LOOKUP(netdev_kind, NetDevKind);
|
||||
|
@ -55,6 +55,7 @@ typedef enum NetDevKind {
|
||||
NETDEV_KIND_DUMMY,
|
||||
NETDEV_KIND_TUN,
|
||||
NETDEV_KIND_TAP,
|
||||
NETDEV_KIND_VRF,
|
||||
_NETDEV_KIND_MAX,
|
||||
_NETDEV_KIND_INVALID = -1
|
||||
} NetDevKind;
|
||||
|
@ -41,6 +41,7 @@
|
||||
#include "networkd-netdev-tuntap.h"
|
||||
#include "networkd-netdev-veth.h"
|
||||
#include "networkd-netdev-vlan.h"
|
||||
#include "networkd-netdev-vrf.h"
|
||||
#include "networkd-netdev-vxlan.h"
|
||||
#include "networkd-network.h"
|
||||
#include "networkd-util.h"
|
||||
|
Loading…
Reference in New Issue
Block a user