Imported Upstream version 1.24
[platform/upstream/connman.git] / gdhcp / common.c
index 0c433dd..e111150 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *  DHCP library with GLib integration
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -170,12 +170,9 @@ uint8_t *dhcpv6_get_option(struct dhcpv6_packet *packet, uint16_t pkt_len,
                        break;
 
                if (opt_code == code) {
-                       if (option_len != NULL)
+                       if (option_len)
                                *option_len = opt_len;
-                       if (rem < 0)
-                               goto bad_packet;
-                       else
-                               found = optionptr + 2 + 2;
+                       found = optionptr + 2 + 2;
                        count++;
                }
 
@@ -185,15 +182,15 @@ uint8_t *dhcpv6_get_option(struct dhcpv6_packet *packet, uint16_t pkt_len,
                optionptr += len;
        }
 
-       if (option_count != NULL)
+       if (option_count)
                *option_count = count;
 
        return found;
 
 bad_packet:
-       if (option_len != NULL)
+       if (option_len)
                *option_len = 0;
-       if (option_count != NULL)
+       if (option_count)
                *option_count = 0;
        return NULL;
 }
@@ -371,34 +368,6 @@ void dhcpv6_init_header(struct dhcpv6_packet *packet, uint8_t type)
        packet->transaction_id[2] = id & 0xff;
 }
 
-static gboolean check_vendor(uint8_t  *option_vendor, const char *vendor)
-{
-       uint8_t vendor_length = sizeof(vendor) - 1;
-
-       if (option_vendor[OPT_LEN - OPT_DATA] != vendor_length)
-               return FALSE;
-
-       if (memcmp(option_vendor, vendor, vendor_length) != 0)
-               return FALSE;
-
-       return TRUE;
-}
-
-static void check_broken_vendor(struct dhcp_packet *packet)
-{
-       uint8_t *vendor;
-
-       if (packet->op != BOOTREQUEST)
-               return;
-
-       vendor = dhcp_get_option(packet, DHCP_VENDOR);
-       if (vendor == NULL)
-               return;
-
-       if (check_vendor(vendor, "MSFT 98") == TRUE)
-               packet->flags |= htons(BROADCAST_FLAG);
-}
-
 int dhcp_recv_l3_packet(struct dhcp_packet *packet, int fd)
 {
        int n;
@@ -412,8 +381,6 @@ int dhcp_recv_l3_packet(struct dhcp_packet *packet, int fd)
        if (packet->cookie != htonl(DHCP_MAGIC))
                return -EPROTO;
 
-       check_broken_vendor(packet);
-
        return n;
 }
 
@@ -496,7 +463,7 @@ int dhcpv6_send_packet(int index, struct dhcpv6_packet *dhcp_pkt, int len)
 
        control_buf_len = CMSG_SPACE(sizeof(struct in6_pktinfo));
        control_buf = g_try_malloc0(control_buf_len);
-       if (control_buf == NULL) {
+       if (!control_buf) {
                close(fd);
                return -ENOMEM;
        }
@@ -525,8 +492,17 @@ int dhcpv6_send_packet(int index, struct dhcpv6_packet *dhcp_pkt, int len)
        m.msg_controllen = cmsg->cmsg_len;
 
        ret = sendmsg(fd, &m, 0);
-       if (ret < 0)
-               perror("DHCPv6 msg send failed");
+       if (ret < 0) {
+               char *msg = "DHCPv6 msg send failed";
+
+               if (errno == EADDRNOTAVAIL) {
+                       char *str = g_strdup_printf("%s (index %d)",
+                                       msg, index);
+                       perror(str);
+                       g_free(str);
+               } else
+                       perror(msg);
+       }
 
        g_free(control_buf);
        close(fd);
@@ -553,6 +529,8 @@ int dhcp_send_raw_packet(struct dhcp_packet *dhcp_pkt,
        if (fd < 0)
                return -errno;
 
+       dhcp_pkt->flags |= htons(BROADCAST_FLAG);
+
        memset(&dest, 0, sizeof(dest));
        memset(&packet, 0, sizeof(packet));
        packet.data = *dhcp_pkt;
@@ -718,16 +696,16 @@ char *get_interface_name(int index)
        return g_strdup(ifr.ifr_name);
 }
 
-gboolean interface_is_up(int index)
+bool interface_is_up(int index)
 {
        int sk, err;
        struct ifreq ifr;
-       gboolean ret = FALSE;
+       bool ret = false;
 
        sk = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
        if (sk < 0) {
                perror("Open socket error");
-               return FALSE;
+               return false;
        }
 
        memset(&ifr, 0, sizeof(ifr));
@@ -746,7 +724,7 @@ gboolean interface_is_up(int index)
        }
 
        if (ifr.ifr_flags & IFF_UP)
-               ret = TRUE;
+               ret = true;
 
 done:
        close(sk);