From d274a5320bd88618e6ba37da5f0dc4197dec56d8 Mon Sep 17 00:00:00 2001 From: Roy Marples Date: Fri, 5 Mar 2010 15:47:46 +0000 Subject: [PATCH] Set the broadcast flag for interfaces that say they need it. --- dhcpcd.c | 3 +++ if-bsd.c | 7 +++++++ if-linux.c | 20 ++++++++++++++++++++ net.h | 1 + 4 files changed, 31 insertions(+) diff --git a/dhcpcd.c b/dhcpcd.c index ac077ad2..170af36b 100644 --- a/dhcpcd.c +++ b/dhcpcd.c @@ -765,6 +765,9 @@ configure_interface1(struct interface *iface) uint8_t *duid; size_t len = 0, ifl; + /* Do any platform specific configuration */ + if_conf(iface); + if (iface->flags & IFF_POINTOPOINT && !(ifo->options & DHCPCD_INFORM)) ifo->options |= DHCPCD_STATIC; if (iface->flags & IFF_NOARP || diff --git a/if-bsd.c b/if-bsd.c index 05a2d515..8ca2f28a 100644 --- a/if-bsd.c +++ b/if-bsd.c @@ -79,6 +79,13 @@ if_init(_unused struct interface *iface) return 0; } +int +if_conf(_unused struct interface *iface) +{ + /* No extra checks needed on BSD */ + return 0; +} + int init_sockets(void) { diff --git a/if-linux.c b/if-linux.c index 705f7753..58d732d5 100644 --- a/if-linux.c +++ b/if-linux.c @@ -85,6 +85,26 @@ if_init(struct interface *iface) return n == -1 ? -1 : 0; } +int +if_conf(struct interface *iface) +{ + char path[PATH_MAX], buf[1]; + FILE *fp; + + /* Some qeth setups require the use of the broadcast flag. */ + snprintf(path, sizeof(path), + "/sys/class/net/%s/device/layer2", + iface->name); + + fp = fopen(path, "r"); + if (fp == NULL) + return errno == ENOENT ? 0 : -1; + if (fgets(buf, sizeof(buf), fp) != NULL && buf[0] == '0') + iface->state->options->options |= DHCPCD_BROADCAST; + fclose(fp); + return 0; +} + static int _open_link_socket(struct sockaddr_nl *nl) { diff --git a/net.h b/net.h index 4f92f0a7..4d6eaada 100644 --- a/net.h +++ b/net.h @@ -105,6 +105,7 @@ int inet_ntocidr(struct in_addr); int inet_cidrtoaddr(int, struct in_addr *); int up_interface(struct interface *); +int if_conf(struct interface *); int if_init(struct interface *); int do_address(const char *,