#pragma once
#include <arpa/inet.h>
-#include <linux/rtnetlink.h>
#include "sd-event.h"
#include "sd-rtnl.h"
#include "sd-bus.h"
#include "sd-dhcp-client.h"
+#include "sd-ipv4ll.h"
#include "udev.h"
#include "rtnl-util.h"
#include "hashmap.h"
#include "list.h"
+#include "set.h"
+#include "condition-util.h"
typedef struct NetDev NetDev;
typedef struct Network Network;
LIST_FIELDS(netdev_enslave_callback, callbacks);
};
+typedef enum MacVlanMode {
+ NETDEV_MACVLAN_MODE_PRIVATE = MACVLAN_MODE_PRIVATE,
+ NETDEV_MACVLAN_MODE_VEPA = MACVLAN_MODE_VEPA,
+ NETDEV_MACVLAN_MODE_BRIDGE = MACVLAN_MODE_BRIDGE,
+ NETDEV_MACVLAN_MODE_PASSTHRU = MACVLAN_MODE_PASSTHRU,
+ _NETDEV_MACVLAN_MODE_MAX,
+ _NETDEV_MACVLAN_MODE_INVALID = -1
+} MacVlanMode;
+
typedef enum NetDevKind {
NETDEV_KIND_BRIDGE,
NETDEV_KIND_BOND,
NETDEV_KIND_VLAN,
+ NETDEV_KIND_MACVLAN,
_NETDEV_KIND_MAX,
_NETDEV_KIND_INVALID = -1
} NetDevKind;
char *filename;
+ Condition *match_host;
+ Condition *match_virt;
+ Condition *match_kernel;
+ Condition *match_arch;
+
char *description;
char *name;
NetDevKind kind;
uint64_t vlanid;
+ int32_t macvlan_mode;
int ifindex;
NetDevState state;
char *match_driver;
char *match_type;
char *match_name;
+ Condition *match_host;
+ Condition *match_virt;
+ Condition *match_kernel;
+ Condition *match_arch;
char *description;
NetDev *bridge;
NetDev *bond;
Hashmap *vlans;
+ Hashmap *macvlans;
bool dhcp;
bool dhcp_dns;
bool dhcp_mtu;
bool dhcp_hostname;
bool dhcp_domainname;
bool dhcp_critical;
+ bool ipv4ll;
LIST_HEAD(Address, static_addresses);
LIST_HEAD(Route, static_routes);
- Address *dns;
Hashmap *addresses_by_section;
Hashmap *routes_by_section;
+ Set *dns;
+
LIST_FIELDS(Network, networks);
};
unsigned char family;
unsigned char prefixlen;
+ unsigned char scope;
char *label;
struct in_addr broadcast;
unsigned char family;
unsigned char dst_prefixlen;
+ unsigned char scope;
+ uint32_t metrics;
union {
struct in_addr in;
uint64_t ifindex;
char *ifname;
+ char *state_file;
struct ether_addr mac;
unsigned flags;
sd_dhcp_client *dhcp_client;
sd_dhcp_lease *dhcp_lease;
uint16_t original_mtu;
+ sd_ipv4ll *ipv4ll;
};
struct Manager {
struct udev *udev;
struct udev_monitor *udev_monitor;
sd_event_source *udev_event_source;
+ sd_event_source *sigterm_event_source;
+ sd_event_source *sigint_event_source;
Hashmap *links;
Hashmap *netdevs;
const char *netdev_kind_to_string(NetDevKind d) _const_;
NetDevKind netdev_kind_from_string(const char *d) _pure_;
+const char *macvlan_mode_to_string(MacVlanMode d) _const_;
+MacVlanMode macvlan_mode_from_string(const char *d) _pure_;
+
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);
+int config_parse_macvlan_mode(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);
+
+/* gperf */
+const struct ConfigPerfItem* network_netdev_gperf_lookup(const char *key, unsigned length);
+
/* Network */
int network_load(Manager *manager);
const char *section, unsigned section_line, const char *lvalue,
int ltype, const char *rvalue, void *data, void *userdata);
-/* gperf */
+int config_parse_macvlan(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);
-const struct ConfigPerfItem* network_gperf_lookup(const char *key, unsigned length);
+/* gperf */
+const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
/* Route */
int route_new_static(Network *network, unsigned section, Route **ret);
int route_new_dynamic(Route **ret);
void route_free(Route *route);
int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback);
+int route_drop(Route *route, Link *link, sd_rtnl_message_handler_t callback);
+
DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
#define _cleanup_route_free_ _cleanup_(route_freep)
int link_new(Manager *manager, struct udev_device *device, Link **ret);
void link_free(Link *link);
+int link_get(Manager *m, int ifindex, Link **ret);
int link_add(Manager *manager, struct udev_device *device, Link **ret);
-int link_configure(Link *link);
int link_update(Link *link, sd_rtnl_message *message);
+int link_save(Link *link);
+
+const char* link_state_to_string(LinkState s) _const_;
+LinkState link_state_from_string(const char *s) _pure_;
+
DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_free);
#define _cleanup_link_free_ _cleanup_(link_freep)