mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-01-25 06:03:40 +03:00
networkd: Introduce ip6gre and ip6gretap
This patch introduces ipv6 gre and gretap. test: ip6gre.netdev: [NetDev] Name=ip6gretap Kind=ip6gretap [Tunnel] Local=2a00:ffde:4567:edde::4987 Remote=2001:473:fece:cafe::5179 ip6gre.network: [Match] Name=eno16777736 [Network] Tunnel=ip6gretap ip link 6: ip6gre@eno16777736: <POINTOPOINT,NOARP> mtu 1448 qdisc noop state DOWN mode DEFAULT group default link/gre6 2a:00:ff🇩🇪45:67:ed🇩🇪00:00:00:00:00:00:49:87 peer 20:01:04:73:fe:ce:ca:fe:00:00:00:00:00:00:51:79
This commit is contained in:
parent
855ee1a1d2
commit
b16492f86f
@ -331,7 +331,8 @@
|
||||
|
||||
<para>The <literal>[Tunnel]</literal> section only applies for netdevs of kind
|
||||
<literal>ipip</literal>, <literal>sit</literal>, <literal>gre</literal>, <literal>gretap</literal>,
|
||||
<literal>vti</literal> and <literal>ip6tnl</literal> and accepts the following keys:</para>
|
||||
<literal>ip6gre</literal>, <literal>ip6gretap</literal>, <literal>vti</literal> and <literal>ip6tnl</literal>
|
||||
and accepts the following keys:</para>
|
||||
|
||||
<variablelist class='network-directives'>
|
||||
<varlistentry>
|
||||
|
@ -177,6 +177,8 @@ static const char* const nl_union_link_info_data_table[_NL_UNION_LINK_INFO_DATA_
|
||||
[NL_UNION_LINK_INFO_DATA_IPIP_TUNNEL] = "ipip",
|
||||
[NL_UNION_LINK_INFO_DATA_IPGRE_TUNNEL] = "gre",
|
||||
[NL_UNION_LINK_INFO_DATA_IPGRETAP_TUNNEL] = "gretap",
|
||||
[NL_UNION_LINK_INFO_DATA_IP6GRE_TUNNEL] = "ip6gre",
|
||||
[NL_UNION_LINK_INFO_DATA_IP6GRETAP_TUNNEL] = "ip6gretap",
|
||||
[NL_UNION_LINK_INFO_DATA_SIT_TUNNEL] = "sit",
|
||||
[NL_UNION_LINK_INFO_DATA_VTI_TUNNEL] = "vti",
|
||||
[NL_UNION_LINK_INFO_DATA_IP6TNL_TUNNEL] = "ip6tnl",
|
||||
@ -205,6 +207,10 @@ static const NLTypeSystem rtnl_link_info_data_type_systems[_NL_UNION_LINK_INFO_D
|
||||
.types = rtnl_link_info_data_ipgre_types },
|
||||
[NL_UNION_LINK_INFO_DATA_IPGRETAP_TUNNEL] = { .max = ELEMENTSOF(rtnl_link_info_data_ipgre_types) - 1,
|
||||
.types = rtnl_link_info_data_ipgre_types },
|
||||
[NL_UNION_LINK_INFO_DATA_IP6GRE_TUNNEL] = { .max = ELEMENTSOF(rtnl_link_info_data_ipgre_types) - 1,
|
||||
.types = rtnl_link_info_data_ipgre_types },
|
||||
[NL_UNION_LINK_INFO_DATA_IP6GRETAP_TUNNEL] = { .max = ELEMENTSOF(rtnl_link_info_data_ipgre_types) - 1,
|
||||
.types = rtnl_link_info_data_ipgre_types },
|
||||
[NL_UNION_LINK_INFO_DATA_SIT_TUNNEL] = { .max = ELEMENTSOF(rtnl_link_info_data_iptun_types) - 1,
|
||||
.types = rtnl_link_info_data_iptun_types },
|
||||
[NL_UNION_LINK_INFO_DATA_VTI_TUNNEL] = { .max = ELEMENTSOF(rtnl_link_info_data_ipvti_types) - 1,
|
||||
|
@ -76,6 +76,8 @@ typedef enum NLUnionLinkInfoData {
|
||||
NL_UNION_LINK_INFO_DATA_IPIP_TUNNEL,
|
||||
NL_UNION_LINK_INFO_DATA_IPGRE_TUNNEL,
|
||||
NL_UNION_LINK_INFO_DATA_IPGRETAP_TUNNEL,
|
||||
NL_UNION_LINK_INFO_DATA_IP6GRE_TUNNEL,
|
||||
NL_UNION_LINK_INFO_DATA_IP6GRETAP_TUNNEL,
|
||||
NL_UNION_LINK_INFO_DATA_SIT_TUNNEL,
|
||||
NL_UNION_LINK_INFO_DATA_VTI_TUNNEL,
|
||||
NL_UNION_LINK_INFO_DATA_IP6TNL_TUNNEL,
|
||||
|
@ -218,6 +218,57 @@ static int netdev_gre_fill_message_create(NetDev *netdev, Link *link, sd_rtnl_me
|
||||
return r;
|
||||
}
|
||||
|
||||
static int netdev_ip6gre_fill_message_create(NetDev *netdev, Link *link, sd_rtnl_message *m) {
|
||||
Tunnel *t;
|
||||
int r;
|
||||
|
||||
assert(netdev);
|
||||
|
||||
if (netdev->kind == NETDEV_KIND_IP6GRE)
|
||||
t = IP6GRE(netdev);
|
||||
else
|
||||
t = IP6GRETAP(netdev);
|
||||
|
||||
assert(t);
|
||||
assert(t->family == AF_INET6);
|
||||
assert(link);
|
||||
assert(m);
|
||||
|
||||
r = sd_rtnl_message_append_u32(m, IFLA_GRE_LINK, link->ifindex);
|
||||
if (r < 0) {
|
||||
log_netdev_error(netdev,
|
||||
"Could not append IFLA_GRE_LINK attribute: %s",
|
||||
strerror(-r));
|
||||
return r;
|
||||
}
|
||||
|
||||
r = sd_rtnl_message_append_in6_addr(m, IFLA_GRE_LOCAL, &t->local.in6);
|
||||
if (r < 0) {
|
||||
log_netdev_error(netdev,
|
||||
"Could not append IFLA_GRE_LOCAL attribute: %s",
|
||||
strerror(-r));
|
||||
return r;
|
||||
}
|
||||
|
||||
r = sd_rtnl_message_append_in6_addr(m, IFLA_GRE_REMOTE, &t->remote.in6);
|
||||
if (r < 0) {
|
||||
log_netdev_error(netdev,
|
||||
"Could not append IFLA_GRE_REMOTE attribute: %s",
|
||||
strerror(-r));
|
||||
return r;
|
||||
}
|
||||
|
||||
r = sd_rtnl_message_append_u8(m, IFLA_GRE_TTL, t->ttl);
|
||||
if (r < 0) {
|
||||
log_netdev_error(netdev,
|
||||
"Could not append IFLA_GRE_TTL attribute: %s",
|
||||
strerror(-r));
|
||||
return r;
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static int netdev_vti_fill_message_create(NetDev *netdev, Link *link, sd_rtnl_message *m) {
|
||||
Tunnel *t = VTI(netdev);
|
||||
int r;
|
||||
@ -341,6 +392,12 @@ static int netdev_tunnel_verify(NetDev *netdev, const char *filename) {
|
||||
case NETDEV_KIND_GRETAP:
|
||||
t = GRETAP(netdev);
|
||||
break;
|
||||
case NETDEV_KIND_IP6GRE:
|
||||
t = IP6GRE(netdev);
|
||||
break;
|
||||
case NETDEV_KIND_IP6GRETAP:
|
||||
t = IP6GRETAP(netdev);
|
||||
break;
|
||||
case NETDEV_KIND_VTI:
|
||||
t = VTI(netdev);
|
||||
break;
|
||||
@ -451,6 +508,21 @@ static void gre_init(NetDev *n) {
|
||||
t->pmtudisc = true;
|
||||
}
|
||||
|
||||
static void ip6gre_init(NetDev *n) {
|
||||
Tunnel *t;
|
||||
|
||||
assert(n);
|
||||
|
||||
if (n->kind == NETDEV_KIND_IP6GRE)
|
||||
t = IP6GRE(n);
|
||||
else
|
||||
t = IP6GRETAP(n);
|
||||
|
||||
assert(t);
|
||||
|
||||
t->ttl = DEFAULT_TNL_HOP_LIMIT;
|
||||
}
|
||||
|
||||
static void ip6tnl_init(NetDev *n) {
|
||||
Tunnel *t = IP6TNL(n);
|
||||
|
||||
@ -507,6 +579,24 @@ const NetDevVTable gretap_vtable = {
|
||||
.config_verify = netdev_tunnel_verify,
|
||||
};
|
||||
|
||||
const NetDevVTable ip6gre_vtable = {
|
||||
.object_size = sizeof(Tunnel),
|
||||
.init = ip6gre_init,
|
||||
.sections = "Match\0NetDev\0Tunnel\0",
|
||||
.fill_message_create = netdev_ip6gre_fill_message_create,
|
||||
.create_type = NETDEV_CREATE_STACKED,
|
||||
.config_verify = netdev_tunnel_verify,
|
||||
};
|
||||
|
||||
const NetDevVTable ip6gretap_vtable = {
|
||||
.object_size = sizeof(Tunnel),
|
||||
.init = ip6gre_init,
|
||||
.sections = "Match\0NetDev\0Tunnel\0",
|
||||
.fill_message_create = netdev_ip6gre_fill_message_create,
|
||||
.create_type = NETDEV_CREATE_STACKED,
|
||||
.config_verify = netdev_tunnel_verify,
|
||||
};
|
||||
|
||||
const NetDevVTable ip6tnl_vtable = {
|
||||
.object_size = sizeof(Tunnel),
|
||||
.init = ip6tnl_init,
|
||||
|
@ -57,6 +57,8 @@ extern const NetDevVTable sit_vtable;
|
||||
extern const NetDevVTable vti_vtable;
|
||||
extern const NetDevVTable gre_vtable;
|
||||
extern const NetDevVTable gretap_vtable;
|
||||
extern const NetDevVTable ip6gre_vtable;
|
||||
extern const NetDevVTable ip6gretap_vtable;
|
||||
extern const NetDevVTable ip6tnl_vtable;
|
||||
|
||||
const char *ip6tnl_mode_to_string(Ip6TnlMode d) _const_;
|
||||
|
@ -40,6 +40,8 @@ const NetDevVTable * const netdev_vtable[_NETDEV_KIND_MAX] = {
|
||||
[NETDEV_KIND_IPIP] = &ipip_vtable,
|
||||
[NETDEV_KIND_GRE] = &gre_vtable,
|
||||
[NETDEV_KIND_GRETAP] = &gretap_vtable,
|
||||
[NETDEV_KIND_IP6GRE] = &ip6gre_vtable,
|
||||
[NETDEV_KIND_IP6GRETAP] = &ip6gretap_vtable,
|
||||
[NETDEV_KIND_SIT] = &sit_vtable,
|
||||
[NETDEV_KIND_VTI] = &vti_vtable,
|
||||
[NETDEV_KIND_VETH] = &veth_vtable,
|
||||
@ -59,6 +61,8 @@ static const char* const netdev_kind_table[_NETDEV_KIND_MAX] = {
|
||||
[NETDEV_KIND_IPIP] = "ipip",
|
||||
[NETDEV_KIND_GRE] = "gre",
|
||||
[NETDEV_KIND_GRETAP] = "gretap",
|
||||
[NETDEV_KIND_IP6GRE] = "ip6gre",
|
||||
[NETDEV_KIND_IP6GRETAP] = "ip6gretap",
|
||||
[NETDEV_KIND_SIT] = "sit",
|
||||
[NETDEV_KIND_VETH] = "veth",
|
||||
[NETDEV_KIND_VTI] = "vti",
|
||||
|
@ -48,6 +48,8 @@ typedef enum NetDevKind {
|
||||
NETDEV_KIND_IPIP,
|
||||
NETDEV_KIND_GRE,
|
||||
NETDEV_KIND_GRETAP,
|
||||
NETDEV_KIND_IP6GRE,
|
||||
NETDEV_KIND_IP6GRETAP,
|
||||
NETDEV_KIND_SIT,
|
||||
NETDEV_KIND_VETH,
|
||||
NETDEV_KIND_VTI,
|
||||
@ -166,6 +168,8 @@ DEFINE_CAST(VXLAN, VxLan);
|
||||
DEFINE_CAST(IPIP, Tunnel);
|
||||
DEFINE_CAST(GRE, Tunnel);
|
||||
DEFINE_CAST(GRETAP, Tunnel);
|
||||
DEFINE_CAST(IP6GRE, Tunnel);
|
||||
DEFINE_CAST(IP6GRETAP, Tunnel);
|
||||
DEFINE_CAST(SIT, Tunnel);
|
||||
DEFINE_CAST(VTI, Tunnel);
|
||||
DEFINE_CAST(IP6TNL, Tunnel);
|
||||
|
@ -453,6 +453,8 @@ int config_parse_tunnel(const char *unit,
|
||||
netdev->kind != NETDEV_KIND_SIT &&
|
||||
netdev->kind != NETDEV_KIND_GRE &&
|
||||
netdev->kind != NETDEV_KIND_GRETAP &&
|
||||
netdev->kind != NETDEV_KIND_IP6GRE &&
|
||||
netdev->kind != NETDEV_KIND_IP6GRETAP &&
|
||||
netdev->kind != NETDEV_KIND_VTI &&
|
||||
netdev->kind != NETDEV_KIND_IP6TNL
|
||||
) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user