1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 Copyright 2013-2015 Tom Gundersen <teg@jklm.no>
8 #include "conf-parser.h"
9 #include "netdev/ipvlan.h"
10 #include "string-table.h"
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",
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");
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",
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");
30 static int netdev_ipvlan_fill_message_create(NetDev
*netdev
, Link
*link
, sd_netlink_message
*req
) {
36 assert(netdev
->ifname
);
42 if (m
->mode
!= _NETDEV_IPVLAN_MODE_INVALID
) {
43 r
= sd_netlink_message_append_u16(req
, IFLA_IPVLAN_MODE
, m
->mode
);
45 return log_netdev_error_errno(netdev
, r
, "Could not append IFLA_IPVLAN_MODE attribute: %m");
48 if (m
->flags
!= _NETDEV_IPVLAN_FLAGS_INVALID
) {
49 r
= sd_netlink_message_append_u16(req
, IFLA_IPVLAN_FLAGS
, m
->flags
);
51 return log_netdev_error_errno(netdev
, r
, "Could not append IFLA_IPVLAN_FLAGS attribute: %m");
57 static void ipvlan_init(NetDev
*n
) {
66 m
->mode
= _NETDEV_IPVLAN_MODE_INVALID
;
67 m
->flags
= _NETDEV_IPVLAN_FLAGS_INVALID
;
70 const NetDevVTable ipvlan_vtable
= {
71 .object_size
= sizeof(IPVlan
),
73 .sections
= "Match\0NetDev\0IPVLAN\0",
74 .fill_message_create
= netdev_ipvlan_fill_message_create
,
75 .create_type
= NETDEV_CREATE_STACKED
,