X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fnetwork%2Fnetworkd-netdev.h;h=3756b1e5a7821e4d7bd5f8496049a6ea1c853ffa;hb=484adfd914504cd7e95867cea20ca7af71b888f2;hp=a523522887aac6b62a88b782cf7f3aeb20b41ae4;hpb=3be1d7e0c5bf60658d34eb6311d4e77c6803578c;p=elogind.git diff --git a/src/network/networkd-netdev.h b/src/network/networkd-netdev.h index a52352288..3756b1e5a 100644 --- a/src/network/networkd-netdev.h +++ b/src/network/networkd-netdev.h @@ -25,7 +25,6 @@ #include "hashmap.h" #include "list.h" #include "set.h" -#include "condition-util.h" #include "in-addr-util.h" typedef struct NetDevVTable NetDevVTable; @@ -44,12 +43,17 @@ typedef enum NetDevKind { NETDEV_KIND_BOND, NETDEV_KIND_VLAN, NETDEV_KIND_MACVLAN, + NETDEV_KIND_IPVLAN, NETDEV_KIND_VXLAN, NETDEV_KIND_IPIP, NETDEV_KIND_GRE, + NETDEV_KIND_GRETAP, + NETDEV_KIND_IP6GRE, + NETDEV_KIND_IP6GRETAP, NETDEV_KIND_SIT, NETDEV_KIND_VETH, NETDEV_KIND_VTI, + NETDEV_KIND_IP6TNL, NETDEV_KIND_DUMMY, NETDEV_KIND_TUN, NETDEV_KIND_TAP, @@ -66,6 +70,14 @@ typedef enum NetDevState { _NETDEV_STATE_INVALID = -1, } NetDevState; +typedef enum NetDevCreateType { + NETDEV_CREATE_INDEPENDENT, + NETDEV_CREATE_MASTER, + NETDEV_CREATE_STACKED, + _NETDEV_CREATE_MAX, + _NETDEV_CREATE_INVALID = -1, +} NetDevCreateType; + struct NetDev { Manager *manager; @@ -78,49 +90,51 @@ struct NetDev { Condition *match_kernel; Condition *match_arch; + NetDevState state; + NetDevKind kind; char *description; char *ifname; - char *ifname_peer; - char *user_name; - char *group_name; - size_t mtu; struct ether_addr *mac; - struct ether_addr *mac_peer; - NetDevKind kind; - - uint64_t vlanid; - uint64_t vxlanid; - int32_t macvlan_mode; - int32_t bond_mode; - + size_t mtu; int ifindex; - NetDevState state; - - bool tunnel_pmtudisc; - bool learning; - bool one_queue; - bool multi_queue; - bool packet_info; - - unsigned ttl; - unsigned tos; - unsigned char family; - union in_addr_union local; - union in_addr_union remote; - union in_addr_union group; LIST_HEAD(netdev_join_callback, callbacks); }; +#include "networkd-netdev-bridge.h" +#include "networkd-netdev-bond.h" +#include "networkd-netdev-vlan.h" +#include "networkd-netdev-macvlan.h" +#include "networkd-netdev-ipvlan.h" +#include "networkd-netdev-vxlan.h" +#include "networkd-netdev-veth.h" +#include "networkd-netdev-tunnel.h" +#include "networkd-netdev-dummy.h" +#include "networkd-netdev-tuntap.h" + struct NetDevVTable { - /* fill in message to create netdev */ - int (*fill_message_create)(NetDev *netdev, sd_rtnl_message *message); + /* How much memory does an object of this unit type need */ + size_t object_size; + + /* Config file sections this netdev kind understands, separated + * by NUL chars */ + const char *sections; - /* fill in message to create netdev on top of a given link */ - int (*fill_message_create_on_link)(NetDev *netdev, Link *link, sd_rtnl_message *message); + /* This should reset all type-specific variables. This should + * not allocate memory, and is called with zero-initialized + * data. It should hence only initialize variables that need + * to be set != 0. */ + void (*init)(NetDev *n); - /* fill in message to enslave link by netdev */ - int (*enslave)(NetDev *netdev, Link *link, sd_rtnl_message_handler_t callback); + /* This should free all kind-specific variables. It should be + * idempotent. */ + void (*done)(NetDev *n); + + /* fill in message to create netdev */ + int (*fill_message_create)(NetDev *netdev, Link *link, sd_rtnl_message *message); + + /* specifies if netdev is independent, or a master device or a stacked device */ + NetDevCreateType create_type; /* create netdev, if not done via rtnl */ int (*create)(NetDev *netdev); @@ -133,6 +147,37 @@ extern const NetDevVTable * const netdev_vtable[_NETDEV_KIND_MAX]; #define NETDEV_VTABLE(n) netdev_vtable[(n)->kind] +/* For casting a netdev into the various netdev kinds */ +#define DEFINE_CAST(UPPERCASE, MixedCase) \ + static inline MixedCase* UPPERCASE(NetDev *n) { \ + if (_unlikely_(!n || n->kind != NETDEV_KIND_##UPPERCASE)) \ + return NULL; \ + \ + return (MixedCase*) n; \ + } + +/* For casting the various netdev kinds into a netdev */ +#define NETDEV(n) (&(n)->meta) + +DEFINE_CAST(BRIDGE, Bridge); +DEFINE_CAST(BOND, Bond); +DEFINE_CAST(VLAN, VLan); +DEFINE_CAST(MACVLAN, MacVlan); +DEFINE_CAST(IPVLAN, IPVlan); +DEFINE_CAST(VXLAN, VxLan); +DEFINE_CAST(IPIP, Tunnel); +DEFINE_CAST(GRE, Tunnel); +DEFINE_CAST(GRETAP, Tunnel); +DEFINE_CAST(IP6GRE, Tunnel); +DEFINE_CAST(IP6GRETAP, Tunnel); +DEFINE_CAST(SIT, Tunnel); +DEFINE_CAST(VTI, Tunnel); +DEFINE_CAST(IP6TNL, Tunnel); +DEFINE_CAST(VETH, Veth); +DEFINE_CAST(DUMMY, Dummy); +DEFINE_CAST(TUN, TunTap); +DEFINE_CAST(TAP, TunTap); + int netdev_load(Manager *manager); void netdev_drop(NetDev *netdev); @@ -158,13 +203,13 @@ const struct ConfigPerfItem* network_netdev_gperf_lookup(const char *key, unsign /* Macros which append INTERFACE= to the message */ -#define log_full_netdev(level, netdev, fmt, ...) log_meta_object(level, __FILE__, __LINE__, __func__, "INTERFACE=", netdev->ifname, "%-*s: " fmt, IFNAMSIZ, netdev->ifname, ##__VA_ARGS__) -#define log_debug_netdev(netdev, ...) log_full_netdev(LOG_DEBUG, netdev, ##__VA_ARGS__) +#define log_full_netdev(level, netdev, fmt, ...) log_object_internal(level, 0, __FILE__, __LINE__, __func__, "INTERFACE=", netdev->ifname, "%-*s: " fmt, IFNAMSIZ, netdev->ifname, ##__VA_ARGS__) +#define log_netdev_debug(netdev, ...) log_full_netdev(LOG_DEBUG, netdev, ##__VA_ARGS__) #define log_info_netdev(netdev, ...) log_full_netdev(LOG_INFO, netdev, ##__VA_ARGS__) #define log_notice_netdev(netdev, ...) log_full_netdev(LOG_NOTICE, netdev, ##__VA_ARGS__) #define log_warning_netdev(netdev, ...) log_full_netdev(LOG_WARNING, netdev,## __VA_ARGS__) -#define log_error_netdev(netdev, ...) log_full_netdev(LOG_ERR, netdev, ##__VA_ARGS__) +#define log_netdev_error(netdev, ...) log_full_netdev(LOG_ERR, netdev, ##__VA_ARGS__) #define log_struct_netdev(level, netdev, ...) log_struct(level, "INTERFACE=%s", netdev->ifname, __VA_ARGS__) -#define NETDEV(netdev) "INTERFACE=%s", netdev->ifname +#define NETDEVIF(netdev) "INTERFACE=%s", netdev->ifname