1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 Tom Gundersen <teg@jklm.no>
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
28 #include "condition-util.h"
29 #include "in-addr-util.h"
31 typedef struct NetDevVTable NetDevVTable;
33 typedef struct netdev_join_callback netdev_join_callback;
35 struct netdev_join_callback {
36 sd_rtnl_message_handler_t callback;
39 LIST_FIELDS(netdev_join_callback, callbacks);
42 typedef enum NetDevKind {
57 _NETDEV_KIND_INVALID = -1
60 typedef enum NetDevState {
62 NETDEV_STATE_CREATING,
66 _NETDEV_STATE_INVALID = -1,
76 Condition *match_host;
77 Condition *match_virt;
78 Condition *match_kernel;
79 Condition *match_arch;
87 struct ether_addr *mac;
88 struct ether_addr *mac_peer;
107 unsigned char family;
108 union in_addr_union local;
109 union in_addr_union remote;
110 union in_addr_union group;
112 LIST_HEAD(netdev_join_callback, callbacks);
115 struct NetDevVTable {
116 /* fill in message to create netdev */
117 int (*fill_message_create)(NetDev *netdev, sd_rtnl_message *message);
119 /* fill in message to create netdev on top of a given link */
120 int (*fill_message_create_on_link)(NetDev *netdev, Link *link, sd_rtnl_message *message);
122 /* fill in message to enslave link by netdev */
123 int (*enslave)(NetDev *netdev, Link *link, sd_rtnl_message_handler_t callback);
125 /* create netdev, if not done via rtnl */
126 int (*create)(NetDev *netdev);
128 /* verify that compulsory configuration options were specified */
129 int (*config_verify)(NetDev *netdev, const char *filename);
132 extern const NetDevVTable * const netdev_vtable[_NETDEV_KIND_MAX];
134 #define NETDEV_VTABLE(n) netdev_vtable[(n)->kind]
136 int netdev_load(Manager *manager);
137 void netdev_drop(NetDev *netdev);
139 NetDev *netdev_unref(NetDev *netdev);
140 NetDev *netdev_ref(NetDev *netdev);
142 DEFINE_TRIVIAL_CLEANUP_FUNC(NetDev*, netdev_unref);
143 #define _cleanup_netdev_unref_ _cleanup_(netdev_unrefp)
145 int netdev_get(Manager *manager, const char *name, NetDev **ret);
146 int netdev_set_ifindex(NetDev *netdev, sd_rtnl_message *newlink);
147 int netdev_enslave(NetDev *netdev, Link *link, sd_rtnl_message_handler_t callback);
148 int netdev_get_mac(const char *ifname, struct ether_addr **ret);
149 int netdev_join(NetDev *netdev, Link *link, sd_rtnl_message_handler_t cb);
151 const char *netdev_kind_to_string(NetDevKind d) _const_;
152 NetDevKind netdev_kind_from_string(const char *d) _pure_;
154 int config_parse_netdev_kind(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
157 const struct ConfigPerfItem* network_netdev_gperf_lookup(const char *key, unsigned length);
159 /* Macros which append INTERFACE= to the message */
161 #define log_full_netdev(level, netdev, fmt, ...) log_meta_object(level, __FILE__, __LINE__, __func__, "INTERFACE=", netdev->ifname, "%-*s: " fmt, IFNAMSIZ, netdev->ifname, ##__VA_ARGS__)
162 #define log_debug_netdev(netdev, ...) log_full_netdev(LOG_DEBUG, netdev, ##__VA_ARGS__)
163 #define log_info_netdev(netdev, ...) log_full_netdev(LOG_INFO, netdev, ##__VA_ARGS__)
164 #define log_notice_netdev(netdev, ...) log_full_netdev(LOG_NOTICE, netdev, ##__VA_ARGS__)
165 #define log_warning_netdev(netdev, ...) log_full_netdev(LOG_WARNING, netdev,## __VA_ARGS__)
166 #define log_error_netdev(netdev, ...) log_full_netdev(LOG_ERR, netdev, ##__VA_ARGS__)
168 #define log_struct_netdev(level, netdev, ...) log_struct(level, "INTERFACE=%s", netdev->ifname, __VA_ARGS__)
170 #define NETDEV(netdev) "INTERFACE=%s", netdev->ifname