X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fnetwork%2Fnetworkd-network.c;h=a452096836bd6160e7da413ba0809a32b95acefc;hb=4d473d5dded03d3b682dc389d610bb6b2db6e5f7;hp=4d01e55feeb68282912fc0a077620384e4270090;hpb=6916ec29afd488d91e7e0fcbcc2e006b4e5f28df;p=elogind.git
diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c
index 4d01e55fe..a45209683 100644
--- a/src/network/networkd-network.c
+++ b/src/network/networkd-network.c
@@ -19,6 +19,8 @@
along with systemd; If not, see .
***/
+#include
+
#include "networkd.h"
#include "network-internal.h"
#include "path-util.h"
@@ -143,6 +145,7 @@ int network_load(Manager *manager) {
}
void network_free(Network *network) {
+ NetDev *netdev;
Route *route;
Address *address;
Iterator i;
@@ -165,8 +168,16 @@ void network_free(Network *network) {
set_free(network->dns);
+ netdev_unref(network->bridge);
+
+ netdev_unref(network->bond);
+
+ HASHMAP_FOREACH(netdev, network->vlans, i)
+ netdev_unref(netdev);
hashmap_free(network->vlans);
+ HASHMAP_FOREACH(netdev, network->macvlans, i)
+ netdev_unref(netdev);
hashmap_free(network->macvlans);
while ((route = network->static_routes))
@@ -235,7 +246,7 @@ int network_apply(Manager *manager, Network *network, Link *link) {
return 0;
}
-int config_parse_bridge(const char *unit,
+int config_parse_netdev(const char *unit,
const char *filename,
unsigned line,
const char *section,
@@ -246,7 +257,9 @@ int config_parse_bridge(const char *unit,
void *data,
void *userdata) {
Network *network = userdata;
+ char *kind_string, *p;
NetDev *netdev;
+ NetDevKind kind;
int r;
assert(filename);
@@ -254,141 +267,66 @@ int config_parse_bridge(const char *unit,
assert(rvalue);
assert(data);
- r = netdev_get(network->manager, rvalue, &netdev);
- if (r < 0) {
- log_syntax(unit, LOG_ERR, filename, line, EINVAL,
- "Bridge is invalid, ignoring assignment: %s", rvalue);
- return 0;
- }
-
- if (netdev->kind != NETDEV_KIND_BRIDGE) {
- log_syntax(unit, LOG_ERR, filename, line, EINVAL,
- "NetDev is not a bridge, ignoring assignment: %s", rvalue);
- return 0;
- }
-
- network->bridge = netdev;
-
- return 0;
-}
-
-int config_parse_bond(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) {
- Network *network = userdata;
- NetDev *netdev;
- int r;
+ kind_string = strdup(lvalue);
+ if (!kind_string)
+ return log_oom();
- assert(filename);
- assert(lvalue);
- assert(rvalue);
- assert(data);
+ /* the keys are CamelCase versions of the kind */
+ for (p = kind_string; *p; p++)
+ *p = tolower(*p);
- r = netdev_get(network->manager, rvalue, &netdev);
- if (r < 0) {
+ kind = netdev_kind_from_string(kind_string);
+ if (kind == _NETDEV_KIND_INVALID) {
log_syntax(unit, LOG_ERR, filename, line, EINVAL,
- "Bond is invalid, ignoring assignment: %s", rvalue);
+ "Invalid NetDev kind: %s", lvalue);
return 0;
}
- if (netdev->kind != NETDEV_KIND_BOND) {
- log_syntax(unit, LOG_ERR, filename, line, EINVAL,
- "NetDev is not a bond, ignoring assignment: %s", rvalue);
- return 0;
- }
-
- network->bond = netdev;
-
- return 0;
-}
-
-int config_parse_vlan(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) {
- Network *network = userdata;
- NetDev *netdev;
- int r;
-
- assert(filename);
- assert(lvalue);
- assert(rvalue);
- assert(data);
-
r = netdev_get(network->manager, rvalue, &netdev);
if (r < 0) {
log_syntax(unit, LOG_ERR, filename, line, EINVAL,
- "VLAN is invalid, ignoring assignment: %s", rvalue);
+ "%s could not be found, ignoring assignment: %s", lvalue, rvalue);
return 0;
}
- if (netdev->kind != NETDEV_KIND_VLAN) {
+ if (netdev->kind != kind) {
log_syntax(unit, LOG_ERR, filename, line, EINVAL,
- "NetDev is not a VLAN, ignoring assignment: %s", rvalue);
+ "NetDev is not a %s, ignoring assignment: %s", lvalue, rvalue);
return 0;
}
- r = hashmap_put(network->vlans, &netdev->vlanid, netdev);
- if (r < 0) {
- log_syntax(unit, LOG_ERR, filename, line, EINVAL,
- "Can not add VLAN to network: %s", rvalue);
- return 0;
- }
-
- return 0;
-}
+ switch (kind) {
+ case NETDEV_KIND_BRIDGE:
+ network->bridge = netdev;
-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) {
- Network *network = userdata;
- NetDev *netdev;
- int r;
+ break;
+ case NETDEV_KIND_BOND:
+ network->bond = netdev;
- assert(filename);
- assert(lvalue);
- assert(rvalue);
- assert(data);
+ break;
+ case NETDEV_KIND_VLAN:
+ r = hashmap_put(network->vlans, &netdev->vlanid, netdev);
+ if (r < 0) {
+ log_syntax(unit, LOG_ERR, filename, line, EINVAL,
+ "Can not add VLAN to network: %s", rvalue);
+ return 0;
+ }
- r = netdev_get(network->manager, rvalue, &netdev);
- if (r < 0) {
- log_syntax(unit, LOG_ERR, filename, line, EINVAL,
- "MACVLAN is invalid, ignoring assignment: %s", rvalue);
- return 0;
- }
+ break;
+ case NETDEV_KIND_MACVLAN:
+ r = hashmap_put(network->macvlans, netdev->name, netdev);
+ if (r < 0) {
+ log_syntax(unit, LOG_ERR, filename, line, EINVAL,
+ "Can not add MACVLAN to network: %s", rvalue);
+ return 0;
+ }
- if (netdev->kind != NETDEV_KIND_MACVLAN) {
- log_syntax(unit, LOG_ERR, filename, line, EINVAL,
- "NetDev is not a MACVLAN, ignoring assignment: %s", rvalue);
- return 0;
+ break;
+ default:
+ assert_not_reached("Can not parse NetDev");
}
- r = hashmap_put(network->macvlans, netdev->name, netdev);
- if (r < 0) {
- log_syntax(unit, LOG_ERR, filename, line, EINVAL,
- "Can not add MACVLAN to network: %s", rvalue);
- return 0;
- }
+ netdev_ref(netdev);
return 0;
}