chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
networkd: add minimal IP forwarding and masquerading support to .network files
[elogind.git]
/
src
/
network
/
networkd-network.c
diff --git
a/src/network/networkd-network.c
b/src/network/networkd-network.c
index 075596af6bc7f318d22cd94c753d9d2d1e058041..d6504cc1787cfebe17307eae97d98b07cb656361 100644
(file)
--- a/
src/network/networkd-network.c
+++ b/
src/network/networkd-network.c
@@
-22,14
+22,14
@@
#include <ctype.h>
#include <net/if.h>
#include <ctype.h>
#include <net/if.h>
-#include "networkd.h"
-#include "networkd-netdev.h"
-#include "networkd-link.h"
-#include "network-internal.h"
#include "path-util.h"
#include "conf-files.h"
#include "conf-parser.h"
#include "util.h"
#include "path-util.h"
#include "conf-files.h"
#include "conf-parser.h"
#include "util.h"
+#include "networkd.h"
+#include "networkd-netdev.h"
+#include "networkd-link.h"
+#include "network-internal.h"
static int network_load_one(Manager *manager, const char *filename) {
_cleanup_network_free_ Network *network = NULL;
static int network_load_one(Manager *manager, const char *filename) {
_cleanup_network_free_ Network *network = NULL;
@@
-62,6
+62,7
@@
static int network_load_one(Manager *manager, const char *filename) {
LIST_HEAD_INIT(network->static_addresses);
LIST_HEAD_INIT(network->static_routes);
LIST_HEAD_INIT(network->static_addresses);
LIST_HEAD_INIT(network->static_routes);
+ LIST_HEAD_INIT(network->static_fdb_entries);
network->stacked_netdevs = hashmap_new(&string_hash_ops);
if (!network->stacked_netdevs)
network->stacked_netdevs = hashmap_new(&string_hash_ops);
if (!network->stacked_netdevs)
@@
-75,6
+76,10
@@
static int network_load_one(Manager *manager, const char *filename) {
if (!network->routes_by_section)
return log_oom();
if (!network->routes_by_section)
return log_oom();
+ network->fdb_entries_by_section = hashmap_new(NULL);
+ if (!network->fdb_entries_by_section)
+ return log_oom();
+
network->filename = strdup(filename);
if (!network->filename)
return log_oom();
network->filename = strdup(filename);
if (!network->filename)
return log_oom();
@@
-97,12
+102,17
@@
static int network_load_one(Manager *manager, const char *filename) {
"Route\0"
"DHCP\0"
"DHCPv4\0"
"Route\0"
"DHCP\0"
"DHCPv4\0"
- "BridgePort\0",
+ "Bridge\0"
+ "BridgeFDB\0",
config_item_perf_lookup, network_network_gperf_lookup,
false, false, true, network);
if (r < 0)
return r;
config_item_perf_lookup, network_network_gperf_lookup,
false, false, true, network);
if (r < 0)
return r;
+ /* IPMasquerade=yes implies IPForward=yes */
+ if (network->ip_masquerade)
+ network->ip_forward = true;
+
LIST_PREPEND(networks, manager->networks, network);
LIST_FOREACH(routes, route, network->static_routes) {
LIST_PREPEND(networks, manager->networks, network);
LIST_FOREACH(routes, route, network->static_routes) {
@@
-154,6
+164,7
@@
void network_free(Network *network) {
NetDev *netdev;
Route *route;
Address *address;
NetDev *netdev;
Route *route;
Address *address;
+ FdbEntry *fdb_entry;
Iterator i;
if (!network)
Iterator i;
if (!network)
@@
-192,8
+203,12
@@
void network_free(Network *network) {
while ((address = network->static_addresses))
address_free(address);
while ((address = network->static_addresses))
address_free(address);
+ while ((fdb_entry = network->static_fdb_entries))
+ fdb_entry_free(fdb_entry);
+
hashmap_free(network->addresses_by_section);
hashmap_free(network->routes_by_section);
hashmap_free(network->addresses_by_section);
hashmap_free(network->routes_by_section);
+ hashmap_free(network->fdb_entries_by_section);
if (network->manager && network->manager->networks)
LIST_REMOVE(networks, network->manager->networks, network);
if (network->manager && network->manager->networks)
LIST_REMOVE(networks, network->manager->networks, network);