Skip to content

Commit

Permalink
Merge pull request ARMmbed#1866 from ARMmbed/dhcp_relay_fix
Browse files Browse the repository at this point in the history
Fixed DHCP relay bugs
  • Loading branch information
Juha Heiskanen authored Oct 17, 2018
2 parents 9aa6a95 + 16359eb commit 3389b46
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 12 deletions.
10 changes: 5 additions & 5 deletions source/6LoWPAN/Thread/thread_management_if.c
Original file line number Diff line number Diff line change
Expand Up @@ -606,7 +606,7 @@ int thread_management_get_ml_prefix_112(int8_t interface_id, uint8_t *prefix_ptr
*/
int thread_dhcpv6_server_add(int8_t interface_id, uint8_t *prefix_ptr, uint32_t max_client_cnt, bool stableData)
{
#ifdef HAVE_DHCPV6_SERVER
#if defined(HAVE_THREAD) && defined(HAVE_DHCPV6_SERVER)
protocol_interface_info_entry_t *cur;
thread_prefix_tlv_t prefixTlv;
thread_border_router_tlv_entry_t service;
Expand Down Expand Up @@ -665,7 +665,7 @@ int thread_dhcpv6_server_add(int8_t interface_id, uint8_t *prefix_ptr, uint32_t

int thread_dhcpv6_server_set_lifetime(int8_t interface_id, uint8_t *prefix_ptr, uint32_t valid_lifetime)
{
#ifdef HAVE_DHCPV6_SERVER
#if defined(HAVE_THREAD) && defined(HAVE_DHCPV6_SERVER)
if (!prefix_ptr) {
return -1;
}
Expand All @@ -681,7 +681,7 @@ int thread_dhcpv6_server_set_lifetime(int8_t interface_id, uint8_t *prefix_ptr,

int thread_dhcpv6_server_set_max_client(int8_t interface_id, uint8_t *prefix_ptr, uint32_t max_client_count)
{
#ifdef HAVE_DHCPV6_SERVER
#if defined(HAVE_THREAD) && defined(HAVE_DHCPV6_SERVER)
if (!prefix_ptr) {
return -1;
}
Expand All @@ -697,7 +697,7 @@ int thread_dhcpv6_server_set_max_client(int8_t interface_id, uint8_t *prefix_ptr

int thread_dhcpv6_server_set_anonymous_addressing(int8_t interface_id, uint8_t *prefix_ptr, bool anonymous)
{
#ifdef HAVE_DHCPV6_SERVER
#if defined(HAVE_THREAD) && defined(HAVE_DHCPV6_SERVER)
if (!prefix_ptr) {
return -1;
}
Expand All @@ -715,7 +715,7 @@ int thread_dhcpv6_server_set_anonymous_addressing(int8_t interface_id, uint8_t *

int thread_dhcpv6_server_delete(int8_t interface_id, uint8_t *prefix_ptr)
{
#ifdef HAVE_DHCPV6_SERVER
#if defined(HAVE_THREAD) && defined(HAVE_DHCPV6_SERVER)
uint8_t temp[16];
protocol_interface_info_entry_t *cur;
thread_prefix_tlv_t prefixTlv;
Expand Down
5 changes: 3 additions & 2 deletions source/DHCPv6_client/dhcpv6_client_service.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
#include "ns_list.h"
#include "common_functions.h"


#ifdef HAVE_DHCPV6
#include "dhcp_service_api.h"
#include "dhcpv6_client_api.h"
#include "libDHCPv6/libDHCPv6.h"
Expand Down Expand Up @@ -144,7 +144,6 @@ int dhcp_solicit_resp_cb(uint16_t instance_id, void *ptr, uint8_t msg_name, uin
srv_data_ptr->iaNontemporalAddress.validLifetime = dhcp_ia_non_temporal_params.validLifeTime;
memcpy(srv_data_ptr->serverLinkId, serverId.linkID, 8);
srv_data_ptr->serverLinkType = serverId.linkType;
srv_data_ptr->serverLinkType = serverId.linkType;
srv_data_ptr->T0 = dhcp_ia_non_temporal_params.T0;
srv_data_ptr->T1 = dhcp_ia_non_temporal_params.T1;
srv_data_ptr->iaNonTemporalStructValid = true;
Expand Down Expand Up @@ -335,3 +334,5 @@ void dhcpv6_client_set_address(int8_t interface_id, dhcpv6_client_server_data_t
address_entry->state_timer = renewTimer;
address_entry->cb = dhcpv6_renew;
}

#endif
9 changes: 5 additions & 4 deletions source/libDHCPv6/dhcp_service_api.c
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,7 @@ void recv_dhcp_server_msg(void *cb_res)
memcpy(msg_tr_ptr->addr.address,relay_msg.peer_address , 16);
msg_ptr = relay_msg.relay_options.msg_ptr;
msg_len = relay_msg.relay_options.len;
msg_type = *msg_ptr;


} else if (msg_type == DHCPV6_RELAY_REPLY) {
Expand Down Expand Up @@ -383,7 +384,7 @@ void recv_dhcp_relay_msg(void *cb_res)
msg_iov[0].iov_len = 34;
msg_iov[1].iov_base = ns_dyn_mem_temporary_alloc(sckt_data->d_len);
msg_iov[1].iov_len = sckt_data->d_len;
if (msg_iov[2].iov_base == NULL ) {
if (msg_iov[1].iov_base == NULL ) {
// read actual message
tr_error("Out of resources");
goto cleanup;
Expand Down Expand Up @@ -426,7 +427,7 @@ void recv_dhcp_relay_msg(void *cb_res)
//Copy DST address
memcpy(src_address.address, relay_msg.peer_address, 16);
src_address.type = ADDRESS_IPV6;
src_address.identifier = DHCPV6_SERVER_PORT;
src_address.identifier = DHCPV6_CLIENT_PORT;
msghdr.msg_iov = &msg_iov[0];
msghdr.msg_iovlen = 1;
msg_iov[0].iov_base = relay_msg.relay_options.msg_ptr;
Expand Down Expand Up @@ -545,7 +546,7 @@ uint16_t dhcp_service_init(int8_t interface_id, dhcp_instance_type_e instance_ty
if (dhcp_service->dhcp_server_socket >= 0) {
tr_error("dhcp Relay agent can't open because server open already");
}
dhcp_service->dhcp_relay_socket = socket_open(SOCKET_UDP, DHCPV6_SERVER_PORT, recv_dhcp_server_msg);
dhcp_service->dhcp_relay_socket = socket_open(SOCKET_UDP, DHCPV6_SERVER_PORT, recv_dhcp_relay_msg);
}

if (instance_type == DHCP_INSTANCE_CLIENT && dhcp_service->dhcp_client_socket < 0) {
Expand Down Expand Up @@ -654,7 +655,7 @@ void dhcp_service_delete(uint16_t instance)
}
}

if ((server_instances == 0 || relay_instances == 0) && dhcp_service->dhcp_server_socket > -1) {
if ((server_instances == 0 && relay_instances == 0) && dhcp_service->dhcp_server_socket > -1) {
socket_close(dhcp_service->dhcp_server_socket);
dhcp_service->dhcp_server_socket = -1;
}
Expand Down
2 changes: 1 addition & 1 deletion source/libDHCPv6/libDHCPv6.c
Original file line number Diff line number Diff line change
Expand Up @@ -826,7 +826,7 @@ bool libdhcpv6_relay_msg_read(uint8_t *ptr, uint16_t length, dhcpv6_relay_msg_t
relay_msg->peer_address = ptr + 16;
ptr += 32;
//Discover
if (libdhcpv6_message_option_discover(ptr, length - 34, DHCPV6_OPTION_RELAY, &relay_msg->relay_options) <= 0) {
if (libdhcpv6_message_option_discover(ptr, length - 34, DHCPV6_OPTION_RELAY, &relay_msg->relay_options) != 0) {
return false;
}

Expand Down

0 comments on commit 3389b46

Please sign in to comment.