X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=discover%2Fnetwork.c;h=ad17a417e4f48d7fed992d48291807b71f1a1221;hp=8cc01833d5875990358ea0bc897eea0bf5ab6fe0;hb=20889c61bc0e6712c1cac5a0a6e9e8e9dff7cf84;hpb=729bcafedd3b117c031c413fac2e2d2096d62510;ds=sidebyside diff --git a/discover/network.c b/discover/network.c index 8cc0183..ad17a41 100644 --- a/discover/network.c +++ b/discover/network.c @@ -14,13 +14,13 @@ #include #include #include -#include #include #include #include "file.h" #include "network.h" #include "sysinfo.h" +#include "platform.h" #include "device-handler.h" #define HWADDR_SIZE 6 @@ -150,6 +150,25 @@ static int network_send_link_query(struct network *network) 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) { @@ -157,6 +176,8 @@ static void add_interface(struct network *network, 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); } @@ -181,6 +202,15 @@ static int interface_change(struct interface *interface, bool up) 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) { @@ -212,21 +242,31 @@ static void udhcpc_process_exit(struct process *process) 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; @@ -523,7 +563,7 @@ static void network_init_dns(struct network *network) 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); @@ -574,7 +614,6 @@ err: return NULL; } - int network_shutdown(struct network *network) { struct interface *interface;