]>
Commit | Line | Data |
---|---|---|
db9ecf05 | 1 | /* SPDX-License-Identifier: LGPL-2.1-or-later */ |
0372cb2b TG |
2 | |
3 | #include <net/if.h> | |
4 | ||
0372cb2b | 5 | #include "conf-parser.h" |
737f1405 | 6 | #include "macvlan.h" |
d5167480 | 7 | #include "macvlan-util.h" |
0372cb2b | 8 | |
0372cb2b TG |
9 | DEFINE_CONFIG_PARSE_ENUM(config_parse_macvlan_mode, macvlan_mode, MacVlanMode, "Failed to parse macvlan mode"); |
10 | ||
1c4baffc | 11 | static int netdev_macvlan_fill_message_create(NetDev *netdev, Link *link, sd_netlink_message *req) { |
f33ff02b | 12 | MacVlan *m; |
0372cb2b TG |
13 | int r; |
14 | ||
15 | assert(netdev); | |
0372cb2b | 16 | assert(link); |
0372cb2b | 17 | assert(netdev->ifname); |
0372cb2b | 18 | |
f33ff02b SS |
19 | if (netdev->kind == NETDEV_KIND_MACVLAN) |
20 | m = MACVLAN(netdev); | |
21 | else | |
22 | m = MACVTAP(netdev); | |
23 | ||
24 | assert(m); | |
25 | ||
0d0de133 | 26 | if (m->mode == NETDEV_MACVLAN_MODE_SOURCE && !set_isempty(m->match_source_mac)) { |
0d0de133 AŠ |
27 | const struct ether_addr *mac_addr; |
28 | ||
29 | r = sd_netlink_message_append_u32(req, IFLA_MACVLAN_MACADDR_MODE, MACVLAN_MACADDR_SET); | |
30 | if (r < 0) | |
31 | return log_netdev_error_errno(netdev, r, "Could not append IFLA_MACVLAN_MACADDR_MODE attribute: %m"); | |
32 | ||
33 | r = sd_netlink_message_open_container(req, IFLA_MACVLAN_MACADDR_DATA); | |
34 | if (r < 0) | |
35 | return log_netdev_error_errno(netdev, r, "Could not open IFLA_MACVLAN_MACADDR_DATA container: %m"); | |
36 | ||
90e74a66 | 37 | SET_FOREACH(mac_addr, m->match_source_mac) { |
0d0de133 AŠ |
38 | r = sd_netlink_message_append_ether_addr(req, IFLA_MACVLAN_MACADDR, mac_addr); |
39 | if (r < 0) | |
40 | return log_netdev_error_errno(netdev, r, "Could not append IFLA_MACVLAN_MACADDR attribute: %m"); | |
41 | } | |
42 | ||
43 | r = sd_netlink_message_close_container(req); | |
44 | if (r < 0) | |
45 | return log_netdev_error_errno(netdev, r, "Could not close IFLA_MACVLAN_MACADDR_DATA container: %m"); | |
46 | } | |
47 | ||
aa9f1140 | 48 | if (m->mode != _NETDEV_MACVLAN_MODE_INVALID) { |
1c4baffc | 49 | r = sd_netlink_message_append_u32(req, IFLA_MACVLAN_MODE, m->mode); |
c8a09ef4 SS |
50 | if (r < 0) |
51 | return log_netdev_error_errno(netdev, r, "Could not append IFLA_MACVLAN_MODE attribute: %m"); | |
0372cb2b TG |
52 | } |
53 | ||
aa9f1140 TG |
54 | return 0; |
55 | } | |
0372cb2b | 56 | |
0d0de133 AŠ |
57 | static void macvlan_done(NetDev *n) { |
58 | MacVlan *m; | |
59 | ||
60 | assert(n); | |
61 | ||
62 | if (n->kind == NETDEV_KIND_MACVLAN) | |
63 | m = MACVLAN(n); | |
64 | else | |
65 | m = MACVTAP(n); | |
66 | ||
67 | assert(m); | |
68 | ||
69 | set_free_free(m->match_source_mac); | |
70 | } | |
71 | ||
aa9f1140 | 72 | static void macvlan_init(NetDev *n) { |
f33ff02b | 73 | MacVlan *m; |
0372cb2b | 74 | |
aa9f1140 | 75 | assert(n); |
f33ff02b SS |
76 | |
77 | if (n->kind == NETDEV_KIND_MACVLAN) | |
78 | m = MACVLAN(n); | |
79 | else | |
80 | m = MACVTAP(n); | |
81 | ||
aa9f1140 TG |
82 | assert(m); |
83 | ||
84 | m->mode = _NETDEV_MACVLAN_MODE_INVALID; | |
0372cb2b | 85 | } |
3be1d7e0 | 86 | |
f33ff02b SS |
87 | const NetDevVTable macvtap_vtable = { |
88 | .object_size = sizeof(MacVlan), | |
89 | .init = macvlan_init, | |
0d0de133 | 90 | .done = macvlan_done, |
130b812f | 91 | .sections = NETDEV_COMMON_SECTIONS "MACVTAP\0", |
f33ff02b SS |
92 | .fill_message_create = netdev_macvlan_fill_message_create, |
93 | .create_type = NETDEV_CREATE_STACKED, | |
daf0f8ca | 94 | .generate_mac = true, |
f33ff02b SS |
95 | }; |
96 | ||
3be1d7e0 | 97 | const NetDevVTable macvlan_vtable = { |
aa9f1140 TG |
98 | .object_size = sizeof(MacVlan), |
99 | .init = macvlan_init, | |
0d0de133 | 100 | .done = macvlan_done, |
130b812f | 101 | .sections = NETDEV_COMMON_SECTIONS "MACVLAN\0", |
aa9f1140 TG |
102 | .fill_message_create = netdev_macvlan_fill_message_create, |
103 | .create_type = NETDEV_CREATE_STACKED, | |
daf0f8ca | 104 | .generate_mac = true, |
3be1d7e0 | 105 | }; |