]>
Commit | Line | Data |
---|---|---|
53e1b683 | 1 | /* SPDX-License-Identifier: LGPL-2.1+ */ |
c4a5ddc9 | 2 | /*** |
96b2fb93 | 3 | Copyright © 2013-2015 Tom Gundersen <teg@jklm.no> |
c4a5ddc9 TG |
4 | ***/ |
5 | ||
6 | #include <net/if.h> | |
c4a5ddc9 | 7 | |
c4a5ddc9 | 8 | #include "conf-parser.h" |
441e9ae4 | 9 | #include "netdev/ipvlan.h" |
8b43440b | 10 | #include "string-table.h" |
c4a5ddc9 TG |
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", | |
d384826f | 15 | [NETDEV_IPVLAN_MODE_L3S] = "L3S", |
c4a5ddc9 TG |
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 | ||
d384826f SS |
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 | ||
1c4baffc | 30 | static int netdev_ipvlan_fill_message_create(NetDev *netdev, Link *link, sd_netlink_message *req) { |
0695cb45 | 31 | IPVlan *m; |
c4a5ddc9 TG |
32 | int r; |
33 | ||
34 | assert(netdev); | |
c4a5ddc9 TG |
35 | assert(link); |
36 | assert(netdev->ifname); | |
37 | ||
0695cb45 SS |
38 | m = IPVLAN(netdev); |
39 | ||
40 | assert(m); | |
41 | ||
c4a5ddc9 | 42 | if (m->mode != _NETDEV_IPVLAN_MODE_INVALID) { |
1c4baffc | 43 | r = sd_netlink_message_append_u16(req, IFLA_IPVLAN_MODE, m->mode); |
f6a0ea85 SS |
44 | if (r < 0) |
45 | return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPVLAN_MODE attribute: %m"); | |
c4a5ddc9 TG |
46 | } |
47 | ||
d384826f SS |
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 | ||
c4a5ddc9 TG |
54 | return 0; |
55 | } | |
56 | ||
57 | static void ipvlan_init(NetDev *n) { | |
0695cb45 | 58 | IPVlan *m; |
c4a5ddc9 TG |
59 | |
60 | assert(n); | |
0695cb45 SS |
61 | |
62 | m = IPVLAN(n); | |
63 | ||
c4a5ddc9 TG |
64 | assert(m); |
65 | ||
66 | m->mode = _NETDEV_IPVLAN_MODE_INVALID; | |
1291a042 | 67 | m->flags = _NETDEV_IPVLAN_FLAGS_INVALID; |
c4a5ddc9 TG |
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 | }; |