#include <log/log.h>
#include <list/list.h>
+#include <types/types.h>
#include <talloc/talloc.h>
#include <waiter/waiter.h>
#include <pb-config/pb-config.h>
#include "file.h"
#include "network.h"
+#include "device-handler.h"
#define HWADDR_SIZE 6
#define PIDFILE_BASE (LOCAL_STATE_DIR "/petitboot/")
struct list_item list;
struct process *udhcpc_process;
+ struct discover_device *dev;
};
struct network {
- struct list interfaces;
- struct waiter *waiter;
- int netlink_sd;
- bool manual_config;
- bool dry_run;
+ struct list interfaces;
+ struct device_handler *handler;
+ struct waiter *waiter;
+ int netlink_sd;
+ bool manual_config;
+ bool dry_run;
};
static const struct interface_config *find_config_by_hwaddr(
return 0;
}
+static void add_interface(struct network *network,
+ struct interface *interface)
+{
+ list_add(&network->interfaces, &interface->list);
+ interface->dev = discover_device_create(network->handler,
+ interface->name);
+ interface->dev->device->type = DEVICE_TYPE_NETWORK;
+ device_handler_add_device(network->handler, interface->dev);
+}
+
+static void remove_interface(struct network *network,
+ struct interface *interface)
+{
+ device_handler_remove(network->handler, interface->dev);
+ list_remove(&interface->list);
+ talloc_free(interface);
+}
+
static int interface_change(struct interface *interface, bool up)
{
const char *statestr = up ? "up" : "down";
struct interface *interface;
struct ifinfomsg *info;
struct rtattr *attr;
+ unsigned int mtu;
uint8_t ifaddr[6];
char ifname[IFNAMSIZ+1];
int attrlen, type;
strncpy(ifname, data, IFNAMSIZ);
have_ifname = true;
break;
+
+ case IFLA_MTU:
+ mtu = *(unsigned int *)data;
+ break;
}
}
if (!have_ifaddr || !have_ifname)
return -1;
- if (type == RTM_DELLINK) {
+ if (type == RTM_DELLINK || mtu == 0) {
interface = find_interface_by_ifindex(network, info->ifi_index);
if (!interface)
return 0;
pb_log("network: interface %s removed\n", interface->name);
- list_remove(&interface->list);
- talloc_free(interface);
+ remove_interface(network, interface);
return 0;
}
interface->state = IFSTATE_NEW;
memcpy(interface->hwaddr, ifaddr, sizeof(interface->hwaddr));
strncpy(interface->name, ifname, sizeof(interface->name) - 1);
+ add_interface(network, interface);
}
configure_interface(network, interface,
talloc_free(buf);
}
-struct network *network_init(void *ctx, struct waitset *waitset, bool dry_run)
+struct network *network_init(struct device_handler *handler,
+ struct waitset *waitset, bool dry_run)
{
struct network *network;
int rc;
- network = talloc(ctx, struct network);
+ network = talloc(handler, struct network);
list_init(&network->interfaces);
+ network->handler = handler;
network->manual_config = false;
network->dry_run = dry_run;