The code from https://github.com/vpcola/Nucleo

Committer:
sinrab
Date:
Wed Oct 08 11:00:24 2014 +0000
Revision:
0:5464d5e415e5
The code from https://github.com/vpcola/Nucleo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sinrab 0:5464d5e415e5 1 /* Copyright (C) 2013 mbed.org, MIT License
sinrab 0:5464d5e415e5 2 *
sinrab 0:5464d5e415e5 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
sinrab 0:5464d5e415e5 4 * and associated documentation files (the "Software"), to deal in the Software without restriction,
sinrab 0:5464d5e415e5 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
sinrab 0:5464d5e415e5 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
sinrab 0:5464d5e415e5 7 * furnished to do so, subject to the following conditions:
sinrab 0:5464d5e415e5 8 *
sinrab 0:5464d5e415e5 9 * The above copyright notice and this permission notice shall be included in all copies or
sinrab 0:5464d5e415e5 10 * substantial portions of the Software.
sinrab 0:5464d5e415e5 11 *
sinrab 0:5464d5e415e5 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
sinrab 0:5464d5e415e5 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
sinrab 0:5464d5e415e5 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
sinrab 0:5464d5e415e5 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
sinrab 0:5464d5e415e5 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
sinrab 0:5464d5e415e5 17 */
sinrab 0:5464d5e415e5 18 #include "Socket/Socket.h"
sinrab 0:5464d5e415e5 19 #include "Socket/Endpoint.h"
sinrab 0:5464d5e415e5 20 #include "Helper/def.h"
sinrab 0:5464d5e415e5 21 #include <cstring>
sinrab 0:5464d5e415e5 22
sinrab 0:5464d5e415e5 23 #include "cc3000.h"
sinrab 0:5464d5e415e5 24
sinrab 0:5464d5e415e5 25 /* Copied from lwip */
sinrab 0:5464d5e415e5 26 static char *cc3000_inet_ntoa_r(const in_addr addr, char *buf, int buflen)
sinrab 0:5464d5e415e5 27 {
sinrab 0:5464d5e415e5 28 uint32_t s_addr;
sinrab 0:5464d5e415e5 29 char inv[3];
sinrab 0:5464d5e415e5 30 char *rp;
sinrab 0:5464d5e415e5 31 uint8_t *ap;
sinrab 0:5464d5e415e5 32 uint8_t rem;
sinrab 0:5464d5e415e5 33 uint8_t n;
sinrab 0:5464d5e415e5 34 uint8_t i;
sinrab 0:5464d5e415e5 35 int len = 0;
sinrab 0:5464d5e415e5 36
sinrab 0:5464d5e415e5 37 s_addr = addr.s_addr;
sinrab 0:5464d5e415e5 38
sinrab 0:5464d5e415e5 39 rp = buf;
sinrab 0:5464d5e415e5 40 ap = (uint8_t *)&s_addr;
sinrab 0:5464d5e415e5 41 for(n = 0; n < 4; n++) {
sinrab 0:5464d5e415e5 42 i = 0;
sinrab 0:5464d5e415e5 43 do {
sinrab 0:5464d5e415e5 44 rem = *ap % (uint8_t)10;
sinrab 0:5464d5e415e5 45 *ap /= (uint8_t)10;
sinrab 0:5464d5e415e5 46 inv[i++] = '0' + rem;
sinrab 0:5464d5e415e5 47 } while(*ap);
sinrab 0:5464d5e415e5 48 while(i--) {
sinrab 0:5464d5e415e5 49 if (len++ >= buflen) {
sinrab 0:5464d5e415e5 50 return NULL;
sinrab 0:5464d5e415e5 51 }
sinrab 0:5464d5e415e5 52 *rp++ = inv[i];
sinrab 0:5464d5e415e5 53 }
sinrab 0:5464d5e415e5 54 if (len++ >= buflen) {
sinrab 0:5464d5e415e5 55 return NULL;
sinrab 0:5464d5e415e5 56 }
sinrab 0:5464d5e415e5 57 *rp++ = '.';
sinrab 0:5464d5e415e5 58 ap++;
sinrab 0:5464d5e415e5 59 }
sinrab 0:5464d5e415e5 60 *--rp = 0;
sinrab 0:5464d5e415e5 61 return buf;
sinrab 0:5464d5e415e5 62 }
sinrab 0:5464d5e415e5 63
sinrab 0:5464d5e415e5 64 Endpoint::Endpoint() {
sinrab 0:5464d5e415e5 65 _cc3000_module = cc3000::get_instance();
sinrab 0:5464d5e415e5 66 if (_cc3000_module == NULL) {
sinrab 0:5464d5e415e5 67 error("Endpoint constructor error: no cc3000 instance available!\r\n");
sinrab 0:5464d5e415e5 68 }
sinrab 0:5464d5e415e5 69 reset_address();
sinrab 0:5464d5e415e5 70 }
sinrab 0:5464d5e415e5 71 Endpoint::~Endpoint() {}
sinrab 0:5464d5e415e5 72
sinrab 0:5464d5e415e5 73 void Endpoint::reset_address(void) {
sinrab 0:5464d5e415e5 74 _ipAddress[0] = '\0';
sinrab 0:5464d5e415e5 75 std::memset(&_remote_host, 0, sizeof(sockaddr_in));
sinrab 0:5464d5e415e5 76 }
sinrab 0:5464d5e415e5 77
sinrab 0:5464d5e415e5 78 int Endpoint::set_address(const char* host, const int port) {
sinrab 0:5464d5e415e5 79 reset_address();
sinrab 0:5464d5e415e5 80
sinrab 0:5464d5e415e5 81 char address[5];
sinrab 0:5464d5e415e5 82 char *p_address = address;
sinrab 0:5464d5e415e5 83
sinrab 0:5464d5e415e5 84 signed int add[5];
sinrab 0:5464d5e415e5 85
sinrab 0:5464d5e415e5 86 // Dot-decimal notation
sinrab 0:5464d5e415e5 87 int result = std::sscanf(host, "%3u.%3u.%3u.%3u", &add[0], &add[1], &add[2], &add[3]);
sinrab 0:5464d5e415e5 88 for (int i=0;i<4;i++) {
sinrab 0:5464d5e415e5 89 address[i] = add[i];
sinrab 0:5464d5e415e5 90 }
sinrab 0:5464d5e415e5 91 std::memset(_ipAddress,0,sizeof(_ipAddress));
sinrab 0:5464d5e415e5 92
sinrab 0:5464d5e415e5 93 if (result != 4) {
sinrab 0:5464d5e415e5 94 #ifndef CC3000_TINY_DRIVER
sinrab 0:5464d5e415e5 95 //Resolve DNS address or populate hard-coded IP address
sinrab 0:5464d5e415e5 96 uint32_t address_integer;
sinrab 0:5464d5e415e5 97 int resolveRetCode;
sinrab 0:5464d5e415e5 98 resolveRetCode = _cc3000_module->_socket.gethostbyname((uint8_t *)host, strlen(host) , &address_integer);
sinrab 0:5464d5e415e5 99
sinrab 0:5464d5e415e5 100 if ((resolveRetCode > -1) && (0 != address_integer)) {
sinrab 0:5464d5e415e5 101 _remote_host.sin_addr.s_addr = htonl(address_integer);
sinrab 0:5464d5e415e5 102 cc3000_inet_ntoa_r(_remote_host.sin_addr, _ipAddress, sizeof(_ipAddress));
sinrab 0:5464d5e415e5 103 } else {
sinrab 0:5464d5e415e5 104 // Failed to resolve the address
sinrab 0:5464d5e415e5 105 DBG_SOCKET("Failed to resolve the hostname : %s",host);
sinrab 0:5464d5e415e5 106 return (-1);
sinrab 0:5464d5e415e5 107 }
sinrab 0:5464d5e415e5 108 #else
sinrab 0:5464d5e415e5 109 return -1;
sinrab 0:5464d5e415e5 110 #endif
sinrab 0:5464d5e415e5 111 } else {
sinrab 0:5464d5e415e5 112 std::memcpy((char*)&_remote_host.sin_addr.s_addr, p_address, 4);
sinrab 0:5464d5e415e5 113 }
sinrab 0:5464d5e415e5 114
sinrab 0:5464d5e415e5 115 _remote_host.sin_family = AF_INET;
sinrab 0:5464d5e415e5 116 _remote_host.sin_port = htons(port);
sinrab 0:5464d5e415e5 117
sinrab 0:5464d5e415e5 118 DBG_SOCKET("remote host address (string): %s",get_address());
sinrab 0:5464d5e415e5 119 DBG_SOCKET("remote host address from s_addr : %d.%d.%d.%d",
sinrab 0:5464d5e415e5 120 int(_remote_host.sin_addr.s_addr & 0xFF),
sinrab 0:5464d5e415e5 121 int((_remote_host.sin_addr.s_addr & 0xFF00) >> 8),
sinrab 0:5464d5e415e5 122 int((_remote_host.sin_addr.s_addr & 0xFF0000) >> 16),
sinrab 0:5464d5e415e5 123 int((_remote_host.sin_addr.s_addr & 0xFF000000) >> 24));
sinrab 0:5464d5e415e5 124 DBG_SOCKET("port: %d", port);
sinrab 0:5464d5e415e5 125
sinrab 0:5464d5e415e5 126 return 0;
sinrab 0:5464d5e415e5 127 }
sinrab 0:5464d5e415e5 128
sinrab 0:5464d5e415e5 129 char* Endpoint::get_address() {
sinrab 0:5464d5e415e5 130 if ((_ipAddress[0] == '\0') && (_remote_host.sin_addr.s_addr != 0))
sinrab 0:5464d5e415e5 131 cc3000_inet_ntoa_r(_remote_host.sin_addr, _ipAddress, sizeof(_ipAddress));
sinrab 0:5464d5e415e5 132 return _ipAddress;
sinrab 0:5464d5e415e5 133 }
sinrab 0:5464d5e415e5 134
sinrab 0:5464d5e415e5 135
sinrab 0:5464d5e415e5 136 int Endpoint::get_port() {
sinrab 0:5464d5e415e5 137 return ntohs(_remote_host.sin_port);
sinrab 0:5464d5e415e5 138 }
sinrab 0:5464d5e415e5 139