]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/network/netdev/ipvlan.c
tree-wide: drop 'This file is part of systemd' blurb
[thirdparty/systemd.git] / src / network / netdev / ipvlan.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2 /***
3 Copyright 2013-2015 Tom Gundersen <teg@jklm.no>
4 ***/
5
6 #include <net/if.h>
7
8 #include "conf-parser.h"
9 #include "netdev/ipvlan.h"
10 #include "string-table.h"
11
12 static const char* const ipvlan_mode_table[_NETDEV_IPVLAN_MODE_MAX] = {
13 [NETDEV_IPVLAN_MODE_L2] = "L2",
14 [NETDEV_IPVLAN_MODE_L3] = "L3",
15 [NETDEV_IPVLAN_MODE_L3S] = "L3S",
16 };
17
18 DEFINE_STRING_TABLE_LOOKUP(ipvlan_mode, IPVlanMode);
19 DEFINE_CONFIG_PARSE_ENUM(config_parse_ipvlan_mode, ipvlan_mode, IPVlanMode, "Failed to parse ipvlan mode");
20
21 static const char* const ipvlan_flags_table[_NETDEV_IPVLAN_FLAGS_MAX] = {
22 [NETDEV_IPVLAN_FLAGS_BRIGDE] = "bridge",
23 [NETDEV_IPVLAN_FLAGS_PRIVATE] = "private",
24 [NETDEV_IPVLAN_FLAGS_VEPA] = "vepa",
25 };
26
27 DEFINE_STRING_TABLE_LOOKUP(ipvlan_flags, IPVlanFlags);
28 DEFINE_CONFIG_PARSE_ENUM(config_parse_ipvlan_flags, ipvlan_flags, IPVlanFlags, "Failed to parse ipvlan flags");
29
30 static int netdev_ipvlan_fill_message_create(NetDev *netdev, Link *link, sd_netlink_message *req) {
31 IPVlan *m;
32 int r;
33
34 assert(netdev);
35 assert(link);
36 assert(netdev->ifname);
37
38 m = IPVLAN(netdev);
39
40 assert(m);
41
42 if (m->mode != _NETDEV_IPVLAN_MODE_INVALID) {
43 r = sd_netlink_message_append_u16(req, IFLA_IPVLAN_MODE, m->mode);
44 if (r < 0)
45 return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPVLAN_MODE attribute: %m");
46 }
47
48 if (m->flags != _NETDEV_IPVLAN_FLAGS_INVALID) {
49 r = sd_netlink_message_append_u16(req, IFLA_IPVLAN_FLAGS, m->flags);
50 if (r < 0)
51 return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPVLAN_FLAGS attribute: %m");
52 }
53
54 return 0;
55 }
56
57 static void ipvlan_init(NetDev *n) {
58 IPVlan *m;
59
60 assert(n);
61
62 m = IPVLAN(n);
63
64 assert(m);
65
66 m->mode = _NETDEV_IPVLAN_MODE_INVALID;
67 m->flags = _NETDEV_IPVLAN_FLAGS_INVALID;
68 }
69
70 const NetDevVTable ipvlan_vtable = {
71 .object_size = sizeof(IPVlan),
72 .init = ipvlan_init,
73 .sections = "Match\0NetDev\0IPVLAN\0",
74 .fill_message_create = netdev_ipvlan_fill_message_create,
75 .create_type = NETDEV_CREATE_STACKED,
76 };