Skip to content

Commit 53b3131

Browse files
authored
Merge pull request #3165 from kjbracey-arm/ns_ipv6_checks
Add address type checks to NanostackInterface
2 parents ee992b0 + 2135c8f commit 53b3131

File tree

1 file changed

+22
-7
lines changed

1 file changed

+22
-7
lines changed

features/nanostack/FEATURE_NANOSTACK/nanostack-interface/NanostackInterface.cpp

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
#include "mesh_system.h" // from inside mbed-mesh-api
2929
#include "socket_api.h"
3030
#include "net_interface.h"
31-
#include "ip6string.h"
3231
// Uncomment to enable trace
3332
//#define HAVE_DEBUG
3433
#include "ns_trace.h"
@@ -126,16 +125,13 @@ static void convert_mbed_addr_to_ns(ns_address_t *ns_addr,
126125
{
127126
ns_addr->type = ADDRESS_IPV6;
128127
ns_addr->identifier = s_addr->get_port();
129-
const char *str = s_addr->get_ip_address();
130-
stoip6(str, strlen(str), ns_addr->address);
128+
memcpy(ns_addr->address, s_addr->get_ip_bytes(), 16);
131129
}
132130

133131
static void convert_ns_addr_to_mbed(SocketAddress *s_addr, const ns_address_t *ns_addr)
134132
{
135-
char str[40];
136-
ip6tos(ns_addr->address, str);
137133
s_addr->set_port(ns_addr->identifier);
138-
s_addr->set_ip_address(str);
134+
s_addr->set_ip_bytes(ns_addr->address, NSAPI_IPv6);
139135
}
140136

141137
void* NanostackSocket::operator new(std::size_t sz) {
@@ -716,6 +712,10 @@ int NanostackInterface::socket_sendto(void *handle, const SocketAddress &address
716712
return NSAPI_ERROR_NO_SOCKET;
717713
}
718714

715+
if (address.get_ip_version() != NSAPI_IPv6) {
716+
return NSAPI_ERROR_UNSUPPORTED;
717+
}
718+
719719
nanostack_lock();
720720

721721
int ret;
@@ -805,12 +805,23 @@ int NanostackInterface::socket_bind(void *handle, const SocketAddress &address)
805805
return NSAPI_ERROR_NO_SOCKET;
806806
}
807807

808+
const void *addr_field;
809+
switch (address.get_ip_version()) {
810+
case NSAPI_IPv6:
811+
addr_field = address.get_ip_bytes();
812+
break;
813+
case NSAPI_UNSPEC:
814+
addr_field = &ns_in6addr_any;
815+
break;
816+
default:
817+
return NSAPI_ERROR_UNSUPPORTED;
818+
}
808819

809820
nanostack_lock();
810821

811822
ns_address_t ns_address;
812823
ns_address.type = ADDRESS_IPV6;
813-
memset(ns_address.address, 0, sizeof ns_address.address);
824+
memcpy(ns_address.address, addr_field, sizeof ns_address.address);
814825
ns_address.identifier = address.get_port();
815826
int ret = NSAPI_ERROR_DEVICE_ERROR;
816827
if (0 == ::socket_bind(socket->socket_id, &ns_address)) {
@@ -849,6 +860,10 @@ int NanostackInterface::socket_connect(void *handle, const SocketAddress &addr)
849860
return NSAPI_ERROR_NO_SOCKET;
850861
}
851862

863+
if (addr.get_ip_version() != NSAPI_IPv6) {
864+
return NSAPI_ERROR_UNSUPPORTED;
865+
}
866+
852867
nanostack_lock();
853868

854869
int ret;

0 commit comments

Comments
 (0)