#include <types/types.h>
#include <talloc/talloc.h>
#include <waiter/waiter.h>
-#include <pb-config/pb-config.h>
#include <process/process.h>
#include <system/system.h>
#include "file.h"
#include "network.h"
#include "sysinfo.h"
+#include "platform.h"
#include "device-handler.h"
#define HWADDR_SIZE 6
return NULL;
}
+static struct interface *find_interface_by_name(struct network *network,
+ const char *name)
+{
+ struct interface *interface;
+
+ list_for_each_entry(&network->interfaces, interface, list)
+ if (!strcmp(interface->name, name))
+ return interface;
+
+ return NULL;
+}
+
static int network_init_netlink(struct network *network)
{
struct sockaddr_nl addr;
return 0;
}
+static char *mac_bytes_to_string(void *ctx, uint8_t *addr, int len)
+{
+ const int l = strlen("xx:");
+ char *buf;
+ int i;
+
+ if (len <= 0)
+ return talloc_strdup(ctx, "");
+
+ buf = talloc_array(ctx, char, (len * l) + 1);
+
+ for (i = 0; i < len; i++)
+ sprintf(buf + (l * i), "%02x:", addr[i]);
+
+ *(buf + (l * len) - 1) = '\0';
+
+ return buf;
+}
+
static void add_interface(struct network *network,
struct interface *interface)
{
interface->dev = discover_device_create(network->handler,
interface->name);
interface->dev->device->type = DEVICE_TYPE_NETWORK;
+ interface->dev->uuid = mac_bytes_to_string(interface->dev,
+ interface->hwaddr, sizeof(interface->hwaddr));
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);
+ if (interface->dev)
+ device_handler_remove(network->handler, interface->dev);
list_remove(&interface->list);
talloc_free(interface);
}
+void network_register_device(struct network *network,
+ struct discover_device *dev)
+{
+ struct interface *iface;
+
+ iface = find_interface_by_name(network, dev->device->id);
+ if (!iface)
+ return;
+
+ iface->dev = dev;
+ dev->uuid = mac_bytes_to_string(iface->dev, iface->hwaddr,
+ sizeof(iface->hwaddr));
+}
+
+void network_unregister_device(struct network *network,
+ struct discover_device *dev)
+{
+ struct interface *iface;
+
+ iface = find_interface_by_name(network, dev->device->id);
+ if (!iface)
+ return;
+
+ iface->dev = NULL;
+}
+
static int interface_change(struct interface *interface, bool up)
{
const char *statestr = up ? "up" : "down";
process_release(interface->udhcpc_process);
}
+ if (!up) {
+ rc = process_run_simple(interface, pb_system_apps.ip,
+ "address", "flush", "dev", interface->name,
+ NULL);
+ if (rc)
+ pb_log("failed to flush addresses from interface %s\n",
+ interface->name);
+ }
+
rc = process_run_simple(interface, pb_system_apps.ip,
"link", "set", interface->name, statestr, NULL);
if (rc) {
static void configure_interface_dhcp(struct interface *interface)
{
+ const struct platform *platform;
+ char pidfile[256], id[10];
struct process *process;
- char pidfile[256];
int rc;
const char *argv[] = {
pb_system_apps.udhcpc,
"-R",
- "-n",
+ "-f",
"-O", "pxeconffile",
"-O", "pxepathprefix",
"-p", pidfile,
"-i", interface->name,
+ "-x", id, /* [11,12] - dhcp client identifier */
NULL,
};
+
snprintf(pidfile, sizeof(pidfile), "%s/udhcpc-%s.pid",
PIDFILE_BASE, interface->name);
+ platform = platform_get();
+ if (platform && platform->dhcp_arch_id != 0xffff)
+ snprintf(id, sizeof(id), "0x5d:%04x", platform->dhcp_arch_id);
+ else
+ argv[11] = NULL;
+
process = process_create(interface);
process->path = pb_system_apps.udhcpc;
buf = talloc_realloc(network, buf, char, len + dns_conf_len + 1);
memcpy(buf + len, dns_conf, dns_conf_len);
len += dns_conf_len;
- buf[len - 1] = '\0';
+ buf[len] = '\0';
modified = true;
talloc_free(dns_conf);
return NULL;
}
-
int network_shutdown(struct network *network)
{
struct interface *interface;