Free (GPLv2) TCP/IP stack developed by TASS Belgium

Dependents:   lpc1768-picotcp-demo ZeroMQ_PicoTCP_Publisher_demo TCPSocket_HelloWorld_PicoTCP Pico_TCP_UDP_Test ... more

PicoTCP. Copyright (c) 2013 TASS Belgium NV.

Released under the GNU General Public License, version 2.

Different licensing models may exist, at the sole discretion of the Copyright holders.

Official homepage: http://www.picotcp.com

Bug tracker: https://github.com/tass-belgium/picotcp/issues

Development steps:

  • initial integration with mbed RTOS
  • generic mbed Ethernet driver
  • high performance NXP LPC1768 specific Ethernet driver
  • Multi-threading support for mbed RTOS
  • Berkeley sockets and integration with the New Socket API
  • Fork of the apps running on top of the New Socket API
  • Scheduling optimizations
  • Debugging/benchmarking/testing

Demo application (measuring TCP sender performance):

Import programlpc1768-picotcp-demo

A PicoTCP demo app testing the ethernet throughput on the lpc1768 mbed board.

Committer:
tass picotcp@tass.be
Date:
Wed Apr 09 14:31:41 2014 +0200
Revision:
149:5f4cb161cec3
Parent:
137:a1c8bfa9d691
Child:
152:a3d286bf94e5
Update from git masterbranch

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tass 68:0847e35d08a6 1 /*********************************************************************
TASS Belgium NV 131:4758606c9316 2 PicoTCP. Copyright (c) 2012 TASS Belgium NV. Some rights reserved.
TASS Belgium NV 131:4758606c9316 3 See LICENSE and COPYING for usage.
tass 68:0847e35d08a6 4
TASS Belgium NV 131:4758606c9316 5 .
TASS Belgium NV 131:4758606c9316 6
TASS Belgium NV 131:4758606c9316 7 Authors: Kristof Roelants
TASS Belgium NV 131:4758606c9316 8 *********************************************************************/
tass 68:0847e35d08a6 9 #include "pico_config.h"
tass 68:0847e35d08a6 10 #include "pico_stack.h"
tass 68:0847e35d08a6 11 #include "pico_addressing.h"
tass 68:0847e35d08a6 12 #include "pico_socket.h"
tass 68:0847e35d08a6 13 #include "pico_ipv4.h"
tass picotcp@tass.be 149:5f4cb161cec3 14 #include "pico_ipv6.h"
tass 68:0847e35d08a6 15 #include "pico_dns_client.h"
tass 68:0847e35d08a6 16 #include "pico_tree.h"
tass 68:0847e35d08a6 17
tass 68:0847e35d08a6 18 #ifdef PICO_SUPPORT_DNS_CLIENT
tass 68:0847e35d08a6 19
TASS Belgium NV 131:4758606c9316 20 #define dns_dbg(...) do {} while(0)
TASS Belgium NV 131:4758606c9316 21 /* #define dns_dbg dbg */
tass 68:0847e35d08a6 22
tass 68:0847e35d08a6 23 /* DNS response length */
tass 68:0847e35d08a6 24 #define PICO_DNS_MAX_RESPONSE_LEN 256
tass 68:0847e35d08a6 25
tass 68:0847e35d08a6 26 /* DNS client retransmission time (msec) + frequency */
tass 68:0847e35d08a6 27 #define PICO_DNS_CLIENT_RETRANS 4000
tass 68:0847e35d08a6 28 #define PICO_DNS_CLIENT_MAX_RETRANS 3
tass 68:0847e35d08a6 29
tass 68:0847e35d08a6 30 /* Default nameservers + port */
tass picotcp@tass.be 149:5f4cb161cec3 31 #define PICO_DNS_NS_DEFAULT "208.67.222.222"
tass 68:0847e35d08a6 32 #define PICO_DNS_NS_PORT 53
tass 68:0847e35d08a6 33
tass 68:0847e35d08a6 34 /* FLAG values */
tass 68:0847e35d08a6 35 #define PICO_DNS_QR_QUERY 0
tass 68:0847e35d08a6 36 #define PICO_DNS_QR_RESPONSE 1
tass 68:0847e35d08a6 37 #define PICO_DNS_OPCODE_QUERY 0
tass 68:0847e35d08a6 38 #define PICO_DNS_OPCODE_IQUERY 1
tass 68:0847e35d08a6 39 #define PICO_DNS_OPCODE_STATUS 2
tass 68:0847e35d08a6 40 #define PICO_DNS_AA_NO_AUTHORITY 0
tass 68:0847e35d08a6 41 #define PICO_DNS_AA_IS_AUTHORITY 1
tass 68:0847e35d08a6 42 #define PICO_DNS_TC_NO_TRUNCATION 0
tass 68:0847e35d08a6 43 #define PICO_DNS_TC_IS_TRUNCATED 1
tass 68:0847e35d08a6 44 #define PICO_DNS_RD_NO_DESIRE 0
tass 68:0847e35d08a6 45 #define PICO_DNS_RD_IS_DESIRED 1
tass 68:0847e35d08a6 46 #define PICO_DNS_RA_NO_SUPPORT 0
tass 68:0847e35d08a6 47 #define PICO_DNS_RA_IS_SUPPORTED 1
tass 68:0847e35d08a6 48 #define PICO_DNS_RCODE_NO_ERROR 0
tass 68:0847e35d08a6 49 #define PICO_DNS_RCODE_EFORMAT 1
tass 68:0847e35d08a6 50 #define PICO_DNS_RCODE_ESERVER 2
tass 68:0847e35d08a6 51 #define PICO_DNS_RCODE_ENAME 3
tass 68:0847e35d08a6 52 #define PICO_DNS_RCODE_ENOIMP 4
tass 68:0847e35d08a6 53 #define PICO_DNS_RCODE_EREFUSED 5
tass 68:0847e35d08a6 54
tass 68:0847e35d08a6 55 /* QTYPE values */
tass 68:0847e35d08a6 56 #define PICO_DNS_TYPE_A 1
tass picotcp@tass.be 149:5f4cb161cec3 57 #define PICO_DNS_TYPE_AAAA 28
tass 68:0847e35d08a6 58 #define PICO_DNS_TYPE_PTR 12
tass 68:0847e35d08a6 59
tass 68:0847e35d08a6 60 /* QCLASS values */
tass 68:0847e35d08a6 61 #define PICO_DNS_CLASS_IN 1
tass 68:0847e35d08a6 62
tass 68:0847e35d08a6 63 /* Compression values */
tass 68:0847e35d08a6 64 #define PICO_DNS_LABEL 0
tass 68:0847e35d08a6 65 #define PICO_DNS_POINTER 3
tass 68:0847e35d08a6 66
tass 68:0847e35d08a6 67 /* Label len */
tass 70:cd218dd180e5 68 #define PICO_DNS_LABEL_INITIAL 1u
tass 68:0847e35d08a6 69 #define PICO_DNS_LABEL_ROOT 1
tass 68:0847e35d08a6 70
tass 68:0847e35d08a6 71 /* TTL values */
tass 68:0847e35d08a6 72 #define PICO_DNS_MAX_TTL 604800 /* one week */
tass 68:0847e35d08a6 73
tass 68:0847e35d08a6 74 /* Len of an IPv4 address string */
tass 68:0847e35d08a6 75 #define PICO_DNS_IPV4_ADDR_LEN 16
tass picotcp@tass.be 149:5f4cb161cec3 76 #define PICO_DNS_IPV6_ADDR_LEN 54
tass 68:0847e35d08a6 77
tass 68:0847e35d08a6 78 static void pico_dns_client_callback(uint16_t ev, struct pico_socket *s);
tass 128:ae39e6e81531 79 static void pico_dns_client_retransmission(pico_time now, void *arg);
tass 68:0847e35d08a6 80
tass 68:0847e35d08a6 81 /* RFC 1035 section 4. MESSAGES */
tass picotcp@tass.be 149:5f4cb161cec3 82 PACKED_STRUCT_DEF pico_dns_name
tass 68:0847e35d08a6 83 {
tass picotcp@tass.be 149:5f4cb161cec3 84 char name[1];
tass 68:0847e35d08a6 85 };
tass 68:0847e35d08a6 86
tass 68:0847e35d08a6 87 /* prefix = header + name pointer
tass 68:0847e35d08a6 88 * flags splitted in 2x uint8 due to endianness */
tass picotcp@tass.be 149:5f4cb161cec3 89 PACKED_STRUCT_DEF pico_dns_prefix
tass 68:0847e35d08a6 90 {
TASS Belgium NV 131:4758606c9316 91 uint16_t id;
TASS Belgium NV 131:4758606c9316 92 uint8_t rd : 1; /* recursion desired */
TASS Belgium NV 131:4758606c9316 93 uint8_t tc : 1; /* truncation */
TASS Belgium NV 131:4758606c9316 94 uint8_t aa : 1; /* authoritative answer */
TASS Belgium NV 131:4758606c9316 95 uint8_t opcode : 4; /* opcode */
TASS Belgium NV 131:4758606c9316 96 uint8_t qr : 1; /* query */
TASS Belgium NV 131:4758606c9316 97 uint8_t rcode : 4; /* response code */
TASS Belgium NV 131:4758606c9316 98 uint8_t z : 3; /* zero */
TASS Belgium NV 131:4758606c9316 99 uint8_t ra : 1; /* recursion available */
TASS Belgium NV 131:4758606c9316 100 uint16_t qdcount;
TASS Belgium NV 131:4758606c9316 101 uint16_t ancount;
TASS Belgium NV 131:4758606c9316 102 uint16_t nscount;
TASS Belgium NV 131:4758606c9316 103 uint16_t arcount;
TASS Belgium NV 131:4758606c9316 104 struct pico_dns_name domain;
tass 68:0847e35d08a6 105 };
tass 68:0847e35d08a6 106
tass picotcp@tass.be 149:5f4cb161cec3 107 PACKED_STRUCT_DEF pico_dns_query_suffix
tass 68:0847e35d08a6 108 {
TASS Belgium NV 131:4758606c9316 109 uint16_t qtype;
TASS Belgium NV 131:4758606c9316 110 uint16_t qclass;
tass 68:0847e35d08a6 111 };
tass 68:0847e35d08a6 112
tass picotcp@tass.be 149:5f4cb161cec3 113 PACKED_STRUCT_DEF pico_dns_answer_suffix
tass 68:0847e35d08a6 114 {
TASS Belgium NV 131:4758606c9316 115 uint16_t qtype;
TASS Belgium NV 131:4758606c9316 116 uint16_t qclass;
TASS Belgium NV 131:4758606c9316 117 uint32_t ttl;
TASS Belgium NV 131:4758606c9316 118 uint16_t rdlength;
TASS Belgium NV 131:4758606c9316 119 uint8_t rdata[];
tass 68:0847e35d08a6 120 };
tass 68:0847e35d08a6 121
tass 68:0847e35d08a6 122 struct pico_dns_ns
tass 68:0847e35d08a6 123 {
TASS Belgium NV 131:4758606c9316 124 struct pico_ip4 ns; /* nameserver */
tass 68:0847e35d08a6 125 };
tass 68:0847e35d08a6 126
tass 68:0847e35d08a6 127 static int dns_ns_cmp(void *ka, void *kb)
tass 68:0847e35d08a6 128 {
TASS Belgium NV 131:4758606c9316 129 struct pico_dns_ns *a = ka, *b = kb;
TASS Belgium NV 131:4758606c9316 130 if (a->ns.addr == b->ns.addr)
TASS Belgium NV 131:4758606c9316 131 return 0;
TASS Belgium NV 131:4758606c9316 132
tass picotcp@tass.be 149:5f4cb161cec3 133 return (a->ns.addr < b->ns.addr) ? (-1) : (1);
TASS Belgium NV 131:4758606c9316 134 }
tass 68:0847e35d08a6 135 PICO_TREE_DECLARE(NSTable, dns_ns_cmp);
TASS Belgium NV 131:4758606c9316 136
tass 68:0847e35d08a6 137 struct pico_dns_query
tass 68:0847e35d08a6 138 {
TASS Belgium NV 131:4758606c9316 139 char *query;
TASS Belgium NV 131:4758606c9316 140 uint16_t len;
TASS Belgium NV 131:4758606c9316 141 uint16_t id;
TASS Belgium NV 131:4758606c9316 142 uint16_t qtype;
TASS Belgium NV 131:4758606c9316 143 uint16_t qclass;
TASS Belgium NV 131:4758606c9316 144 uint8_t retrans;
TASS Belgium NV 131:4758606c9316 145 struct pico_dns_ns q_ns;
TASS Belgium NV 131:4758606c9316 146 struct pico_socket *s;
TASS Belgium NV 131:4758606c9316 147 void (*callback)(char *, void *);
TASS Belgium NV 131:4758606c9316 148 void *arg;
tass 68:0847e35d08a6 149 };
tass 68:0847e35d08a6 150
tass 68:0847e35d08a6 151 static int dns_query_cmp(void *ka, void *kb)
tass 68:0847e35d08a6 152 {
TASS Belgium NV 131:4758606c9316 153 struct pico_dns_query *a = ka, *b = kb;
TASS Belgium NV 131:4758606c9316 154 if (a->id == b->id)
TASS Belgium NV 131:4758606c9316 155 return 0;
TASS Belgium NV 131:4758606c9316 156
tass picotcp@tass.be 149:5f4cb161cec3 157 return (a->id < b->id) ? (-1) : (1);
TASS Belgium NV 131:4758606c9316 158 }
tass 68:0847e35d08a6 159 PICO_TREE_DECLARE(DNSTable, dns_query_cmp);
tass 68:0847e35d08a6 160
tass 68:0847e35d08a6 161 static int pico_dns_client_del_ns(struct pico_ip4 *ns_addr)
tass 68:0847e35d08a6 162 {
TASS Belgium NV 131:4758606c9316 163 struct pico_dns_ns test = {{0}}, *found = NULL;
tass 68:0847e35d08a6 164
TASS Belgium NV 131:4758606c9316 165 test.ns = *ns_addr;
TASS Belgium NV 131:4758606c9316 166 found = pico_tree_findKey(&NSTable, &test);
TASS Belgium NV 131:4758606c9316 167 if (!found)
TASS Belgium NV 131:4758606c9316 168 return -1;
tass 68:0847e35d08a6 169
TASS Belgium NV 131:4758606c9316 170 pico_tree_delete(&NSTable, found);
tass picotcp@tass.be 149:5f4cb161cec3 171 PICO_FREE(found);
tass 68:0847e35d08a6 172
TASS Belgium NV 131:4758606c9316 173 /* no NS left, add default NS */
TASS Belgium NV 131:4758606c9316 174 if (pico_tree_empty(&NSTable))
TASS Belgium NV 131:4758606c9316 175 pico_dns_client_init();
tass 68:0847e35d08a6 176
TASS Belgium NV 131:4758606c9316 177 return 0;
tass 68:0847e35d08a6 178 }
tass 68:0847e35d08a6 179
tass 68:0847e35d08a6 180 static struct pico_dns_ns *pico_dns_client_add_ns(struct pico_ip4 *ns_addr)
tass 68:0847e35d08a6 181 {
TASS Belgium NV 131:4758606c9316 182 struct pico_dns_ns *dns = NULL, *found = NULL, test = {{0}};
TASS Belgium NV 131:4758606c9316 183
tass picotcp@tass.be 149:5f4cb161cec3 184 dns = PICO_ZALLOC(sizeof(struct pico_dns_ns));
TASS Belgium NV 131:4758606c9316 185 if (!dns) {
TASS Belgium NV 131:4758606c9316 186 pico_err = PICO_ERR_ENOMEM;
TASS Belgium NV 131:4758606c9316 187 return NULL;
TASS Belgium NV 131:4758606c9316 188 }
TASS Belgium NV 131:4758606c9316 189
TASS Belgium NV 131:4758606c9316 190 dns->ns = *ns_addr;
tass 68:0847e35d08a6 191
TASS Belgium NV 131:4758606c9316 192 found = pico_tree_insert(&NSTable, dns);
TASS Belgium NV 131:4758606c9316 193 if (found) { /* nameserver already present */
tass picotcp@tass.be 149:5f4cb161cec3 194 PICO_FREE(dns);
TASS Belgium NV 131:4758606c9316 195 return found;
TASS Belgium NV 131:4758606c9316 196 }
tass 68:0847e35d08a6 197
TASS Belgium NV 131:4758606c9316 198 /* default NS found, remove it */
tass picotcp@tass.be 149:5f4cb161cec3 199 pico_string_to_ipv4(PICO_DNS_NS_DEFAULT, (uint32_t *)&test.ns.addr);
TASS Belgium NV 131:4758606c9316 200 found = pico_tree_findKey(&NSTable, &test);
TASS Belgium NV 131:4758606c9316 201 if (found && (found->ns.addr != ns_addr->addr))
TASS Belgium NV 131:4758606c9316 202 pico_dns_client_del_ns(&found->ns);
tass 68:0847e35d08a6 203
TASS Belgium NV 131:4758606c9316 204 return dns;
tass 68:0847e35d08a6 205 }
tass 68:0847e35d08a6 206
tass 68:0847e35d08a6 207 static struct pico_dns_ns pico_dns_client_next_ns(struct pico_ip4 *ns_addr)
tass 68:0847e35d08a6 208 {
TASS Belgium NV 131:4758606c9316 209 struct pico_dns_ns dns = {{0}}, *nxtdns = NULL;
TASS Belgium NV 131:4758606c9316 210 struct pico_tree_node *node = NULL, *nxtnode = NULL;
tass 68:0847e35d08a6 211
TASS Belgium NV 131:4758606c9316 212 dns.ns = *ns_addr;
TASS Belgium NV 131:4758606c9316 213 node = pico_tree_findNode(&NSTable, &dns);
TASS Belgium NV 131:4758606c9316 214 if (!node)
TASS Belgium NV 131:4758606c9316 215 return dns; /* keep using current NS */
tass 68:0847e35d08a6 216
TASS Belgium NV 131:4758606c9316 217 nxtnode = pico_tree_next(node);
TASS Belgium NV 131:4758606c9316 218 nxtdns = nxtnode->keyValue;
TASS Belgium NV 131:4758606c9316 219 if (!nxtdns)
TASS Belgium NV 131:4758606c9316 220 nxtdns = (struct pico_dns_ns *)pico_tree_first(&NSTable);
TASS Belgium NV 131:4758606c9316 221
TASS Belgium NV 131:4758606c9316 222 return *nxtdns;
tass 68:0847e35d08a6 223 }
tass 68:0847e35d08a6 224
TASS Belgium NV 131:4758606c9316 225 static struct pico_dns_query *pico_dns_client_add_query(struct pico_dns_prefix *hdr, uint16_t len, struct pico_dns_query_suffix *suffix,
tass 68:0847e35d08a6 226 void (*callback)(char *, void *), void *arg)
tass 68:0847e35d08a6 227 {
TASS Belgium NV 131:4758606c9316 228 struct pico_dns_query *q = NULL, *found = NULL;
tass 68:0847e35d08a6 229
tass picotcp@tass.be 149:5f4cb161cec3 230 q = PICO_ZALLOC(sizeof(struct pico_dns_query));
TASS Belgium NV 131:4758606c9316 231 if (!q)
TASS Belgium NV 131:4758606c9316 232 return NULL;
tass 68:0847e35d08a6 233
TASS Belgium NV 131:4758606c9316 234 q->query = (char *)hdr;
TASS Belgium NV 131:4758606c9316 235 q->len = len;
TASS Belgium NV 131:4758606c9316 236 q->id = short_be(hdr->id);
TASS Belgium NV 131:4758606c9316 237 q->qtype = short_be(suffix->qtype);
TASS Belgium NV 131:4758606c9316 238 q->qclass = short_be(suffix->qclass);
TASS Belgium NV 131:4758606c9316 239 q->retrans = 1;
TASS Belgium NV 131:4758606c9316 240 q->q_ns = *((struct pico_dns_ns *)pico_tree_first(&NSTable));
TASS Belgium NV 131:4758606c9316 241 q->callback = callback;
TASS Belgium NV 131:4758606c9316 242 q->arg = arg;
TASS Belgium NV 131:4758606c9316 243 q->s = pico_socket_open(PICO_PROTO_IPV4, PICO_PROTO_UDP, &pico_dns_client_callback);
TASS Belgium NV 131:4758606c9316 244 if (!q->s) {
tass picotcp@tass.be 149:5f4cb161cec3 245 PICO_FREE(q);
TASS Belgium NV 131:4758606c9316 246 return NULL;
TASS Belgium NV 131:4758606c9316 247 }
tass 68:0847e35d08a6 248
TASS Belgium NV 131:4758606c9316 249 found = pico_tree_insert(&DNSTable, q);
TASS Belgium NV 131:4758606c9316 250 if (found) {
TASS Belgium NV 131:4758606c9316 251 pico_err = PICO_ERR_EAGAIN;
TASS Belgium NV 131:4758606c9316 252 pico_socket_close(q->s);
tass picotcp@tass.be 149:5f4cb161cec3 253 PICO_FREE(q);
TASS Belgium NV 131:4758606c9316 254 return NULL;
TASS Belgium NV 131:4758606c9316 255 }
tass 68:0847e35d08a6 256
TASS Belgium NV 131:4758606c9316 257 return q;
tass 68:0847e35d08a6 258 }
tass 68:0847e35d08a6 259
tass 68:0847e35d08a6 260 static int pico_dns_client_del_query(uint16_t id)
tass 68:0847e35d08a6 261 {
TASS Belgium NV 131:4758606c9316 262 struct pico_dns_query test = {
TASS Belgium NV 131:4758606c9316 263 0
TASS Belgium NV 131:4758606c9316 264 }, *found = NULL;
tass 68:0847e35d08a6 265
TASS Belgium NV 131:4758606c9316 266 test.id = id;
TASS Belgium NV 131:4758606c9316 267 found = pico_tree_findKey(&DNSTable, &test);
TASS Belgium NV 131:4758606c9316 268 if (!found)
TASS Belgium NV 131:4758606c9316 269 return -1;
tass 68:0847e35d08a6 270
tass picotcp@tass.be 149:5f4cb161cec3 271 PICO_FREE(found->query);
TASS Belgium NV 131:4758606c9316 272 pico_socket_close(found->s);
TASS Belgium NV 131:4758606c9316 273 pico_tree_delete(&DNSTable, found);
tass picotcp@tass.be 149:5f4cb161cec3 274 PICO_FREE(found);
TASS Belgium NV 131:4758606c9316 275 return 0;
tass 68:0847e35d08a6 276 }
tass 68:0847e35d08a6 277
tass 68:0847e35d08a6 278 static struct pico_dns_query *pico_dns_client_find_query(uint16_t id)
tass 68:0847e35d08a6 279 {
TASS Belgium NV 131:4758606c9316 280 struct pico_dns_query test = {
TASS Belgium NV 131:4758606c9316 281 0
TASS Belgium NV 131:4758606c9316 282 }, *found = NULL;
tass 68:0847e35d08a6 283
TASS Belgium NV 131:4758606c9316 284 test.id = id;
TASS Belgium NV 131:4758606c9316 285 found = pico_tree_findKey(&DNSTable, &test);
TASS Belgium NV 131:4758606c9316 286 if (found)
TASS Belgium NV 131:4758606c9316 287 return found;
TASS Belgium NV 131:4758606c9316 288 else
TASS Belgium NV 131:4758606c9316 289 return NULL;
tass 68:0847e35d08a6 290 }
tass 68:0847e35d08a6 291
tass 68:0847e35d08a6 292 /* determine len of string */
tass 68:0847e35d08a6 293 static uint16_t pico_dns_client_strlen(const char *url)
tass 68:0847e35d08a6 294 {
tass picotcp@tass.be 134:cc4e6d2654d9 295 uint16_t len;
tass 68:0847e35d08a6 296
tass picotcp@tass.be 136:576dcbb16922 297 if (!url)
tass picotcp@tass.be 136:576dcbb16922 298 return 0;
tass picotcp@tass.be 136:576dcbb16922 299
tass picotcp@tass.be 137:a1c8bfa9d691 300 for (len = 0; len < 0xFFFF; len++) {
tass picotcp@tass.be 134:cc4e6d2654d9 301 if (url[len] == 0)
tass picotcp@tass.be 134:cc4e6d2654d9 302 break;
TASS Belgium NV 131:4758606c9316 303 }
TASS Belgium NV 131:4758606c9316 304 return len;
tass 68:0847e35d08a6 305 }
tass 68:0847e35d08a6 306
tass 68:0847e35d08a6 307 /* seek end of string */
tass 68:0847e35d08a6 308 static char *pico_dns_client_seek(char *ptr)
tass 68:0847e35d08a6 309 {
TASS Belgium NV 131:4758606c9316 310 if (!ptr)
TASS Belgium NV 131:4758606c9316 311 return NULL;
tass 68:0847e35d08a6 312
tass picotcp@tass.be 134:cc4e6d2654d9 313 while (*ptr != 0)
tass picotcp@tass.be 134:cc4e6d2654d9 314 ptr++;
tass picotcp@tass.be 136:576dcbb16922 315 return ptr + 1;
tass 68:0847e35d08a6 316 }
tass 68:0847e35d08a6 317
tass picotcp@tass.be 149:5f4cb161cec3 318 /* mirror ip6 */
tass picotcp@tass.be 149:5f4cb161cec3 319
tass 68:0847e35d08a6 320 /* mirror ip address numbers
tass 68:0847e35d08a6 321 * f.e. 192.168.0.1 => 1.0.168.192 */
tass 70:cd218dd180e5 322 static int8_t pico_dns_client_mirror(char *ptr)
tass 68:0847e35d08a6 323 {
TASS Belgium NV 131:4758606c9316 324 const unsigned char *addr = NULL;
TASS Belgium NV 131:4758606c9316 325 char *m = ptr;
TASS Belgium NV 131:4758606c9316 326 uint32_t ip = 0;
TASS Belgium NV 131:4758606c9316 327 int8_t i = 0;
tass 68:0847e35d08a6 328
TASS Belgium NV 131:4758606c9316 329 if (pico_string_to_ipv4(ptr, &ip) < 0)
TASS Belgium NV 131:4758606c9316 330 return -1;
tass 68:0847e35d08a6 331
TASS Belgium NV 131:4758606c9316 332 ptr = m;
TASS Belgium NV 131:4758606c9316 333 addr = (unsigned char *)&ip;
TASS Belgium NV 131:4758606c9316 334 for (i = 3; i >= 0; i--) {
TASS Belgium NV 131:4758606c9316 335 if (addr[i] > 99) {
TASS Belgium NV 131:4758606c9316 336 *ptr++ = (char)('0' + (addr[i] / 100));
TASS Belgium NV 131:4758606c9316 337 *ptr++ = (char)('0' + ((addr[i] % 100) / 10));
TASS Belgium NV 131:4758606c9316 338 *ptr++ = (char)('0' + ((addr[i] % 100) % 10));
TASS Belgium NV 131:4758606c9316 339 } else if(addr[i] > 9) {
TASS Belgium NV 131:4758606c9316 340 *ptr++ = (char)('0' + (addr[i] / 10));
TASS Belgium NV 131:4758606c9316 341 *ptr++ = (char)('0' + (addr[i] % 10));
TASS Belgium NV 131:4758606c9316 342 } else {
TASS Belgium NV 131:4758606c9316 343 *ptr++ = (char)('0' + addr[i]);
TASS Belgium NV 131:4758606c9316 344 }
TASS Belgium NV 131:4758606c9316 345
TASS Belgium NV 131:4758606c9316 346 if(i > 0)
TASS Belgium NV 131:4758606c9316 347 *ptr++ = '.';
tass 68:0847e35d08a6 348 }
TASS Belgium NV 131:4758606c9316 349 *ptr = '\0';
tass 68:0847e35d08a6 350
TASS Belgium NV 131:4758606c9316 351 return 0;
tass 68:0847e35d08a6 352 }
tass 68:0847e35d08a6 353
tass 68:0847e35d08a6 354 static struct pico_dns_query *pico_dns_client_idcheck(uint16_t id)
tass 68:0847e35d08a6 355 {
TASS Belgium NV 131:4758606c9316 356 struct pico_dns_query test = {
TASS Belgium NV 131:4758606c9316 357 0
TASS Belgium NV 131:4758606c9316 358 };
tass 68:0847e35d08a6 359
TASS Belgium NV 131:4758606c9316 360 test.id = id;
TASS Belgium NV 131:4758606c9316 361 return pico_tree_findKey(&DNSTable, &test);
tass 68:0847e35d08a6 362 }
tass 68:0847e35d08a6 363
tass 68:0847e35d08a6 364 static int pico_dns_client_query_prefix(struct pico_dns_prefix *pre)
tass 68:0847e35d08a6 365 {
TASS Belgium NV 131:4758606c9316 366 uint16_t id = 0;
TASS Belgium NV 131:4758606c9316 367 uint8_t retry = 32;
tass 68:0847e35d08a6 368
TASS Belgium NV 131:4758606c9316 369 do {
TASS Belgium NV 131:4758606c9316 370 id = (uint16_t)(pico_rand() & 0xFFFFU);
TASS Belgium NV 131:4758606c9316 371 dns_dbg("DNS: generated id %u\n", id);
TASS Belgium NV 131:4758606c9316 372 } while (retry-- && pico_dns_client_idcheck(id));
TASS Belgium NV 131:4758606c9316 373 if (!retry)
TASS Belgium NV 131:4758606c9316 374 return -1;
tass 68:0847e35d08a6 375
TASS Belgium NV 131:4758606c9316 376 pre->id = short_be(id);
TASS Belgium NV 131:4758606c9316 377 pre->qr = PICO_DNS_QR_QUERY;
TASS Belgium NV 131:4758606c9316 378 pre->opcode = PICO_DNS_OPCODE_QUERY;
TASS Belgium NV 131:4758606c9316 379 pre->aa = PICO_DNS_AA_NO_AUTHORITY;
TASS Belgium NV 131:4758606c9316 380 pre->tc = PICO_DNS_TC_NO_TRUNCATION;
TASS Belgium NV 131:4758606c9316 381 pre->rd = PICO_DNS_RD_IS_DESIRED;
TASS Belgium NV 131:4758606c9316 382 pre->ra = PICO_DNS_RA_NO_SUPPORT;
TASS Belgium NV 131:4758606c9316 383 pre->z = 0;
TASS Belgium NV 131:4758606c9316 384 pre->rcode = PICO_DNS_RCODE_NO_ERROR;
TASS Belgium NV 131:4758606c9316 385 pre->qdcount = short_be(1);
TASS Belgium NV 131:4758606c9316 386 pre->ancount = short_be(0);
TASS Belgium NV 131:4758606c9316 387 pre->nscount = short_be(0);
TASS Belgium NV 131:4758606c9316 388 pre->arcount = short_be(0);
tass 68:0847e35d08a6 389
TASS Belgium NV 131:4758606c9316 390 return 0;
tass 68:0847e35d08a6 391 }
tass 68:0847e35d08a6 392
tass 68:0847e35d08a6 393 static int pico_dns_client_query_suffix(struct pico_dns_query_suffix *suf, uint16_t type, uint16_t class)
tass 68:0847e35d08a6 394 {
TASS Belgium NV 131:4758606c9316 395 suf->qtype = short_be(type);
TASS Belgium NV 131:4758606c9316 396 suf->qclass = short_be(class);
TASS Belgium NV 131:4758606c9316 397 return 0;
tass 68:0847e35d08a6 398 }
tass 68:0847e35d08a6 399
TASS Belgium NV 131:4758606c9316 400 /* replace '.' in the domain name by the label length
tass 68:0847e35d08a6 401 * f.e. www.google.be => 3www6google2be0 */
tass 68:0847e35d08a6 402 static int pico_dns_client_query_domain(char *ptr)
tass 68:0847e35d08a6 403 {
TASS Belgium NV 131:4758606c9316 404 char p = 0, *label = NULL;
TASS Belgium NV 131:4758606c9316 405 uint8_t len = 0;
tass 68:0847e35d08a6 406
TASS Belgium NV 131:4758606c9316 407 if (!ptr)
TASS Belgium NV 131:4758606c9316 408 return -1;
tass 68:0847e35d08a6 409
TASS Belgium NV 131:4758606c9316 410 label = ptr++;
TASS Belgium NV 131:4758606c9316 411 while ((p = *ptr++) != 0) {
TASS Belgium NV 131:4758606c9316 412 if (p == '.') {
TASS Belgium NV 131:4758606c9316 413 *label = (char)len;
TASS Belgium NV 131:4758606c9316 414 label = ptr - 1;
TASS Belgium NV 131:4758606c9316 415 len = 0;
TASS Belgium NV 131:4758606c9316 416 } else {
TASS Belgium NV 131:4758606c9316 417 len++;
TASS Belgium NV 131:4758606c9316 418 }
tass 68:0847e35d08a6 419 }
TASS Belgium NV 131:4758606c9316 420 *label = (char)len;
TASS Belgium NV 131:4758606c9316 421 return 0;
tass 68:0847e35d08a6 422 }
tass 68:0847e35d08a6 423
TASS Belgium NV 131:4758606c9316 424 /* replace the label length in the domain name by '.'
tass 68:0847e35d08a6 425 * f.e. 3www6google2be0 => .www.google.be */
tass 68:0847e35d08a6 426 static int pico_dns_client_answer_domain(char *ptr)
tass 68:0847e35d08a6 427 {
TASS Belgium NV 131:4758606c9316 428 char p = 0, *label = NULL;
tass 68:0847e35d08a6 429
TASS Belgium NV 131:4758606c9316 430 if (!ptr)
TASS Belgium NV 131:4758606c9316 431 return -1;
tass 68:0847e35d08a6 432
tass 68:0847e35d08a6 433 label = ptr;
TASS Belgium NV 131:4758606c9316 434 while ((p = *ptr++) != 0) {
TASS Belgium NV 131:4758606c9316 435 ptr += p;
TASS Belgium NV 131:4758606c9316 436 *label = '.';
TASS Belgium NV 131:4758606c9316 437 label = ptr;
TASS Belgium NV 131:4758606c9316 438 }
TASS Belgium NV 131:4758606c9316 439 return 0;
tass 68:0847e35d08a6 440 }
tass 68:0847e35d08a6 441
tass 68:0847e35d08a6 442 static int pico_dns_client_check_prefix(struct pico_dns_prefix *pre)
tass 68:0847e35d08a6 443 {
TASS Belgium NV 131:4758606c9316 444 if (pre->qr != PICO_DNS_QR_RESPONSE || pre->opcode != PICO_DNS_OPCODE_QUERY || pre->rcode != PICO_DNS_RCODE_NO_ERROR) {
TASS Belgium NV 131:4758606c9316 445 dns_dbg("DNS ERROR: OPCODE %d | TC %d | RCODE %d\n", pre->opcode, pre->tc, pre->rcode);
TASS Belgium NV 131:4758606c9316 446 return -1;
TASS Belgium NV 131:4758606c9316 447 }
TASS Belgium NV 131:4758606c9316 448
TASS Belgium NV 131:4758606c9316 449 if (short_be(pre->ancount) < 1) {
TASS Belgium NV 131:4758606c9316 450 dns_dbg("DNS ERROR: ancount < 1\n");
TASS Belgium NV 131:4758606c9316 451 return -1;
TASS Belgium NV 131:4758606c9316 452 }
TASS Belgium NV 131:4758606c9316 453
TASS Belgium NV 131:4758606c9316 454 return 0;
tass 68:0847e35d08a6 455 }
tass 68:0847e35d08a6 456
tass 68:0847e35d08a6 457 static int pico_dns_client_check_qsuffix(struct pico_dns_query_suffix *suf, struct pico_dns_query *q)
tass 68:0847e35d08a6 458 {
TASS Belgium NV 131:4758606c9316 459 if (short_be(suf->qtype) != q->qtype || short_be(suf->qclass) != q->qclass) {
TASS Belgium NV 131:4758606c9316 460 dns_dbg("DNS ERROR: received qtype (%u) or qclass (%u) incorrect\n", short_be(suf->qtype), short_be(suf->qclass));
TASS Belgium NV 131:4758606c9316 461 return -1;
TASS Belgium NV 131:4758606c9316 462 }
TASS Belgium NV 131:4758606c9316 463
TASS Belgium NV 131:4758606c9316 464 return 0;
tass 68:0847e35d08a6 465 }
tass 68:0847e35d08a6 466
tass 68:0847e35d08a6 467 static int pico_dns_client_check_asuffix(struct pico_dns_answer_suffix *suf, struct pico_dns_query *q)
tass 68:0847e35d08a6 468 {
tass picotcp@tass.be 149:5f4cb161cec3 469 if (!suf) {
tass picotcp@tass.be 149:5f4cb161cec3 470 pico_err = PICO_ERR_EINVAL;
tass picotcp@tass.be 149:5f4cb161cec3 471 return -1;
tass picotcp@tass.be 149:5f4cb161cec3 472 }
tass picotcp@tass.be 149:5f4cb161cec3 473
TASS Belgium NV 131:4758606c9316 474 if (short_be(suf->qtype) != q->qtype || short_be(suf->qclass) != q->qclass) {
TASS Belgium NV 131:4758606c9316 475 dns_dbg("DNS WARNING: received qtype (%u) or qclass (%u) incorrect\n", short_be(suf->qtype), short_be(suf->qclass));
TASS Belgium NV 131:4758606c9316 476 return -1;
TASS Belgium NV 131:4758606c9316 477 }
TASS Belgium NV 131:4758606c9316 478
TASS Belgium NV 131:4758606c9316 479 if (long_be(suf->ttl) > PICO_DNS_MAX_TTL) {
TASS Belgium NV 131:4758606c9316 480 dns_dbg("DNS WARNING: received TTL (%u) > MAX (%u)\n", short_be(suf->ttl), PICO_DNS_MAX_TTL);
TASS Belgium NV 131:4758606c9316 481 return -1;
TASS Belgium NV 131:4758606c9316 482 }
TASS Belgium NV 131:4758606c9316 483
TASS Belgium NV 131:4758606c9316 484 return 0;
tass 68:0847e35d08a6 485 }
tass 68:0847e35d08a6 486
tass 68:0847e35d08a6 487 static char *pico_dns_client_seek_suffix(char *suf, struct pico_dns_prefix *pre, struct pico_dns_query *q)
tass 68:0847e35d08a6 488 {
TASS Belgium NV 131:4758606c9316 489 struct pico_dns_answer_suffix *asuffix = NULL;
TASS Belgium NV 131:4758606c9316 490 uint16_t comp = 0, compression = 0;
TASS Belgium NV 131:4758606c9316 491 uint16_t i = 0;
TASS Belgium NV 131:4758606c9316 492 char *psuffix = suf;
tass picotcp@tass.be 149:5f4cb161cec3 493 if (!suf)
tass picotcp@tass.be 149:5f4cb161cec3 494 return NULL;
tass 68:0847e35d08a6 495
TASS Belgium NV 131:4758606c9316 496 while (i++ < short_be(pre->ancount)) {
TASS Belgium NV 131:4758606c9316 497 comp = short_from(psuffix);
TASS Belgium NV 131:4758606c9316 498 compression = short_be(comp);
TASS Belgium NV 131:4758606c9316 499 switch (compression >> 14)
TASS Belgium NV 131:4758606c9316 500 {
TASS Belgium NV 131:4758606c9316 501 case PICO_DNS_POINTER:
TASS Belgium NV 131:4758606c9316 502 while (compression >> 14 == PICO_DNS_POINTER) {
TASS Belgium NV 131:4758606c9316 503 dns_dbg("DNS: pointer\n");
TASS Belgium NV 131:4758606c9316 504 psuffix += sizeof(uint16_t);
TASS Belgium NV 131:4758606c9316 505 comp = short_from(psuffix);
TASS Belgium NV 131:4758606c9316 506 compression = short_be(comp);
TASS Belgium NV 131:4758606c9316 507 }
TASS Belgium NV 131:4758606c9316 508 break;
tass 68:0847e35d08a6 509
TASS Belgium NV 131:4758606c9316 510 case PICO_DNS_LABEL:
TASS Belgium NV 131:4758606c9316 511 dns_dbg("DNS: label\n");
TASS Belgium NV 131:4758606c9316 512 psuffix = pico_dns_client_seek(psuffix);
TASS Belgium NV 131:4758606c9316 513 break;
tass 68:0847e35d08a6 514
TASS Belgium NV 131:4758606c9316 515 default:
TASS Belgium NV 131:4758606c9316 516 dns_dbg("DNS ERROR: incorrect compression (%u) value\n", compression);
TASS Belgium NV 131:4758606c9316 517 return NULL;
TASS Belgium NV 131:4758606c9316 518 }
TASS Belgium NV 131:4758606c9316 519
TASS Belgium NV 131:4758606c9316 520 asuffix = (struct pico_dns_answer_suffix *)psuffix;
tass picotcp@tass.be 149:5f4cb161cec3 521 if (!asuffix)
tass picotcp@tass.be 149:5f4cb161cec3 522 break;
tass picotcp@tass.be 149:5f4cb161cec3 523
TASS Belgium NV 131:4758606c9316 524 if (pico_dns_client_check_asuffix(asuffix, q) < 0) {
TASS Belgium NV 131:4758606c9316 525 psuffix += (sizeof(struct pico_dns_answer_suffix) + short_be(asuffix->rdlength));
TASS Belgium NV 131:4758606c9316 526 continue;
TASS Belgium NV 131:4758606c9316 527 }
TASS Belgium NV 131:4758606c9316 528
TASS Belgium NV 131:4758606c9316 529 return psuffix;
tass 68:0847e35d08a6 530 }
TASS Belgium NV 131:4758606c9316 531 return NULL;
tass 68:0847e35d08a6 532 }
tass 68:0847e35d08a6 533
tass 68:0847e35d08a6 534 static int pico_dns_client_send(struct pico_dns_query *q)
tass 68:0847e35d08a6 535 {
tass picotcp@tass.be 149:5f4cb161cec3 536 uint16_t *paramID = PICO_ZALLOC(sizeof(uint16_t));
tass picotcp@tass.be 149:5f4cb161cec3 537 if (!paramID) {
tass picotcp@tass.be 149:5f4cb161cec3 538 pico_err = PICO_ERR_ENOMEM;
tass picotcp@tass.be 149:5f4cb161cec3 539 return -1;
tass picotcp@tass.be 149:5f4cb161cec3 540 }
tass picotcp@tass.be 149:5f4cb161cec3 541
TASS Belgium NV 131:4758606c9316 542 dns_dbg("DNS: sending query to %08X\n", q->q_ns.ns.addr);
TASS Belgium NV 131:4758606c9316 543 if (!q->s)
TASS Belgium NV 131:4758606c9316 544 goto failure;
tass 68:0847e35d08a6 545
TASS Belgium NV 131:4758606c9316 546 if (pico_socket_connect(q->s, &q->q_ns.ns, short_be(PICO_DNS_NS_PORT)) < 0)
TASS Belgium NV 131:4758606c9316 547 goto failure;
tass 68:0847e35d08a6 548
TASS Belgium NV 131:4758606c9316 549 pico_socket_send(q->s, q->query, q->len);
TASS Belgium NV 131:4758606c9316 550 *paramID = q->id;
TASS Belgium NV 131:4758606c9316 551 pico_timer_add(PICO_DNS_CLIENT_RETRANS, pico_dns_client_retransmission, paramID);
TASS Belgium NV 131:4758606c9316 552
TASS Belgium NV 131:4758606c9316 553 return 0;
tass 74:c146c4e346c4 554
tass 74:c146c4e346c4 555 failure:
tass picotcp@tass.be 149:5f4cb161cec3 556 PICO_FREE(paramID);
TASS Belgium NV 131:4758606c9316 557 return -1;
tass 68:0847e35d08a6 558 }
tass 68:0847e35d08a6 559
tass 128:ae39e6e81531 560 static void pico_dns_client_retransmission(pico_time now, void *arg)
tass 68:0847e35d08a6 561 {
TASS Belgium NV 131:4758606c9316 562 struct pico_dns_query *q = NULL;
TASS Belgium NV 131:4758606c9316 563 struct pico_dns_query dummy;
TASS Belgium NV 131:4758606c9316 564 IGNORE_PARAMETER(now);
tass 68:0847e35d08a6 565
TASS Belgium NV 131:4758606c9316 566 if(!arg)
TASS Belgium NV 131:4758606c9316 567 return;
TASS Belgium NV 131:4758606c9316 568
TASS Belgium NV 131:4758606c9316 569 /* search for the dns query and free used space */
TASS Belgium NV 131:4758606c9316 570 dummy.id = *(uint16_t *)arg;
TASS Belgium NV 131:4758606c9316 571 q = (struct pico_dns_query *)pico_tree_findKey(&DNSTable, &dummy);
tass picotcp@tass.be 149:5f4cb161cec3 572 PICO_FREE(arg);
tass 68:0847e35d08a6 573
TASS Belgium NV 131:4758606c9316 574 /* dns query successful? */
TASS Belgium NV 131:4758606c9316 575 if (!q) {
TASS Belgium NV 131:4758606c9316 576 return;
TASS Belgium NV 131:4758606c9316 577 }
tass 68:0847e35d08a6 578
TASS Belgium NV 131:4758606c9316 579 if (q->retrans++ <= PICO_DNS_CLIENT_MAX_RETRANS) {
TASS Belgium NV 131:4758606c9316 580 q->q_ns = pico_dns_client_next_ns(&q->q_ns.ns);
TASS Belgium NV 131:4758606c9316 581 pico_dns_client_send(q);
TASS Belgium NV 131:4758606c9316 582 } else {
TASS Belgium NV 131:4758606c9316 583 pico_err = PICO_ERR_EIO;
TASS Belgium NV 131:4758606c9316 584 q->callback(NULL, q->arg);
TASS Belgium NV 131:4758606c9316 585 pico_dns_client_del_query(q->id);
TASS Belgium NV 131:4758606c9316 586 }
tass 68:0847e35d08a6 587 }
tass 68:0847e35d08a6 588
tass 68:0847e35d08a6 589 static int pico_dns_client_user_callback(struct pico_dns_answer_suffix *asuffix, struct pico_dns_query *q)
tass 68:0847e35d08a6 590 {
TASS Belgium NV 131:4758606c9316 591 uint32_t ip = 0;
TASS Belgium NV 131:4758606c9316 592 char *str = NULL;
TASS Belgium NV 131:4758606c9316 593
TASS Belgium NV 131:4758606c9316 594 switch (q->qtype)
TASS Belgium NV 131:4758606c9316 595 {
tass 68:0847e35d08a6 596 case PICO_DNS_TYPE_A:
TASS Belgium NV 131:4758606c9316 597 ip = long_from(asuffix->rdata);
tass picotcp@tass.be 149:5f4cb161cec3 598 str = PICO_ZALLOC(PICO_DNS_IPV4_ADDR_LEN);
TASS Belgium NV 131:4758606c9316 599 pico_ipv4_to_string(str, ip);
TASS Belgium NV 131:4758606c9316 600 break;
tass picotcp@tass.be 149:5f4cb161cec3 601 #ifdef PICO_SUPPORT_IPV6
tass picotcp@tass.be 149:5f4cb161cec3 602 case PICO_DNS_TYPE_AAAA:
tass picotcp@tass.be 149:5f4cb161cec3 603 {
tass picotcp@tass.be 149:5f4cb161cec3 604 struct pico_ip6 ip6;
tass picotcp@tass.be 149:5f4cb161cec3 605 memcpy(&ip6.addr, asuffix->rdata, sizeof(struct pico_ip6));
tass picotcp@tass.be 149:5f4cb161cec3 606 str = PICO_ZALLOC(PICO_DNS_IPV6_ADDR_LEN);
tass picotcp@tass.be 149:5f4cb161cec3 607 pico_ipv6_to_string(str, ip6.addr);
tass picotcp@tass.be 149:5f4cb161cec3 608 break;
tass picotcp@tass.be 149:5f4cb161cec3 609 }
tass picotcp@tass.be 149:5f4cb161cec3 610 #endif
tass 68:0847e35d08a6 611 case PICO_DNS_TYPE_PTR:
TASS Belgium NV 131:4758606c9316 612 pico_dns_client_answer_domain((char *)asuffix->rdata);
tass picotcp@tass.be 149:5f4cb161cec3 613 str = PICO_ZALLOC((size_t)(asuffix->rdlength - PICO_DNS_LABEL_INITIAL));
tass picotcp@tass.be 149:5f4cb161cec3 614 if (!str) {
tass picotcp@tass.be 149:5f4cb161cec3 615 pico_err = PICO_ERR_ENOMEM;
tass picotcp@tass.be 149:5f4cb161cec3 616 return -1;
tass picotcp@tass.be 149:5f4cb161cec3 617 }
tass picotcp@tass.be 149:5f4cb161cec3 618
TASS Belgium NV 131:4758606c9316 619 memcpy(str, asuffix->rdata + PICO_DNS_LABEL_INITIAL, short_be(asuffix->rdlength) - PICO_DNS_LABEL_INITIAL);
TASS Belgium NV 131:4758606c9316 620 break;
tass 68:0847e35d08a6 621
tass 68:0847e35d08a6 622 default:
TASS Belgium NV 131:4758606c9316 623 dns_dbg("DNS ERROR: incorrect qtype (%u)\n", q->qtype);
TASS Belgium NV 131:4758606c9316 624 break;
TASS Belgium NV 131:4758606c9316 625 }
tass 68:0847e35d08a6 626
TASS Belgium NV 131:4758606c9316 627 if (q->retrans) {
TASS Belgium NV 131:4758606c9316 628 q->callback(str, q->arg);
TASS Belgium NV 131:4758606c9316 629 q->retrans = 0;
tass picotcp@tass.be 149:5f4cb161cec3 630 PICO_FREE(str);
TASS Belgium NV 131:4758606c9316 631 pico_dns_client_del_query(q->id);
TASS Belgium NV 131:4758606c9316 632 }
TASS Belgium NV 131:4758606c9316 633
TASS Belgium NV 131:4758606c9316 634 return 0;
tass 68:0847e35d08a6 635 }
tass 68:0847e35d08a6 636
tass 68:0847e35d08a6 637 static void pico_dns_client_callback(uint16_t ev, struct pico_socket *s)
tass 68:0847e35d08a6 638 {
TASS Belgium NV 131:4758606c9316 639 struct pico_dns_prefix *prefix = NULL;
TASS Belgium NV 131:4758606c9316 640 struct pico_dns_name *domain = NULL;
TASS Belgium NV 131:4758606c9316 641 struct pico_dns_query_suffix *qsuffix = NULL;
TASS Belgium NV 131:4758606c9316 642 struct pico_dns_answer_suffix *asuffix = NULL;
TASS Belgium NV 131:4758606c9316 643 struct pico_dns_query *q = NULL;
TASS Belgium NV 131:4758606c9316 644 char *p_asuffix = NULL;
TASS Belgium NV 131:4758606c9316 645 char msg[PICO_DNS_MAX_RESPONSE_LEN] = {
TASS Belgium NV 131:4758606c9316 646 0
TASS Belgium NV 131:4758606c9316 647 };
tass 68:0847e35d08a6 648
TASS Belgium NV 131:4758606c9316 649 if (ev == PICO_SOCK_EV_ERR) {
TASS Belgium NV 131:4758606c9316 650 dns_dbg("DNS: socket error received\n");
TASS Belgium NV 131:4758606c9316 651 return;
TASS Belgium NV 131:4758606c9316 652 }
tass 68:0847e35d08a6 653
TASS Belgium NV 131:4758606c9316 654 if (ev & PICO_SOCK_EV_RD) {
TASS Belgium NV 131:4758606c9316 655 if (pico_socket_read(s, msg, PICO_DNS_MAX_RESPONSE_LEN) <= 0)
TASS Belgium NV 131:4758606c9316 656 return;
TASS Belgium NV 131:4758606c9316 657 }
tass 68:0847e35d08a6 658
TASS Belgium NV 131:4758606c9316 659 prefix = (struct pico_dns_prefix *)msg;
TASS Belgium NV 131:4758606c9316 660 domain = &prefix->domain;
TASS Belgium NV 131:4758606c9316 661 qsuffix = (struct pico_dns_query_suffix *)pico_dns_client_seek(domain->name);
TASS Belgium NV 131:4758606c9316 662 /* valid asuffix is determined dynamically later on */
TASS Belgium NV 131:4758606c9316 663
TASS Belgium NV 131:4758606c9316 664 if (pico_dns_client_check_prefix(prefix) < 0)
TASS Belgium NV 131:4758606c9316 665 return;
TASS Belgium NV 131:4758606c9316 666
TASS Belgium NV 131:4758606c9316 667 q = pico_dns_client_find_query(short_be(prefix->id));
TASS Belgium NV 131:4758606c9316 668 if (!q)
TASS Belgium NV 131:4758606c9316 669 return;
tass 68:0847e35d08a6 670
TASS Belgium NV 131:4758606c9316 671 if (pico_dns_client_check_qsuffix(qsuffix, q) < 0)
TASS Belgium NV 131:4758606c9316 672 return;
TASS Belgium NV 131:4758606c9316 673
TASS Belgium NV 131:4758606c9316 674 p_asuffix = (char *)qsuffix + sizeof(struct pico_dns_query_suffix);
TASS Belgium NV 131:4758606c9316 675 p_asuffix = pico_dns_client_seek_suffix(p_asuffix, prefix, q);
TASS Belgium NV 131:4758606c9316 676 if (!p_asuffix)
TASS Belgium NV 131:4758606c9316 677 return;
TASS Belgium NV 131:4758606c9316 678
TASS Belgium NV 131:4758606c9316 679 asuffix = (struct pico_dns_answer_suffix *)p_asuffix;
TASS Belgium NV 131:4758606c9316 680 pico_dns_client_user_callback(asuffix, q);
TASS Belgium NV 131:4758606c9316 681
tass 68:0847e35d08a6 682 return;
tass 68:0847e35d08a6 683 }
tass 68:0847e35d08a6 684
tass picotcp@tass.be 149:5f4cb161cec3 685 static int pico_dns_client_getaddr_init(const char *url, uint16_t proto, void (*callback)(char *, void *), void *arg)
tass 68:0847e35d08a6 686 {
TASS Belgium NV 131:4758606c9316 687 char *msg = NULL;
TASS Belgium NV 131:4758606c9316 688 struct pico_dns_prefix *prefix = NULL;
TASS Belgium NV 131:4758606c9316 689 struct pico_dns_name *domain = NULL;
TASS Belgium NV 131:4758606c9316 690 struct pico_dns_query_suffix *qsuffix = NULL;
TASS Belgium NV 131:4758606c9316 691 struct pico_dns_query *q = NULL;
TASS Belgium NV 131:4758606c9316 692 uint16_t len = 0, lblen = 0, strlen = 0;
tass picotcp@tass.be 149:5f4cb161cec3 693 (void)proto;
tass 68:0847e35d08a6 694
TASS Belgium NV 131:4758606c9316 695 if (!url || !callback) {
TASS Belgium NV 131:4758606c9316 696 pico_err = PICO_ERR_EINVAL;
TASS Belgium NV 131:4758606c9316 697 return -1;
TASS Belgium NV 131:4758606c9316 698 }
TASS Belgium NV 131:4758606c9316 699
TASS Belgium NV 131:4758606c9316 700 strlen = pico_dns_client_strlen(url);
TASS Belgium NV 131:4758606c9316 701 lblen = (uint16_t)(PICO_DNS_LABEL_INITIAL + strlen + PICO_DNS_LABEL_ROOT);
TASS Belgium NV 131:4758606c9316 702 len = (uint16_t)(sizeof(struct pico_dns_prefix) + lblen + sizeof(struct pico_dns_query_suffix));
tass picotcp@tass.be 149:5f4cb161cec3 703 msg = PICO_ZALLOC(len);
TASS Belgium NV 131:4758606c9316 704 if (!msg) {
TASS Belgium NV 131:4758606c9316 705 pico_err = PICO_ERR_ENOMEM;
TASS Belgium NV 131:4758606c9316 706 return -1;
TASS Belgium NV 131:4758606c9316 707 }
tass 68:0847e35d08a6 708
TASS Belgium NV 131:4758606c9316 709 prefix = (struct pico_dns_prefix *)msg;
TASS Belgium NV 131:4758606c9316 710 domain = &prefix->domain;
TASS Belgium NV 131:4758606c9316 711 qsuffix = (struct pico_dns_query_suffix *)(domain->name + lblen);
TASS Belgium NV 131:4758606c9316 712 memcpy(domain->name + PICO_DNS_LABEL_INITIAL, url, strlen);
TASS Belgium NV 131:4758606c9316 713
TASS Belgium NV 131:4758606c9316 714 /* assemble dns message */
TASS Belgium NV 131:4758606c9316 715 pico_dns_client_query_prefix(prefix);
TASS Belgium NV 131:4758606c9316 716 pico_dns_client_query_domain(domain->name);
tass picotcp@tass.be 149:5f4cb161cec3 717
tass picotcp@tass.be 149:5f4cb161cec3 718 #ifdef PICO_SUPPORT_IPV6
tass picotcp@tass.be 149:5f4cb161cec3 719 if (proto == PICO_PROTO_IPV6) {
tass picotcp@tass.be 149:5f4cb161cec3 720 pico_dns_client_query_suffix(qsuffix, PICO_DNS_TYPE_AAAA, PICO_DNS_CLASS_IN);
tass picotcp@tass.be 149:5f4cb161cec3 721 } else
tass picotcp@tass.be 149:5f4cb161cec3 722 #endif
TASS Belgium NV 131:4758606c9316 723 pico_dns_client_query_suffix(qsuffix, PICO_DNS_TYPE_A, PICO_DNS_CLASS_IN);
tass 68:0847e35d08a6 724
TASS Belgium NV 131:4758606c9316 725 q = pico_dns_client_add_query(prefix, len, qsuffix, callback, arg);
TASS Belgium NV 131:4758606c9316 726 if (!q) {
tass picotcp@tass.be 149:5f4cb161cec3 727 PICO_FREE(msg);
TASS Belgium NV 131:4758606c9316 728 return -1;
TASS Belgium NV 131:4758606c9316 729 }
tass 68:0847e35d08a6 730
TASS Belgium NV 131:4758606c9316 731 if (pico_dns_client_send(q) < 0) {
TASS Belgium NV 131:4758606c9316 732 pico_dns_client_del_query(q->id); /* frees msg */
TASS Belgium NV 131:4758606c9316 733 return -1;
TASS Belgium NV 131:4758606c9316 734 }
tass 68:0847e35d08a6 735
TASS Belgium NV 131:4758606c9316 736 return 0;
tass 68:0847e35d08a6 737 }
tass 68:0847e35d08a6 738
tass picotcp@tass.be 149:5f4cb161cec3 739 int pico_dns_client_getaddr(const char *url, void (*callback)(char *, void *), void *arg)
tass picotcp@tass.be 149:5f4cb161cec3 740 {
tass picotcp@tass.be 149:5f4cb161cec3 741 return pico_dns_client_getaddr_init(url, PICO_PROTO_IPV4, callback, arg);
tass picotcp@tass.be 149:5f4cb161cec3 742 }
tass picotcp@tass.be 149:5f4cb161cec3 743
tass picotcp@tass.be 149:5f4cb161cec3 744 int pico_dns_client_getaddr6(const char *url, void (*callback)(char *, void *), void *arg)
tass picotcp@tass.be 149:5f4cb161cec3 745 {
tass picotcp@tass.be 149:5f4cb161cec3 746 return pico_dns_client_getaddr_init(url, PICO_PROTO_IPV6, callback, arg);
tass picotcp@tass.be 149:5f4cb161cec3 747 }
tass picotcp@tass.be 149:5f4cb161cec3 748
tass 68:0847e35d08a6 749 int pico_dns_client_getname(const char *ip, void (*callback)(char *, void *), void *arg)
tass 68:0847e35d08a6 750 {
TASS Belgium NV 131:4758606c9316 751 const char *inaddr_arpa = ".in-addr.arpa";
TASS Belgium NV 131:4758606c9316 752 char *msg = NULL;
TASS Belgium NV 131:4758606c9316 753 struct pico_dns_prefix *prefix = NULL;
TASS Belgium NV 131:4758606c9316 754 struct pico_dns_name *domain = NULL;
TASS Belgium NV 131:4758606c9316 755 struct pico_dns_query_suffix *qsuffix = NULL;
TASS Belgium NV 131:4758606c9316 756 struct pico_dns_query *q = NULL;
TASS Belgium NV 131:4758606c9316 757 uint16_t len = 0, lblen = 0, strlen = 0, arpalen = 0;
tass 68:0847e35d08a6 758
TASS Belgium NV 131:4758606c9316 759 if (!ip || !callback) {
TASS Belgium NV 131:4758606c9316 760 pico_err = PICO_ERR_EINVAL;
TASS Belgium NV 131:4758606c9316 761 return -1;
TASS Belgium NV 131:4758606c9316 762 }
TASS Belgium NV 131:4758606c9316 763
TASS Belgium NV 131:4758606c9316 764 strlen = pico_dns_client_strlen(ip);
TASS Belgium NV 131:4758606c9316 765 arpalen = pico_dns_client_strlen(inaddr_arpa);
TASS Belgium NV 131:4758606c9316 766 lblen = (uint16_t)(PICO_DNS_LABEL_INITIAL + strlen + arpalen + PICO_DNS_LABEL_ROOT);
TASS Belgium NV 131:4758606c9316 767 len = (uint16_t)(sizeof(struct pico_dns_prefix) + lblen + sizeof(struct pico_dns_query_suffix));
tass picotcp@tass.be 149:5f4cb161cec3 768 msg = PICO_ZALLOC(len);
TASS Belgium NV 131:4758606c9316 769 if (!msg) {
TASS Belgium NV 131:4758606c9316 770 pico_err = PICO_ERR_ENOMEM;
TASS Belgium NV 131:4758606c9316 771 return -1;
TASS Belgium NV 131:4758606c9316 772 }
tass 68:0847e35d08a6 773
TASS Belgium NV 131:4758606c9316 774 prefix = (struct pico_dns_prefix *)msg;
TASS Belgium NV 131:4758606c9316 775 domain = &prefix->domain;
TASS Belgium NV 131:4758606c9316 776 qsuffix = (struct pico_dns_query_suffix *)(prefix->domain.name + lblen);
TASS Belgium NV 131:4758606c9316 777 memcpy(domain->name + PICO_DNS_LABEL_INITIAL, ip, strlen);
TASS Belgium NV 131:4758606c9316 778 pico_dns_client_mirror(domain->name + PICO_DNS_LABEL_INITIAL);
TASS Belgium NV 131:4758606c9316 779 memcpy(domain->name + PICO_DNS_LABEL_INITIAL + strlen, inaddr_arpa, arpalen);
TASS Belgium NV 131:4758606c9316 780 /* assemble dns message */
TASS Belgium NV 131:4758606c9316 781 pico_dns_client_query_prefix(prefix);
TASS Belgium NV 131:4758606c9316 782 pico_dns_client_query_domain(domain->name);
TASS Belgium NV 131:4758606c9316 783 pico_dns_client_query_suffix(qsuffix, PICO_DNS_TYPE_PTR, PICO_DNS_CLASS_IN);
TASS Belgium NV 131:4758606c9316 784 q = pico_dns_client_add_query(prefix, len, qsuffix, callback, arg);
TASS Belgium NV 131:4758606c9316 785 if (!q) {
tass picotcp@tass.be 149:5f4cb161cec3 786 PICO_FREE(msg);
TASS Belgium NV 131:4758606c9316 787 return -1;
TASS Belgium NV 131:4758606c9316 788 }
tass 68:0847e35d08a6 789
TASS Belgium NV 131:4758606c9316 790 if (pico_dns_client_send(q) < 0) {
TASS Belgium NV 131:4758606c9316 791 pico_dns_client_del_query(q->id); /* frees msg */
TASS Belgium NV 131:4758606c9316 792 return -1;
TASS Belgium NV 131:4758606c9316 793 }
tass 68:0847e35d08a6 794
TASS Belgium NV 131:4758606c9316 795 return 0;
tass 68:0847e35d08a6 796 }
tass 68:0847e35d08a6 797
tass picotcp@tass.be 149:5f4cb161cec3 798
tass picotcp@tass.be 149:5f4cb161cec3 799 #ifdef PICO_SUPPORT_IPV6
tass picotcp@tass.be 149:5f4cb161cec3 800 #define STRLEN_PTR_IP6 63
tass picotcp@tass.be 149:5f4cb161cec3 801
tass picotcp@tass.be 149:5f4cb161cec3 802 static inline char dns_ptr_ip6_nibble_lo(uint8_t byte)
tass picotcp@tass.be 149:5f4cb161cec3 803 {
tass picotcp@tass.be 149:5f4cb161cec3 804 uint8_t nibble = byte & 0x0f;
tass picotcp@tass.be 149:5f4cb161cec3 805 if (nibble < 10)
tass picotcp@tass.be 149:5f4cb161cec3 806 return (char)(nibble + '0');
tass picotcp@tass.be 149:5f4cb161cec3 807 else
tass picotcp@tass.be 149:5f4cb161cec3 808 return (char)(nibble - 0xa + 'a');
tass picotcp@tass.be 149:5f4cb161cec3 809 }
tass picotcp@tass.be 149:5f4cb161cec3 810
tass picotcp@tass.be 149:5f4cb161cec3 811 static inline char dns_ptr_ip6_nibble_hi(uint8_t byte)
tass picotcp@tass.be 149:5f4cb161cec3 812 {
tass picotcp@tass.be 149:5f4cb161cec3 813 uint8_t nibble = (byte & 0xf0u) >> 4u;
tass picotcp@tass.be 149:5f4cb161cec3 814 if (nibble < 10u)
tass picotcp@tass.be 149:5f4cb161cec3 815 return (char)(nibble + '0');
tass picotcp@tass.be 149:5f4cb161cec3 816 else
tass picotcp@tass.be 149:5f4cb161cec3 817 return (char)(nibble - 0xa + 'a');
tass picotcp@tass.be 149:5f4cb161cec3 818 }
tass picotcp@tass.be 149:5f4cb161cec3 819
tass picotcp@tass.be 149:5f4cb161cec3 820 static void pico_dns_ipv6_set_ptr(const char *ip, char *dst)
tass picotcp@tass.be 149:5f4cb161cec3 821 {
tass picotcp@tass.be 149:5f4cb161cec3 822 struct pico_ip6 ip6;
tass picotcp@tass.be 149:5f4cb161cec3 823 int i, j = 0;
tass picotcp@tass.be 149:5f4cb161cec3 824 pico_string_to_ipv6(ip, ip6.addr);
tass picotcp@tass.be 149:5f4cb161cec3 825 for (i = 15; i >= 0; i--) {
tass picotcp@tass.be 149:5f4cb161cec3 826 dst[j++] = dns_ptr_ip6_nibble_lo(ip6.addr[i]);
tass picotcp@tass.be 149:5f4cb161cec3 827 dst[j++] = '.';
tass picotcp@tass.be 149:5f4cb161cec3 828 dst[j++] = dns_ptr_ip6_nibble_hi(ip6.addr[i]);
tass picotcp@tass.be 149:5f4cb161cec3 829 dst[j++] = '.';
tass picotcp@tass.be 149:5f4cb161cec3 830 }
tass picotcp@tass.be 149:5f4cb161cec3 831 }
tass picotcp@tass.be 149:5f4cb161cec3 832
tass picotcp@tass.be 149:5f4cb161cec3 833 int pico_dns_client_getname6(const char *ip, void (*callback)(char *, void *), void *arg)
tass picotcp@tass.be 149:5f4cb161cec3 834 {
tass picotcp@tass.be 149:5f4cb161cec3 835 const char *inaddr6_arpa = ".IP6.ARPA";
tass picotcp@tass.be 149:5f4cb161cec3 836 char *msg = NULL;
tass picotcp@tass.be 149:5f4cb161cec3 837 struct pico_dns_prefix *prefix = NULL;
tass picotcp@tass.be 149:5f4cb161cec3 838 struct pico_dns_name *domain = NULL;
tass picotcp@tass.be 149:5f4cb161cec3 839 struct pico_dns_query_suffix *qsuffix = NULL;
tass picotcp@tass.be 149:5f4cb161cec3 840 struct pico_dns_query *q = NULL;
tass picotcp@tass.be 149:5f4cb161cec3 841 uint16_t len = 0, lblen = 0, arpalen = 0;
tass picotcp@tass.be 149:5f4cb161cec3 842
tass picotcp@tass.be 149:5f4cb161cec3 843 if (!ip || !callback) {
tass picotcp@tass.be 149:5f4cb161cec3 844 pico_err = PICO_ERR_EINVAL;
tass picotcp@tass.be 149:5f4cb161cec3 845 return -1;
tass picotcp@tass.be 149:5f4cb161cec3 846 }
tass picotcp@tass.be 149:5f4cb161cec3 847
tass picotcp@tass.be 149:5f4cb161cec3 848 arpalen = pico_dns_client_strlen(inaddr6_arpa);
tass picotcp@tass.be 149:5f4cb161cec3 849 lblen = (uint16_t)(PICO_DNS_LABEL_INITIAL + STRLEN_PTR_IP6 + arpalen + PICO_DNS_LABEL_ROOT);
tass picotcp@tass.be 149:5f4cb161cec3 850 len = (uint16_t)(sizeof(struct pico_dns_prefix) + lblen + sizeof(struct pico_dns_query_suffix));
tass picotcp@tass.be 149:5f4cb161cec3 851 msg = PICO_ZALLOC(len);
tass picotcp@tass.be 149:5f4cb161cec3 852 if (!msg) {
tass picotcp@tass.be 149:5f4cb161cec3 853 pico_err = PICO_ERR_ENOMEM;
tass picotcp@tass.be 149:5f4cb161cec3 854 return -1;
tass picotcp@tass.be 149:5f4cb161cec3 855 }
tass picotcp@tass.be 149:5f4cb161cec3 856
tass picotcp@tass.be 149:5f4cb161cec3 857 prefix = (struct pico_dns_prefix *)msg;
tass picotcp@tass.be 149:5f4cb161cec3 858 domain = &prefix->domain;
tass picotcp@tass.be 149:5f4cb161cec3 859 qsuffix = (struct pico_dns_query_suffix *)(prefix->domain.name + lblen);
tass picotcp@tass.be 149:5f4cb161cec3 860 pico_dns_ipv6_set_ptr(ip, domain->name + PICO_DNS_LABEL_INITIAL);
tass picotcp@tass.be 149:5f4cb161cec3 861 memcpy(domain->name + PICO_DNS_LABEL_INITIAL + STRLEN_PTR_IP6, inaddr6_arpa, arpalen);
tass picotcp@tass.be 149:5f4cb161cec3 862 /* assemble dns message */
tass picotcp@tass.be 149:5f4cb161cec3 863 pico_dns_client_query_prefix(prefix);
tass picotcp@tass.be 149:5f4cb161cec3 864 pico_dns_client_query_domain(domain->name);
tass picotcp@tass.be 149:5f4cb161cec3 865 pico_dns_client_query_suffix(qsuffix, PICO_DNS_TYPE_PTR, PICO_DNS_CLASS_IN);
tass picotcp@tass.be 149:5f4cb161cec3 866 q = pico_dns_client_add_query(prefix, len, qsuffix, callback, arg);
tass picotcp@tass.be 149:5f4cb161cec3 867 if (!q) {
tass picotcp@tass.be 149:5f4cb161cec3 868 PICO_FREE(msg);
tass picotcp@tass.be 149:5f4cb161cec3 869 return -1;
tass picotcp@tass.be 149:5f4cb161cec3 870 }
tass picotcp@tass.be 149:5f4cb161cec3 871
tass picotcp@tass.be 149:5f4cb161cec3 872 if (pico_dns_client_send(q) < 0) {
tass picotcp@tass.be 149:5f4cb161cec3 873 pico_dns_client_del_query(q->id); /* frees msg */
tass picotcp@tass.be 149:5f4cb161cec3 874 return -1;
tass picotcp@tass.be 149:5f4cb161cec3 875 }
tass picotcp@tass.be 149:5f4cb161cec3 876
tass picotcp@tass.be 149:5f4cb161cec3 877 return 0;
tass picotcp@tass.be 149:5f4cb161cec3 878 }
tass picotcp@tass.be 149:5f4cb161cec3 879 #endif
tass picotcp@tass.be 149:5f4cb161cec3 880
tass 68:0847e35d08a6 881 int pico_dns_client_nameserver(struct pico_ip4 *ns, uint8_t flag)
tass 68:0847e35d08a6 882 {
TASS Belgium NV 131:4758606c9316 883 if (!ns) {
TASS Belgium NV 131:4758606c9316 884 pico_err = PICO_ERR_EINVAL;
TASS Belgium NV 131:4758606c9316 885 return -1;
TASS Belgium NV 131:4758606c9316 886 }
tass 68:0847e35d08a6 887
TASS Belgium NV 131:4758606c9316 888 switch (flag)
TASS Belgium NV 131:4758606c9316 889 {
tass 68:0847e35d08a6 890 case PICO_DNS_NS_ADD:
TASS Belgium NV 131:4758606c9316 891 if (!pico_dns_client_add_ns(ns))
TASS Belgium NV 131:4758606c9316 892 return -1;
TASS Belgium NV 131:4758606c9316 893
TASS Belgium NV 131:4758606c9316 894 break;
tass 68:0847e35d08a6 895
tass 68:0847e35d08a6 896 case PICO_DNS_NS_DEL:
TASS Belgium NV 131:4758606c9316 897 if (pico_dns_client_del_ns(ns) < 0) {
TASS Belgium NV 131:4758606c9316 898 pico_err = PICO_ERR_EINVAL;
TASS Belgium NV 131:4758606c9316 899 return -1;
TASS Belgium NV 131:4758606c9316 900 }
TASS Belgium NV 131:4758606c9316 901
TASS Belgium NV 131:4758606c9316 902 break;
TASS Belgium NV 131:4758606c9316 903
TASS Belgium NV 131:4758606c9316 904 default:
tass 68:0847e35d08a6 905 pico_err = PICO_ERR_EINVAL;
tass 68:0847e35d08a6 906 return -1;
TASS Belgium NV 131:4758606c9316 907 }
TASS Belgium NV 131:4758606c9316 908 return 0;
tass 68:0847e35d08a6 909 }
tass 68:0847e35d08a6 910
tass picotcp@tass.be 134:cc4e6d2654d9 911 int pico_dns_client_init(void)
tass 68:0847e35d08a6 912 {
TASS Belgium NV 131:4758606c9316 913 struct pico_ip4 default_ns = {
TASS Belgium NV 131:4758606c9316 914 0
TASS Belgium NV 131:4758606c9316 915 };
tass 68:0847e35d08a6 916
tass picotcp@tass.be 149:5f4cb161cec3 917 if (pico_string_to_ipv4(PICO_DNS_NS_DEFAULT, (uint32_t *)&default_ns.addr) < 0)
TASS Belgium NV 131:4758606c9316 918 return -1;
tass 68:0847e35d08a6 919
TASS Belgium NV 131:4758606c9316 920 return pico_dns_client_nameserver(&default_ns, PICO_DNS_NS_ADD);
tass 68:0847e35d08a6 921 }
tass 68:0847e35d08a6 922
tass 68:0847e35d08a6 923 #endif /* PICO_SUPPORT_DNS_CLIENT */