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 "NetworkInterface.h"
 | 
				
			||||||
#include "NetworkStack.h"
 | 
					#include "NetworkStack.h"
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include "ip6string.h"
 | 
				
			||||||
#include "mbed.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)
 | 
					static void ipv6_from_address(uint8_t *bytes, const char *addr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    // Start with zeroed address
 | 
					    stoip6(addr, strlen(addr), bytes);
 | 
				
			||||||
    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);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void ipv4_to_address(char *addr, const uint8_t *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)
 | 
					static void ipv6_to_address(char *addr, const uint8_t *bytes)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    for (int i = 0; i < NSAPI_IPv6_BYTES/2; i++) {
 | 
					    ip6tos(bytes, addr);
 | 
				
			||||||
        sprintf(&addr[5*i], "%02x%02x", bytes[2*i], bytes[2*i+1]);
 | 
					 | 
				
			||||||
        addr[5*i+4] = ':';
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    addr[NSAPI_IPv6_SIZE-1] = '\0';
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue