ioLibrary for Cortex M series
sockutil.c
Go to the documentation of this file.
1 
12 //#define FILE_LOG_SILENCE
13 #include "common/common.h"
14 
15 static watch_cbfunc watch_cb[_WIZCHIP_SOCK_NUM_] = {0,};
16 static uint8_t watch_sock[_WIZCHIP_SOCK_NUM_] = {0,};
17 
18 
35 int8_t network_init(uint8_t dhcp_sock, void_func ip_update, void_func ip_conflict)
36 {
37 #define NETINIT_ADDR_SET(name_p) \
38 do { \
39  if(ip_check(DEFAULT_IP_ADDR, netinfo.ip) != RET_OK) { \
40  printf("Default IP Addr set fail"); return RET_NOK; \
41  } else DBGA(name_p" IP Addr(%d.%d.%d.%d)", \
42  netinfo.ip[0], netinfo.ip[1], netinfo.ip[2], netinfo.ip[3]); \
43  if(ip_check(DEFAULT_SN_MASK, netinfo.sn) != RET_OK) { \
44  printf("Default SN Mask set fail"); return RET_NOK; \
45  } else DBGA(name_p" SN Mask(%d.%d.%d.%d)", \
46  netinfo.sn[0], netinfo.sn[1], netinfo.sn[2], netinfo.sn[3]); \
47  if(ip_check(DEFAULT_GW_ADDR, netinfo.gw) != RET_OK) { \
48  printf("Default GW Addr set fail"); return RET_NOK; \
49  } else DBGA(name_p" GW Addr(%d.%d.%d.%d)", netinfo.gw[0], \
50  netinfo.gw[1], netinfo.gw[2], netinfo.gw[3]); \
51  if(ip_check(DEFAULT_DNS_ADDR, netinfo.dns) != RET_OK) { \
52  printf("Default DNS Addr set fail"); return RET_NOK; \
53  } else DBGA(name_p" DNS Addr(%d.%d.%d.%d)", netinfo.dns[0], \
54  netinfo.dns[1], netinfo.dns[2], netinfo.dns[3]); \
55 } while(0)
56 
57  wiz_NetInfo netinfo;
58 
59  memset(&netinfo, 0, sizeof(netinfo));
60 
61  if(mac_check(DEFAULT_MAC_ADDR, netinfo.mac) != RET_OK) {
62  printf("Default MAC Addr set fail");
63  return RET_NOK;
64  } else DBGA("Default MAC Addr(%02x:%02x:%02x:%02x:%02x:%02x)", netinfo.mac[0],
65  netinfo.mac[1], netinfo.mac[2], netinfo.mac[3], netinfo.mac[4], netinfo.mac[5]);
66 
67 #ifdef USE_DHCP
68  NETINIT_ADDR_SET("Default"); // Set the addresses which will be used when DHCP failed
69  if(dhcp_init(dhcp_sock, ip_update, ip_conflict, &netinfo) != RET_OK)
70  return RET_NOK;
71 #else
72  NETINIT_ADDR_SET("Static");
73  netinfo.dhcp = NETINFO_STATIC;
74  SetNetInfo(&netinfo);
75  network_disp(NULL);
76 #endif
77 
78  return RET_OK;
79 }
80 
89 void network_disp(wiz_NetInfo *netinfo)
90 {
91  wiz_NetInfo cur;
92  LOG("---------------------------------------");
93  if(netinfo == NULL) {
94  GetNetInfo(&cur);
95  netinfo = &cur;
96  LOG("---------------------------------------");
97  LOG("Current Network Configuration ");
98  }
99 
100  LOG("---------------------------------------");
101  LOGA("MAC : %02X:%02X:%02X:%02X:%02X:%02X", netinfo->mac[0], netinfo->mac[1],
102  netinfo->mac[2], netinfo->mac[3], netinfo->mac[4], netinfo->mac[5]);
103  LOGA("IP : %d.%d.%d.%d", netinfo->ip[0], netinfo->ip[1], netinfo->ip[2], netinfo->ip[3]);
104  LOGA("SN : %d.%d.%d.%d", netinfo->sn[0], netinfo->sn[1], netinfo->sn[2], netinfo->sn[3]);
105  LOGA("GW : %d.%d.%d.%d", netinfo->gw[0], netinfo->gw[1], netinfo->gw[2], netinfo->gw[3]);
106  LOG("---------------------------------------");
107 }
108 
121 int8_t sockwatch_open(uint8_t sock, watch_cbfunc cb)
122 {
123  DBGA("WATCH Open - sock(%d), CB(%p)", sock, (void*)cb);
124  if(cb == NULL || sock >= _WIZCHIP_SOCK_NUM_) {
125  ERRA("wrong arg - sock(%d)", sock);
126  return RET_NOK;
127  }
128  if(watch_cb[sock] == NULL) watch_cb[sock] = cb;
129  else return RET_NOK;
130 
131  return RET_OK;
132 }
133 
142 int8_t sockwatch_close(uint8_t sock)
143 {
144  DBGA("WATCH Close - sock(%d)", sock);
145  if(sock >= _WIZCHIP_SOCK_NUM_) {
146  ERRA("wrong sock(%d)", sock);
147  return RET_NOK;
148  }
149 
151  watch_cb[sock] = NULL;
152 
153  return RET_OK;
154 }
155 
168 int8_t sockwatch_set(uint8_t sock, uint8_t item)
169 {
170  DBGA("WATCH Set - sock(%d), item(0x%x)", sock, item);
171  if(sock >= _WIZCHIP_SOCK_NUM_) {
172  ERRA("wrong sock(%d)", sock);
173  return RET_NOK;
174  }
175 
176  BITSET(watch_sock[sock], 0x7F & item);
177 
178  return RET_OK;
179 }
180 
192 int8_t sockwatch_clr(uint8_t sock, uint8_t item)
193 {
194  DBGA("WATCH Clear - sock(%d), item(0x%x)", sock, item);
195  if(sock >= _WIZCHIP_SOCK_NUM_) {
196  ERRA("wrong sock(%d)", sock);
197  return RET_NOK;
198  }
199 
200  BITCLR(watch_sock[sock], 0x7F & item);
201 
202  return RET_OK;
203 }
204 
214 int8_t sockwatch_chk(uint8_t sock, uint8_t item)
215 {
216  if((sock < _WIZCHIP_SOCK_NUM_) && (watch_sock[sock] & item))
217  return RET_OK;
218 
219  return RET_NOK;
220 }
221 
227 void sockwatch_run(void)
228 {
229 #define WCF_HANDLE(item_v, ret_v) \
230 do { \
231  BITCLR(watch_sock[i], item_v); \
232  watch_cb[i](i, item_v, ret_v); \
233 } while(0)
234 
235  uint8_t i;
236  int32_t ret;
237 
238  for(i=0; i<_WIZCHIP_SOCK_NUM_; i++) {
239  if(watch_sock[i] == 0) continue;
240  if(watch_sock[i] & WATCH_SOCK_RECV) { // checked every time when 'connected' state
241  if(GetSocketRxRecvBufferSize(i) > 0) WCF_HANDLE(WATCH_SOCK_RECV, RET_OK);
242  }
243  if(watch_sock[i] & WATCH_SOCK_CLS_EVT) { // checked every time when 'connected' state
244  ret = TCPClsRcvCHK(i);
245  if(ret != SOCKERR_BUSY) WCF_HANDLE(WATCH_SOCK_CLS_EVT, ret);
246  }
247  if(watch_sock[i] & WATCH_SOCK_CONN_EVT) { // checked every time when 'listen' state
248  ret = TCPConnChk(i);
249  if(ret != SOCKERR_BUSY) WCF_HANDLE(WATCH_SOCK_CONN_EVT, ret);
250  }
251  if((watch_sock[i] & WATCH_SOCK_MASK_LOW) == 0) continue; // things which occurs occasionally will be checked all together
252  if(watch_sock[i] & WATCH_SOCK_CLS_TRY) {
253  ret = TCPCloseCHK(i);
254  if(ret != SOCKERR_BUSY) WCF_HANDLE(WATCH_SOCK_CLS_TRY, ret);
255  }
256  if(watch_sock[i] & WATCH_SOCK_CONN_TRY) {
257  ret = TCPConnChk(i);
258  if(ret != SOCKERR_BUSY) WCF_HANDLE(WATCH_SOCK_CONN_TRY, ret);
259  }
260  if(watch_sock[i] & WATCH_SOCK_TCP_SEND) {
261  ret = TCPSendCHK(i);
262  if(ret != SOCKERR_BUSY) WCF_HANDLE(WATCH_SOCK_TCP_SEND, ret);
263  }
264  if(watch_sock[i] & WATCH_SOCK_UDP_SEND) {
265  ret = UDPSendCHK(i);
266  if(ret != SOCKERR_BUSY) WCF_HANDLE(WATCH_SOCK_UDP_SEND, ret);
267  }
268  }
269 
270  // ToDo: not socket part
271 
272 }
273 
282 int8_t ip_check(int8_t *str, uint8_t *ip)
283 {
284  uint8_t cnt=0;
285  int8_t tmp[16], *split;
286  int32_t digit, sumchk = 0;
287 
288  digit = strlen((char*)str);
289  if(digit > 15 || digit < 7) {
290  return RET_NOK;
291  }
292 
293  strcpy((char*)tmp, (char*)str);
294  split = (int8_t*)strtok((char*)tmp, ".");
295  while(split != NULL && str_check(isdigit, split) == RET_OK) {
296  digit = atoi((char*)split);
297  if(digit > 255 || digit < 0) return RET_NOK;
298  if(ip) ip[cnt] = digit;
299  sumchk += digit;
300  cnt++;
301  split = (int8_t*)strtok(NULL, ".");
302  }
303 
304  if(cnt != 4 || sumchk == 0) { //printf("not 4 digit (%d)\r\n", cnt);
305  return RET_NOK;
306  }
307 
308  return RET_OK;
309 }
310 
319 int8_t port_check(int8_t *str, uint16_t *port)
320 {
321  int8_t *ptr;
322  uint32_t val;
323 
324  val = strtol((char*)str, (char**)&ptr, 10); //printf("ptr(%p, %x), arg(%p), val(%d)\r\n", ptr, *ptr, str, val);
325 
326  if(val == 0 || val > 65535 || *ptr != 0) return RET_NOK;
327  if(port) *port = val;
328 
329  return RET_OK;
330 }
331 
340 int8_t mac_check(int8_t *str, uint8_t *mac)
341 {
342  uint8_t cnt=0;
343  int8_t tmp[18], *split;
344  int32_t digit;
345 
346  if(strlen((char*)str) != 17) {
347  return RET_NOK;
348  }
349 
350  strcpy((char*)tmp, (char*)str);
351  split = (int8_t*)strtok((char*)tmp, ":");
352  while(split != NULL && str_check(isxdigit, split) == RET_OK) {
353  digit = strtol((char*)split, NULL, 16);
354  if(digit > 255 || digit < 0) return RET_NOK;
355  if(mac) mac[cnt] = digit;
356  cnt++;
357  split = (int8_t*)strtok(NULL, ":");
358  }
359 
360  if(cnt != 6) { //printf("not 6 digit (%d)\r\n", cnt);
361  return RET_NOK;
362  }
363 
364  return RET_OK;
365 }
366 
373 int8_t* inet_ntoa(uint32_t addr)
374 {
375  static int8_t addr_str[16];
376  memset(addr_str,0,16);
377  sprintf((char*)addr_str,"%d.%d.%d.%d",(int32_t)(addr>>24 & 0xFF),(int32_t)(addr>>16 & 0xFF),(int32_t)(addr>>8 & 0xFF),(int32_t)(addr & 0xFF));
378  return addr_str;
379 }
380 
388 int8_t* inet_ntoa_pad(uint32_t addr)
389 {
390  static int8_t addr_str[16];
391  memset(addr_str,0,16);
392  sprintf((char*)addr_str,"%03d.%03d.%03d.%03d",(int32_t)(addr>>24 & 0xFF),(int32_t)(addr>>16 & 0xFF),(int32_t)(addr>>8 & 0xFF),(int32_t)(addr & 0xFF));
393  return addr_str;
394 }
395 
402 uint32_t inet_addr(uint8_t* addr)
403 {
404  int8_t i;
405  uint32_t inetaddr = 0;
406  int8_t taddr[30];
407  int8_t * nexttok;
408  int32_t num;
409  strcpy((char*)taddr,(char*)addr);
410 
411  nexttok = taddr;
412  for(i = 0; i < 4 ; i++)
413  {
414  nexttok = (int8_t*)strtok((char*)nexttok,".");
415  if(nexttok[0] == '0' && nexttok[1] == 'x') num = strtol((char*)nexttok+2, NULL, 16);
416  else num = strtol((char*)nexttok, NULL, 10);
417  inetaddr = inetaddr << 8;
418  inetaddr |= (num & 0xFF);
419  nexttok = NULL;
420  }
421  return inetaddr;
422 }
423 
430 uint16_t swaps(uint16_t i)
431 {
432  uint16_t ret=0;
433  ret = (i & 0xFF) << 8;
434  ret |= ((i >> 8)& 0xFF);
435  return ret;
436 }
437 
444 uint32_t swapl(uint32_t l)
445 {
446  uint32_t ret=0;
447  ret = (l & 0xFF) << 24;
448  ret |= ((l >> 8) & 0xFF) << 16;
449  ret |= ((l >> 16) & 0xFF) << 8;
450  ret |= ((l >> 24) & 0xFF);
451  return ret;
452 }
453 
460 uint16_t htons(uint16_t hostshort)
461 {
462 #ifdef SYSTEM_LITTLE_ENDIAN
463  return swaps(hostshort);
464 #else
465  return hostshort;
466 #endif
467 }
468 
469 
476 uint32_t htonl(uint32_t hostlong)
477 {
478 #ifdef SYSTEM_LITTLE_ENDIAN
479  return swapl(hostlong);
480 #else
481  return hostlong;
482 #endif
483 }
484 
485 
493 uint32_t ntohs(uint16_t netshort)
494 {
495 #ifdef SYSTEM_LITTLE_ENDIAN
496  return htons(netshort);
497 #else
498  return netshort;
499 #endif
500 }
501 
509 uint32_t ntohl(uint32_t netlong)
510 {
511 #ifdef SYSTEM_LITTLE_ENDIAN
512  return swapl(netlong);
513 #else
514  return netlong;
515 #endif
516 }