diff options
author | Seonah Moon <seonah1.moon@samsung.com> | 2018-01-08 13:42:54 +0900 |
---|---|---|
committer | Seonah Moon <seonah1.moon@samsung.com> | 2018-01-08 13:43:31 +0900 |
commit | 9362752a471a5c892d679548fbf2828d5fc5684b (patch) | |
tree | 83c7d29a28556906938f5c2198d81e2d35f86f92 /gdhcp | |
parent | 22633ced6225d294ce8483efbf2b39ea0c0c1b65 (diff) | |
download | connman-9362752a471a5c892d679548fbf2828d5fc5684b.tar.gz connman-9362752a471a5c892d679548fbf2828d5fc5684b.tar.bz2 connman-9362752a471a5c892d679548fbf2828d5fc5684b.zip |
Imported Upstream version 1.35upstream/1.35
Change-Id: I174854914d9fd06a813270b57d1f7bc2bac63c6a
Signed-off-by: Seonah Moon <seonah1.moon@samsung.com>
Diffstat (limited to 'gdhcp')
-rw-r--r-- | gdhcp/client.c | 39 | ||||
-rw-r--r-- | gdhcp/common.c | 53 | ||||
-rw-r--r-- | gdhcp/gdhcp.h | 2 | ||||
-rw-r--r-- | gdhcp/ipv4ll.c | 10 | ||||
-rw-r--r-- | gdhcp/server.c | 6 |
5 files changed, 73 insertions, 37 deletions
diff --git a/gdhcp/client.c b/gdhcp/client.c index 5a4a89c8..3e67fcd5 100644 --- a/gdhcp/client.c +++ b/gdhcp/client.c @@ -827,16 +827,19 @@ int g_dhcpv6_client_get_timeouts(GDHCPClient *dhcp_client, return -EINVAL; if (T1) - *T1 = dhcp_client->T1; + *T1 = (dhcp_client->expire == 0xffffffff) ? 0xffffffff: + dhcp_client->T1; if (T2) - *T2 = dhcp_client->T2; + *T2 = (dhcp_client->expire == 0xffffffff) ? 0xffffffff: + dhcp_client->T2; if (started) *started = dhcp_client->last_request; if (expire) - *expire = dhcp_client->last_request + dhcp_client->expire; + *expire = (dhcp_client->expire == 0xffffffff) ? 0xffffffff: + dhcp_client->last_request + dhcp_client->expire; return 0; } @@ -1266,7 +1269,7 @@ static int dhcp_l2_socket(int ifindex) .filter = (struct sock_filter *) filter_instr, }; - fd = socket(PF_PACKET, SOCK_DGRAM | SOCK_CLOEXEC, htons(ETH_P_IP)); + fd = socket(PF_PACKET, SOCK_DGRAM | SOCK_CLOEXEC, 0); if (fd < 0) return -errno; @@ -1625,8 +1628,7 @@ static uint32_t get_lease(struct dhcp_packet *packet) return 3600; lease_seconds = get_be32(option); - /* paranoia: must not be prone to overflows */ - lease_seconds &= 0x0fffffff; + if (lease_seconds < 10) lease_seconds = 10; @@ -1674,8 +1676,10 @@ static gboolean continue_rebound(gpointer user_data) switch_listening_mode(dhcp_client, L2); send_request(dhcp_client); - if (dhcp_client->t2_timeout> 0) + if (dhcp_client->t2_timeout> 0) { g_source_remove(dhcp_client->t2_timeout); + dhcp_client->t2_timeout = 0; + } /*recalculate remaining rebind time*/ dhcp_client->T2 >>= 1; @@ -1723,6 +1727,8 @@ static gboolean continue_renew (gpointer user_data) if (dhcp_client->t1_timeout > 0) g_source_remove(dhcp_client->t1_timeout); + dhcp_client->t1_timeout = 0; + dhcp_client->T1 >>= 1; if (dhcp_client->T1 > 60) { @@ -2285,6 +2291,8 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition, if (dhcp_client->type == G_DHCP_IPV6) { re = dhcpv6_recv_l3_packet(&packet6, buf, sizeof(buf), dhcp_client->listener_sockfd); + if (re < 0) + return TRUE; pkt_len = re; pkt = packet6; xid = packet6->transaction_id[0] << 16 | @@ -2347,10 +2355,6 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition, return TRUE; } - if (!message_type && !client_id) - /* No message type / client id option, ignore package */ - return TRUE; - debug(dhcp_client, "received DHCP packet xid 0x%04x " "(current state %d)", ntohl(xid), dhcp_client->state); @@ -2680,6 +2684,7 @@ static gboolean ipv4ll_announce_timeout(gpointer dhcp_data) dhcp_client->ipv4ll_available_cb(dhcp_client, dhcp_client->ipv4ll_available_data); dhcp_client->conflicts = 0; + dhcp_client->timeout = 0; return FALSE; } @@ -2712,6 +2717,8 @@ int g_dhcp_client_start(GDHCPClient *dhcp_client, const char *last_address) uint32_t addr; uint64_t rand; + remove_timeouts(dhcp_client); + if (dhcp_client->type == G_DHCP_IPV6) { if (dhcp_client->information_req_cb) { dhcp_client->state = INFORMATION_REQ; @@ -2828,9 +2835,10 @@ int g_dhcp_client_start(GDHCPClient *dhcp_client, const char *last_address) addr = 0; } else { addr = ntohl(inet_addr(last_address)); - if (addr == 0xFFFFFFFF) { + if (addr == 0xFFFFFFFF || ((addr & LINKLOCAL_ADDR) == + LINKLOCAL_ADDR)) { addr = 0; - } else { + } else if (dhcp_client->last_address != last_address) { g_free(dhcp_client->last_address); dhcp_client->last_address = g_strdup(last_address); } @@ -3109,13 +3117,14 @@ GDHCPClientError g_dhcp_client_set_id(GDHCPClient *dhcp_client) return G_DHCP_CLIENT_ERROR_NONE; } -/* Now only support send hostname */ +/* Now only support send hostname and vendor class ID */ GDHCPClientError g_dhcp_client_set_send(GDHCPClient *dhcp_client, unsigned char option_code, const char *option_value) { uint8_t *binary_option; - if (option_code == G_DHCP_HOST_NAME && option_value) { + if ((option_code == G_DHCP_HOST_NAME || + option_code == G_DHCP_VENDOR_CLASS_ID) && option_value) { binary_option = alloc_dhcp_string_option(option_code, option_value); if (!binary_option) diff --git a/gdhcp/common.c b/gdhcp/common.c index f3d4677e..6f816718 100644 --- a/gdhcp/common.c +++ b/gdhcp/common.c @@ -46,6 +46,7 @@ static const DHCPOption client_options[] = { { OPTION_IP | OPTION_LIST, 0x06 }, /* domain-name-servers */ { OPTION_STRING, 0x0c }, /* hostname */ { OPTION_STRING, 0x0f }, /* domain-name */ + { OPTION_U16, 0x1a }, /* mtu */ { OPTION_IP | OPTION_LIST, 0x2a }, /* ntp-servers */ { OPTION_U32, 0x33 }, /* dhcp-lease-time */ /* Options below will not be exposed to user */ @@ -489,15 +490,20 @@ int dhcpv6_send_packet(int index, struct dhcpv6_packet *dhcp_pkt, int len) if (fd < 0) return -errno; - setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); + if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) { + int err = errno; + close(fd); + return -err; + } memset(&src, 0, sizeof(src)); src.sin6_family = AF_INET6; src.sin6_port = htons(DHCPV6_CLIENT_PORT); if (bind(fd, (struct sockaddr *) &src, sizeof(src)) <0) { + int err = errno; close(fd); - return -errno; + return -err; } memset(&dst, 0, sizeof(dst)); @@ -571,7 +577,7 @@ int dhcp_send_raw_packet(struct dhcp_packet *dhcp_pkt, offsetof(struct ip_udp_dhcp_packet, udp), }; - fd = socket(PF_PACKET, SOCK_DGRAM | SOCK_CLOEXEC, htons(ETH_P_IP)); + fd = socket(PF_PACKET, SOCK_DGRAM | SOCK_CLOEXEC, 0); if (fd < 0) return -errno; @@ -588,8 +594,9 @@ int dhcp_send_raw_packet(struct dhcp_packet *dhcp_pkt, dest.sll_halen = 6; memcpy(dest.sll_addr, dest_arp, 6); if (bind(fd, (struct sockaddr *)&dest, sizeof(dest)) < 0) { + int err = errno; close(fd); - return -errno; + return -err; } packet.ip.protocol = IPPROTO_UDP; @@ -616,10 +623,13 @@ int dhcp_send_raw_packet(struct dhcp_packet *dhcp_pkt, */ n = sendto(fd, &packet, IP_UPD_DHCP_SIZE, 0, (struct sockaddr *) &dest, sizeof(dest)); - close(fd); + if (n < 0) { + int err = errno; + close(fd); + return -err; + } - if (n < 0) - return -errno; + close(fd); return n; } @@ -640,15 +650,20 @@ int dhcp_send_kernel_packet(struct dhcp_packet *dhcp_pkt, if (fd < 0) return -errno; - setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); + if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) { + int err = errno; + close(fd); + return -err; + } memset(&client, 0, sizeof(client)); client.sin_family = AF_INET; client.sin_port = htons(source_port); client.sin_addr.s_addr = htonl(source_ip); if (bind(fd, (struct sockaddr *) &client, sizeof(client)) < 0) { + int err = errno; close(fd); - return -errno; + return -err; } memset(&client, 0, sizeof(client)); @@ -656,17 +671,20 @@ int dhcp_send_kernel_packet(struct dhcp_packet *dhcp_pkt, client.sin_port = htons(dest_port); client.sin_addr.s_addr = htonl(dest_ip); if (connect(fd, (struct sockaddr *) &client, sizeof(client)) < 0) { + int err = errno; close(fd); - return -errno; + return -err; } n = write(fd, dhcp_pkt, DHCP_SIZE); + if (n < 0) { + int err = errno; + close(fd); + return -err; + } close(fd); - if (n < 0) - return -errno; - return n; } @@ -681,12 +699,17 @@ int dhcp_l3_socket(int port, const char *interface, int family) if (fd < 0) return -errno; - setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); + if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) { + int err = errno; + close(fd); + return -err; + } if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, interface, strlen(interface) + 1) < 0) { + int err = errno; close(fd); - return -1; + return -err; } if (family == AF_INET) { diff --git a/gdhcp/gdhcp.h b/gdhcp/gdhcp.h index 0ed7fa54..eaf6a748 100644 --- a/gdhcp/gdhcp.h +++ b/gdhcp/gdhcp.h @@ -77,7 +77,9 @@ typedef enum { #define G_DHCP_DNS_SERVER 0x06 #define G_DHCP_DOMAIN_NAME 0x0f #define G_DHCP_HOST_NAME 0x0c +#define G_DHCP_MTU 0x1a #define G_DHCP_NTP_SERVER 0x2a +#define G_DHCP_VENDOR_CLASS_ID 0x3c #define G_DHCP_CLIENT_ID 0x3d #define G_DHCPV6_CLIENTID 1 diff --git a/gdhcp/ipv4ll.c b/gdhcp/ipv4ll.c index c43971f0..d9001987 100644 --- a/gdhcp/ipv4ll.c +++ b/gdhcp/ipv4ll.c @@ -72,7 +72,7 @@ int ipv4ll_send_arp_packet(uint8_t* source_eth, uint32_t source_ip, uint32_t ip_target; int fd, n; - fd = socket(PF_PACKET, SOCK_DGRAM | SOCK_CLOEXEC, htons(ETH_P_ARP)); + fd = socket(PF_PACKET, SOCK_DGRAM | SOCK_CLOEXEC, 0); if (fd < 0) return -errno; @@ -85,8 +85,9 @@ int ipv4ll_send_arp_packet(uint8_t* source_eth, uint32_t source_ip, dest.sll_halen = ETH_ALEN; memset(dest.sll_addr, 0xFF, ETH_ALEN); if (bind(fd, (struct sockaddr *)&dest, sizeof(dest)) < 0) { + int err = errno; close(fd); - return -errno; + return -err; } ip_source = htonl(source_ip); @@ -116,7 +117,7 @@ int ipv4ll_arp_socket(int ifindex) int fd; struct sockaddr_ll sock; - fd = socket(PF_PACKET, SOCK_DGRAM | SOCK_CLOEXEC, htons(ETH_P_ARP)); + fd = socket(PF_PACKET, SOCK_DGRAM | SOCK_CLOEXEC, 0); if (fd < 0) return fd; @@ -127,8 +128,9 @@ int ipv4ll_arp_socket(int ifindex) sock.sll_ifindex = ifindex; if (bind(fd, (struct sockaddr *) &sock, sizeof(sock)) != 0) { + int err = errno; close(fd); - return -errno; + return -err; } return fd; diff --git a/gdhcp/server.c b/gdhcp/server.c index 8574c24c..f7795f7e 100644 --- a/gdhcp/server.c +++ b/gdhcp/server.c @@ -214,9 +214,6 @@ static struct dhcp_lease *add_lease(GDHCPServer *dhcp_server, uint32_t expire, g_hash_table_insert(dhcp_server->nip_lease_hash, GINT_TO_POINTER((int) lease->lease_nip), lease); - if (dhcp_server->lease_added_cb) - dhcp_server->lease_added_cb(lease->lease_mac, yiaddr); - return lease; } @@ -616,6 +613,9 @@ static void send_ACK(GDHCPServer *dhcp_server, send_packet_to_client(dhcp_server, &packet); add_lease(dhcp_server, 0, packet.chaddr, packet.yiaddr); + + if (dhcp_server->lease_added_cb) + dhcp_server->lease_added_cb(packet.chaddr, packet.yiaddr); } static void send_NAK(GDHCPServer *dhcp_server, |