summaryrefslogtreecommitdiff
path: root/src/network/networkd-netdev.h
diff options
context:
space:
mode:
authorTom Gundersen <teg@jklm.no>2014-07-16 13:17:10 +0200
committerTom Gundersen <teg@jklm.no>2014-07-21 13:32:27 +0200
commitaa9f11405829fd4755fef28602a7167dba3ddc89 (patch)
treef86bcda9b90b0e72b1f1e7ffe3f50e9c5d736612 /src/network/networkd-netdev.h
parent653912918f594ebbca46806b302ef6b477402575 (diff)
networkd: netdev - split NetDev struct into per-kind structs
Similarly to how unit types work.
Diffstat (limited to 'src/network/networkd-netdev.h')
-rw-r--r--src/network/networkd-netdev.h101
1 files changed, 68 insertions, 33 deletions
diff --git a/src/network/networkd-netdev.h b/src/network/networkd-netdev.h
index 042e1601c6..e9a8a169db 100644
--- a/src/network/networkd-netdev.h
+++ b/src/network/networkd-netdev.h
@@ -66,6 +66,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 +86,50 @@ 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;
- int 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-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 +142,32 @@ 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(VXLAN, VxLan);
+DEFINE_CAST(IPIP, Tunnel);
+DEFINE_CAST(GRE, Tunnel);
+DEFINE_CAST(SIT, Tunnel);
+DEFINE_CAST(VTI, 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);
@@ -167,4 +202,4 @@ const struct ConfigPerfItem* network_netdev_gperf_lookup(const char *key, unsign
#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