mirror of https://github.com/ARMmbed/mbed-os.git
Merge pull request #7119 from kjbracey-arm/nsapi-ip6string
NSAPI: Use IPv6 conversion routines from frameworkspull/6962/head
commit
0eac433a66
|
@ -18,6 +18,7 @@
|
|||
#include "NetworkInterface.h"
|
||||
#include "NetworkStack.h"
|
||||
#include <string.h>
|
||||
#include "ip6string.h"
|
||||
#include "mbed.h"
|
||||
|
||||
|
||||
|
@ -86,59 +87,9 @@ static void ipv4_from_address(uint8_t *bytes, const char *addr)
|
|||
}
|
||||
}
|
||||
|
||||
static int ipv6_scan_chunk(uint16_t *shorts, const char *chunk) {
|
||||
int count = 0;
|
||||
int i = 0;
|
||||
|
||||
for (; count < NSAPI_IPv6_BYTES/2; count++) {
|
||||
unsigned short s;
|
||||
int scanned = sscanf(&chunk[i], "%hx", &s);
|
||||
if (scanned < 1) {
|
||||
return count;
|
||||
}
|
||||
|
||||
shorts[count] = s;
|
||||
|
||||
for (; chunk[i] != ':'; i++) {
|
||||
if (!chunk[i]) {
|
||||
return count+1;
|
||||
}
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static void ipv6_from_address(uint8_t *bytes, const char *addr)
|
||||
{
|
||||
// Start with zeroed address
|
||||
uint16_t shorts[NSAPI_IPv6_BYTES/2];
|
||||
int suffix = 0;
|
||||
|
||||
// Find double colons and scan suffix
|
||||
for (int i = 0; addr[i]; i++) {
|
||||
if (addr[i] == ':' && addr[i+1] == ':') {
|
||||
suffix = ipv6_scan_chunk(shorts, &addr[i+2]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Move suffix to end
|
||||
memmove(&shorts[NSAPI_IPv6_BYTES/2-suffix], &shorts[0],
|
||||
suffix*sizeof(uint16_t));
|
||||
memset(&shorts[0], 0,
|
||||
(NSAPI_IPv6_BYTES/2-suffix)*sizeof(uint16_t));
|
||||
|
||||
// Scan prefix
|
||||
ipv6_scan_chunk(shorts, &addr[0]);
|
||||
|
||||
// Flip bytes
|
||||
for (int i = 0; i < NSAPI_IPv6_BYTES/2; i++) {
|
||||
bytes[2*i+0] = (uint8_t)(shorts[i] >> 8);
|
||||
bytes[2*i+1] = (uint8_t)(shorts[i] >> 0);
|
||||
}
|
||||
stoip6(addr, strlen(addr), bytes);
|
||||
}
|
||||
|
||||
static void ipv4_to_address(char *addr, const uint8_t *bytes)
|
||||
|
@ -148,11 +99,7 @@ static void ipv4_to_address(char *addr, const uint8_t *bytes)
|
|||
|
||||
static void ipv6_to_address(char *addr, const uint8_t *bytes)
|
||||
{
|
||||
for (int i = 0; i < NSAPI_IPv6_BYTES/2; i++) {
|
||||
sprintf(&addr[5*i], "%02x%02x", bytes[2*i], bytes[2*i+1]);
|
||||
addr[5*i+4] = ':';
|
||||
}
|
||||
addr[NSAPI_IPv6_SIZE-1] = '\0';
|
||||
ip6tos(bytes, addr);
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue