#include "sd-icmp6-nd.h"
#include "sd-dhcp6-client.h"
#include "udev.h"
+#include "sd-lldp.h"
#include "rtnl-util.h"
#include "hashmap.h"
typedef struct Route Route;
typedef struct Manager Manager;
typedef struct AddressPool AddressPool;
-
-typedef enum DHCPSupport {
- DHCP_SUPPORT_NONE,
- DHCP_SUPPORT_BOTH,
- DHCP_SUPPORT_V4,
- DHCP_SUPPORT_V6,
- _DHCP_SUPPORT_MAX,
- _DHCP_SUPPORT_INVALID = -1,
-} DHCPSupport;
+typedef struct FdbEntry FdbEntry;
+
+typedef enum AddressFamilyBoolean {
+ /* This is a bitmask, though it usually doesn't feel that way! */
+ ADDRESS_FAMILY_NO = 0,
+ ADDRESS_FAMILY_IPV4 = 1,
+ ADDRESS_FAMILY_IPV6 = 2,
+ ADDRESS_FAMILY_YES = 3,
+ _ADDRESS_FAMILY_BOOLEAN_MAX,
+ _ADDRESS_FAMILY_BOOLEAN_INVALID = -1,
+} AddressFamilyBoolean;
typedef enum LLMNRSupport {
LLMNR_SUPPORT_NO,
_LLMNR_SUPPORT_INVALID = -1,
} LLMNRSupport;
+typedef enum LinkOperationalState {
+ LINK_OPERSTATE_OFF,
+ LINK_OPERSTATE_NO_CARRIER,
+ LINK_OPERSTATE_DORMANT,
+ LINK_OPERSTATE_CARRIER,
+ LINK_OPERSTATE_DEGRADED,
+ LINK_OPERSTATE_ROUTABLE,
+ _LINK_OPERSTATE_MAX,
+ _LINK_OPERSTATE_INVALID = -1
+} LinkOperationalState;
+
+struct FdbEntry {
+ Network *network;
+ unsigned section;
+
+ struct ether_addr *mac_addr;
+ uint16_t vlan_id;
+
+ LIST_FIELDS(FdbEntry, static_fdb_entries);
+};
+
struct Network {
Manager *manager;
NetDev *bridge;
NetDev *bond;
Hashmap *stacked_netdevs;
- DHCPSupport dhcp;
+ AddressFamilyBoolean dhcp;
bool dhcp_dns;
bool dhcp_ntp;
bool dhcp_mtu;
bool dhcp_server;
+ unsigned cost;
+
+ AddressFamilyBoolean ip_forward;
+ bool ip_masquerade;
+
+ struct ether_addr *mac;
+ unsigned mtu;
+
+ bool lldp;
+
LIST_HEAD(Address, static_addresses);
LIST_HEAD(Route, static_routes);
+ LIST_HEAD(FdbEntry, static_fdb_entries);
Hashmap *addresses_by_section;
Hashmap *routes_by_section;
+ Hashmap *fdb_entries_by_section;
bool wildcard_domain;
char **domains, **dns, **ntp;
union in_addr_union in_addr;
union in_addr_union in_addr_peer;
+ bool ip_masquerade_done;
+
LIST_FIELDS(Address, addresses);
};
int family;
unsigned char dst_prefixlen;
+ unsigned char src_prefixlen;
unsigned char scope;
uint32_t metrics;
unsigned char protocol; /* RTPROT_* */
union in_addr_union in_addr;
union in_addr_union dst_addr;
+ union in_addr_union src_addr;
union in_addr_union prefsrc_addr;
LIST_FIELDS(Route, routes);
struct Manager {
sd_rtnl *rtnl;
sd_event *event;
+ sd_event_source *bus_retry_event_source;
sd_bus *bus;
+ sd_bus_slot *prepare_for_sleep_slot;
struct udev *udev;
struct udev_monitor *udev_monitor;
sd_event_source *udev_event_source;
+ bool enumerating;
+
char *state_file;
+ LinkOperationalState operational_state;
Hashmap *links;
Hashmap *netdevs;
/* Manager */
+extern const sd_bus_vtable manager_vtable[];
+
int manager_new(Manager **ret);
void manager_free(Manager *m);
+int manager_connect_bus(Manager *m);
+int manager_run(Manager *m);
+
int manager_load_config(Manager *m);
bool manager_should_reload(Manager *m);
int manager_rtnl_enumerate_links(Manager *m);
+int manager_rtnl_enumerate_addresses(Manager *m);
-int manager_rtnl_listen(Manager *m);
-int manager_udev_listen(Manager *m);
-int manager_bus_listen(Manager *m);
-
+int manager_send_changed(Manager *m, const char *property, ...) _sentinel_;
int manager_save(Manager *m);
int manager_address_pool_acquire(Manager *m, int family, unsigned prefixlen, union in_addr_union *found);
int address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback);
int address_update(Address *address, Link *link, sd_rtnl_message_handler_t callback);
int address_drop(Address *address, Link *link, sd_rtnl_message_handler_t callback);
+int address_establish(Address *address, Link *link);
+int address_release(Address *address, Link *link);
bool address_equal(Address *a1, Address *a2);
DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
const char *section, unsigned section_line, const char *lvalue,
int ltype, const char *rvalue, void *data, void *userdata);
-/* DHCP support */
+/* Forwarding database table. */
+int fdb_entry_configure(sd_rtnl *const rtnl, FdbEntry *const fdb_entry, const int ifindex);
+void fdb_entry_free(FdbEntry *fdb_entry);
+int fdb_entry_new_static(Network *const network, const unsigned section, FdbEntry **ret);
+
+DEFINE_TRIVIAL_CLEANUP_FUNC(FdbEntry*, fdb_entry_free);
+#define _cleanup_fdbentry_free_ _cleanup_(fdb_entry_freep)
-const char* dhcp_support_to_string(DHCPSupport i) _const_;
-DHCPSupport dhcp_support_from_string(const char *s) _pure_;
+int config_parse_fdb_hwaddr(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_fdb_vlan_id(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);
+
+/* DHCP support */
int config_parse_dhcp(const char *unit, const char *filename, unsigned line,
const char *section, unsigned section_line, const char *lvalue,
void address_pool_free(AddressPool *p);
int address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union *found);
+
+const char *address_family_boolean_to_string(AddressFamilyBoolean b) _const_;
+AddressFamilyBoolean address_family_boolean_from_string(const char *s) _const_;
+
+int config_parse_address_family_boolean(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);
+
+/* Opeartional State */
+
+const char* link_operstate_to_string(LinkOperationalState s) _const_;
+LinkOperationalState link_operstate_from_string(const char *s) _pure_;