io6Library
WIZnet Dual Stack TCP/IP Ethernet Controller Driver
socket.c
Go to the documentation of this file.
1 //* ****************************************************************************
35 //*****************************************************************************
36 
37 #include <stdio.h>
38 #include "socket.h"
39 #include "w6100.h"
40 
41 #define SOCK_ANY_PORT_NUM 0x0400
42 
43 static uint16_t sock_any_port = SOCK_ANY_PORT_NUM;
44 static uint16_t sock_io_mode = 0;
45 static uint16_t sock_is_sending = 0;
46 static datasize_t sock_remained_size[_WIZCHIP_SOCK_NUM_] = {0,0,};
47 static uint8_t sock_pack_info[_WIZCHIP_SOCK_NUM_] = {0,};
48 
49 
50 #define CHECK_SOCKNUM() \
51  do{ \
52  if(sn >= _WIZCHIP_SOCK_NUM_) return SOCKERR_SOCKNUM; \
53  }while(0);
54 
55 #define CHECK_SOCKMODE(mode) \
56  do{ \
57  if((getSn_MR(sn) & 0x0F) != mode) return SOCKERR_SOCKMODE; \
58  }while(0);
59 
60 #define CHECK_TCPMODE() \
61  do{ \
62  if((getSn_MR(sn) & 0x03) != 0x01) return SOCKERR_SOCKMODE; \
63  }while(0);
64 
65 #define CHECK_UDPMODE() \
66  do{ \
67  if((getSn_MR(sn) & 0x03) != 0x02) return SOCKERR_SOCKMODE; \
68  }while(0);
69 
70 #define CHECK_IPMODE() \
71  do{ \
72  if((getSn_MR(sn) & 0x07) != 0x03) return SOCKERR_SOCKMODE; \
73  }while(0);
74 
75 #define CHECK_DGRAMMODE() \
76  do{ \
77  if(getSn_MR(sn) == Sn_MR_CLOSED) return SOCKERR_SOCKMODE; \
78  if((getSn_MR(sn) & 0x03) == 0x01) return SOCKERR_SOCKMODE; \
79  }while(0);
80 
81 
82 #define CHECK_SOCKINIT() \
83  do{ \
84  if((getSn_SR(sn) != SOCK_INIT)) return SOCKERR_SOCKINIT; \
85  }while(0);
86 
87 #define CHECK_SOCKDATA() \
88  do{ \
89  if(len == 0) return SOCKERR_DATALEN; \
90  }while(0);
91 
92 #define CHECK_IPZERO(addr, addrlen) \
93  do{ \
94  uint16_t ipzero= 0; \
95  for(uint8_t i=0; i<addrlen; i++) ipzero += (uint16_t)addr[i]; \
96  if (ipzero == 0) return SOCKERR_IPINVALID; \
97  }while(0);
98 
99 
100 
101 int8_t socket(uint8_t sn, uint8_t protocol, uint16_t port, uint8_t flag)
102 {
103  uint8_t taddr[16];
104  uint16_t local_port=0;
105  CHECK_SOCKNUM();
106  switch (protocol & 0x0F)
107  {
108  case Sn_MR_TCP4 :
109  getSIPR(taddr);
110  CHECK_IPZERO(taddr, 4);
111  break;
112  case Sn_MR_TCP6 :
113  getLLAR(taddr);
114  CHECK_IPZERO(taddr, 16);
115  //getGUAR(taddr);
116  //CHECK_IPZERO(taddr, 16);
117  break;
118  case Sn_MR_TCPD :
119  getSIPR(taddr);
120  CHECK_IPZERO(taddr, 4);
121  getLLAR(taddr);
122  CHECK_IPZERO(taddr, 16);
123  //getGUAR(taddr);
124  //CHECK_IPZERO(taddr, 16);
125  break;
126  case Sn_MR_UDP :
127  case Sn_MR_UDP6 :
128  case Sn_MR_UDPD :
129  case Sn_MR_MACRAW :
130  case Sn_MR_IPRAW4 :
131  case Sn_MR_IPRAW6 :
132  break;
133  default :
134  return SOCKERR_SOCKMODE;
135  }
136 
137  if((flag & 0x04)) return SOCKERR_SOCKFLAG;
138  if(flag != 0)
139  {
140  switch(protocol)
141  {
142  case Sn_MR_MACRAW:
143  if((flag & (SF_DHA_MANUAL | SF_FORCE_ARP)) != 0)
144  return SOCKERR_SOCKFLAG;
145  break;
146  case Sn_MR_TCP4:
147  case Sn_MR_TCP6:
148  case Sn_MR_TCPD:
149  if((flag & (SF_MULTI_ENABLE | SF_UNI_BLOCK)) !=0)
150  return SOCKERR_SOCKFLAG;
151  break;
152  case Sn_MR_IPRAW4:
153  case Sn_MR_IPRAW6:
154  if(flag !=0)
155  return SOCKERR_SOCKFLAG;
156  break;
157  default:
158  break;
159  }
160  }
161  close(sn);
162  setSn_MR(sn,(protocol | (flag & 0xF0)));
163  setSn_MR2(sn, flag & 0x03);
164  if(!port)
165  {
166  port = sock_any_port++;
167  if(sock_any_port == 0xFFF0) sock_any_port = SOCK_ANY_PORT_NUM;
168  }
169  setSn_PORTR(sn,port);
170  setSn_CR(sn,Sn_CR_OPEN);
171 
172  while(getSn_CR(sn));
173 
174  sock_io_mode &= ~(1 <<sn);
175  sock_io_mode |= ((flag & (SF_IO_NONBLOCK>>3)) << sn);
176  sock_is_sending &= ~(1<<sn);
177  sock_remained_size[sn] = 0;
178  sock_pack_info[sn] = PACK_NONE;
179 
180  while(getSn_SR(sn) == SOCK_CLOSED) ;
181 // printf("[%d]%d\r\n", sn, getSn_PORTR(sn));
182  return sn;
183 }
184 
185 
186 int8_t close(uint8_t sn)
187 {
188  CHECK_SOCKNUM();
189  setSn_CR(sn,Sn_CR_CLOSE);
190  /* wait to process the command... */
191  while( getSn_CR(sn) );
192  /* clear all interrupt of SOCKETn. */
193  setSn_IRCLR(sn, 0xFF);
194  /* Release the sock_io_mode of SOCKETn. */
195  sock_io_mode &= ~(1<<sn);
196  sock_remained_size[sn] = 0;
197  sock_is_sending &= ~(1<<sn);
198  sock_pack_info[sn] = PACK_NONE;
199  while(getSn_SR(sn) != SOCK_CLOSED);
200  return SOCK_OK;
201 }
202 
203 
204 int8_t listen(uint8_t sn)
205 {
206  CHECK_SOCKNUM();
207  CHECK_SOCKINIT();
209  while(getSn_CR(sn));
210  while(getSn_SR(sn) != SOCK_LISTEN)
211  {
212  close(sn);
213  return SOCKERR_SOCKCLOSED;
214  }
215  return SOCK_OK;
216 }
217 
218 
219 int8_t connect(uint8_t sn, uint8_t * addr, uint16_t port, uint8_t addrlen)
220 {
221 
222  CHECK_SOCKNUM();
223  CHECK_TCPMODE();
224  CHECK_SOCKINIT();
225 
226  CHECK_IPZERO(addr, addrlen);
227  if(port == 0)
228  return SOCKERR_PORTZERO;
229 
230  setSn_DPORTR(sn, port);
231 
232  if (addrlen == 16) // addrlen=16, Sn_MR_TCP6(1001), Sn_MR_TCPD(1101))
233  {
234  if( getSn_MR(sn) & 0x08)
235  {
236  setSn_DIP6R(sn,addr);
238  }
239  else return SOCKERR_SOCKMODE;
240  }
241  else // addrlen=4, Sn_MR_TCP4(0001), Sn_MR_TCPD(1101)
242  {
243  if(getSn_MR(sn) == Sn_MR_TCP6) return SOCKERR_SOCKMODE;
244  setSn_DIPR(sn,addr);
246  }
247  while(getSn_CR(sn));
248 
249  if(sock_io_mode & (1<<sn)) return SOCK_BUSY;
250 
251  while(getSn_SR(sn) != SOCK_ESTABLISHED)
252  {
253  if (getSn_IR(sn) & Sn_IR_TIMEOUT)
254  {
256  return SOCKERR_TIMEOUT;
257  }
258  if (getSn_SR(sn) == SOCK_CLOSED)
259  {
260  return SOCKERR_SOCKCLOSED;
261  }
262  }
263  return SOCK_OK;
264 }
265 
266 int8_t disconnect(uint8_t sn)
267 {
268  CHECK_SOCKNUM();
269  CHECK_TCPMODE();
270  if(getSn_SR(sn) != SOCK_CLOSED)
271  {
273  /* wait to process the command... */
274  while(getSn_CR(sn));
275  if(sock_io_mode & (1<<sn)) return SOCK_BUSY;
276  while(getSn_SR(sn) != SOCK_CLOSED)
277  {
278  if(getSn_IR(sn) & Sn_IR_TIMEOUT)
279  {
280  close(sn);
281  return SOCKERR_TIMEOUT;
282  }
283  }
284  }
285  return SOCK_OK;
286 }
287 
288 
289 datasize_t send(uint8_t sn, uint8_t * buf, datasize_t len)
290 {
291  uint8_t tmp=0;
292  datasize_t freesize=0;
293  /*
294  * The below codes can be omitted for optmization of speed
295  */
296  //CHECK_SOCKNUM();
297  //CHECK_TCPMODE(Sn_MR_TCP4);
298  /************/
299 
300  freesize = getSn_TxMAX(sn);
301  if (len > freesize) len = freesize; // check size not to exceed MAX size.
302  while(1)
303  {
304  freesize = (datasize_t)getSn_TX_FSR(sn);
305  tmp = getSn_SR(sn);
306  if ((tmp != SOCK_ESTABLISHED) && (tmp != SOCK_CLOSE_WAIT))
307  {
308  if(tmp == SOCK_CLOSED) close(sn);
309  return SOCKERR_SOCKSTATUS;
310  }
311  if(len <= freesize) break;
312  if( sock_io_mode & (1<<sn) ) return SOCK_BUSY;
313  }
314  wiz_send_data(sn, buf, len);
315  if(sock_is_sending & (1<<sn))
316  {
317  while ( !(getSn_IR(sn) & Sn_IR_SENDOK) )
318  {
319  tmp = getSn_SR(sn);
320  if ((tmp != SOCK_ESTABLISHED) && (tmp != SOCK_CLOSE_WAIT) )
321  {
322  if( (tmp == SOCK_CLOSED) || (getSn_IR(sn) & Sn_IR_TIMEOUT) ) close(sn);
323  return SOCKERR_SOCKSTATUS;
324  }
325  if(sock_io_mode & (1<<sn)) return SOCK_BUSY;
326  }
328  }
329  setSn_CR(sn,Sn_CR_SEND);
330 
331  while(getSn_CR(sn)); // wait to process the command...
332  sock_is_sending |= (1<<sn);
333 
334  return len;
335 }
336 
337 
338 datasize_t recv(uint8_t sn, uint8_t * buf, datasize_t len)
339 {
340  uint8_t tmp = 0;
341  datasize_t recvsize = 0;
342  /*
343  * The below codes can be omitted for optmization of speed
344  */
345  //CHECK_SOCKNUM();
346  //CHECK_TCPMODE();
347  //CHECK_SOCKDATA();
348  /************/
349 
350  recvsize = getSn_RxMAX(sn);
351  if(recvsize < len) len = recvsize;
352  while(1)
353  {
354  recvsize = (datasize_t)getSn_RX_RSR(sn);
355  tmp = getSn_SR(sn);
356  if (tmp != SOCK_ESTABLISHED && tmp != SOCK_CLOSE_WAIT)
357  {
358  if(tmp == SOCK_CLOSED) close(sn);
359  return SOCKERR_SOCKSTATUS;
360  }
361  if(recvsize) break;
362  if(sock_io_mode & (1<<sn)) return SOCK_BUSY;
363  }
364  if(recvsize < len) len = recvsize;
365  wiz_recv_data(sn, buf, len);
366  setSn_CR(sn,Sn_CR_RECV);
367  while(getSn_CR(sn));
368  return len;
369 }
370 
371 
372 datasize_t sendto(uint8_t sn, uint8_t * buf, datasize_t len, uint8_t * addr, uint16_t port, uint8_t addrlen)
373 {
374  uint8_t tmp = 0;
375  uint8_t tcmd = Sn_CR_SEND;
376  uint16_t freesize = 0;
377  /*
378  * The below codes can be omitted for optmization of speed
379  */
380  //CHECK_SOCKNUM();
381  //CHECK_DGRAMMODE();
382  /************/
383  tmp = getSn_MR(sn);
384  if(tmp != Sn_MR_MACRAW)
385  {
386  if (addrlen == 16) // addrlen=16, Sn_MR_UDP6(1010), Sn_MR_UDPD(1110)), IPRAW6(1011)
387  {
388  if( tmp & 0x08)
389  {
390  setSn_DIP6R(sn,addr);
391  tcmd = Sn_CR_SEND6;
392  }
393  else return SOCKERR_SOCKMODE;
394  }
395  else if(addrlen == 4) // addrlen=4, Sn_MR_UDP4(0010), Sn_MR_UDPD(1110), IPRAW4(0011)
396  {
397  if(tmp == Sn_MR_UDP6 || tmp == Sn_MR_IPRAW6) return SOCKERR_SOCKMODE;
398  setSn_DIPR(sn,addr);
399  tcmd = Sn_CR_SEND;
400  }
401  else return SOCKERR_IPINVALID;
402  }
403  if((tmp & 0x03)==0x02) // Sn_MR_UPD4(0010), Sn_MR_UDP6(1010), Sn_MR_UDPD(1110)
404  {
405  if(port){ setSn_DPORTR(sn, port);}
406  else return SOCKERR_PORTZERO;
407  }
408 
409  freesize = getSn_TxMAX(sn);
410  if (len > freesize) len = freesize; // check size not to exceed MAX size.
411 
412  while(1)
413  {
414  freesize = getSn_TX_FSR(sn);
415  if(getSn_SR(sn) == SOCK_CLOSED) return SOCKERR_SOCKCLOSED;
416  if(len <= freesize) break;
417  if( sock_io_mode & (1<<sn) ) return SOCK_BUSY;
418  }
419  wiz_send_data(sn, buf, len);
420  setSn_CR(sn,tcmd);
421  while(getSn_CR(sn));
422 
423  while(1)
424  {
425  tmp = getSn_IR(sn);
426  if(tmp & Sn_IR_SENDOK)
427  {
429  break;
430  }
431  else if(tmp & Sn_IR_TIMEOUT)
432  {
434  return SOCKERR_TIMEOUT;
435  }
436  }
437  return (int32_t)len;
438 }
439 
440 
441 datasize_t recvfrom(uint8_t sn, uint8_t * buf, datasize_t len, uint8_t * addr, uint16_t *port, uint8_t *addrlen)
442 {
443  uint8_t head[2];
444  datasize_t pack_len=0;
445 
446  /*
447  * The below codes can be omitted for optmization of speed
448  */
449  //CHECK_SOCKNUM();
450  //CHECK_DGRAMMODE();
451  //CHECK_SOCKDATA();
452  /************/
453 
454  if(sock_remained_size[sn] == 0)
455  {
456  while(1)
457  {
458  pack_len = getSn_RX_RSR(sn);
459  if(getSn_SR(sn) == SOCK_CLOSED) return SOCKERR_SOCKCLOSED;
460  if(pack_len != 0)
461  {
462  sock_pack_info[sn] = PACK_NONE;
463  break;
464  }
465  if( sock_io_mode & (1<<sn) ) return SOCK_BUSY;
466  };
467  /* First read 2 bytes of PACKET INFO in SOCKETn RX buffer*/
468  wiz_recv_data(sn, head, 2);
469  setSn_CR(sn,Sn_CR_RECV);
470  while(getSn_CR(sn));
471  pack_len = head[0] & 0x07;
472  pack_len = (pack_len << 8) + head[1];
473 
474  switch (getSn_MR(sn) & 0x0F)
475  {
476  case Sn_MR_UDP4 :
477  case Sn_MR_UDP6:
478  case Sn_MR_UDPD:
479  case Sn_MR_IPRAW6:
480  case Sn_MR_IPRAW4 :
481  if(addr == 0) return SOCKERR_ARG;
482  sock_pack_info[sn] = head[0] & 0xF8;
483  if(sock_pack_info[sn] & PACK_IPv6) *addrlen = 16;
484  else *addrlen = 4;
485  wiz_recv_data(sn, addr, *addrlen);
486  setSn_CR(sn,Sn_CR_RECV);
487  while(getSn_CR(sn));
488  break;
489  case Sn_MR_MACRAW :
490  pack_len-=2;
491  if(pack_len > 1514)
492  {
493  close(sn);
494  return SOCKFATAL_PACKLEN;
495  }
496  break;
497  default:
498  return SOCKERR_SOCKMODE;
499  break;
500  }
501  sock_remained_size[sn] = pack_len;
502  sock_pack_info[sn] |= PACK_FIRST;
503  if((getSn_MR(sn) & 0x03) == 0x02) // Sn_MR_UDP4(0010), Sn_MR_UDP6(1010), Sn_MR_UDPD(1110)
504  {
505  /* Read port number of PACKET INFO in SOCKETn RX buffer */
506  if(port==0) return SOCKERR_ARG;
507  wiz_recv_data(sn, head, 2);
508  *port = ( ((((uint16_t)head[0])) << 8) + head[1] );
509  setSn_CR(sn,Sn_CR_RECV);
510  while(getSn_CR(sn));
511  }
512  }
513 
514  if (len < sock_remained_size[sn]) pack_len = len;
515  else pack_len = sock_remained_size[sn];
516  wiz_recv_data(sn, buf, pack_len);
517  setSn_CR(sn,Sn_CR_RECV);
518  /* wait to process the command... */
519  while(getSn_CR(sn)) ;
520 
521  sock_remained_size[sn] -= pack_len;
522  if(sock_remained_size[sn] != 0) sock_pack_info[sn] |= PACK_REMAINED;
523  else sock_pack_info[sn] |= PACK_COMPLETED;
524 
525  return pack_len;
526 }
527 
528 int8_t ctlsocket(uint8_t sn, ctlsock_type cstype, void* arg)
529 {
530  uint8_t tmp = 0;
531  CHECK_SOCKNUM();
532  tmp = *((uint8_t*)arg);
533  switch(cstype)
534  {
535  case CS_SET_IOMODE:
536  if(tmp == SOCK_IO_NONBLOCK) sock_io_mode |= (1<<sn);
537  else if(tmp == SOCK_IO_BLOCK) sock_io_mode &= ~(1<<sn);
538  else return SOCKERR_ARG;
539  break;
540  case CS_GET_IOMODE:
541  *((uint8_t*)arg) = (uint8_t)((sock_io_mode >> sn) & 0x0001);
542  break;
543  case CS_GET_MAXTXBUF:
544  *((datasize_t*)arg) = getSn_TxMAX(sn);
545  break;
546  case CS_GET_MAXRXBUF:
547  *((datasize_t*)arg) = getSn_RxMAX(sn);
548  break;
549  case CS_CLR_INTERRUPT:
550  if( tmp > SIK_ALL) return SOCKERR_ARG;
551  setSn_IRCLR(sn,tmp);
552  break;
553  case CS_GET_INTERRUPT:
554  *((uint8_t*)arg) = getSn_IR(sn);
555  break;
556  case CS_SET_INTMASK:
557  if( tmp > SIK_ALL) return SOCKERR_ARG;
558  setSn_IMR(sn,tmp);
559  break;
560  case CS_GET_INTMASK:
561  *((uint8_t*)arg) = getSn_IMR(sn);
562  break;
563  case CS_SET_PREFER:
564  if((tmp & 0x03) == 0x01) return SOCKERR_ARG;
565  setSn_PSR(sn, tmp);
566  break;
567  case CS_GET_PREFER:
568  *(uint8_t*) arg = getSn_PSR(sn);
569  break;
570  default:
571  return SOCKERR_ARG;
572  }
573  return SOCK_OK;
574 }
575 
576 int8_t setsockopt(uint8_t sn, sockopt_type sotype, void* arg)
577 {
578  CHECK_SOCKNUM();
579  switch(sotype)
580  {
581  case SO_TTL:
582  setSn_TTLR(sn,*(uint8_t*)arg);
583  break;
584  case SO_TOS:
585  setSn_TOSR(sn,*(uint8_t*)arg);
586  break;
587  case SO_MSS:
588  setSn_MSSR(sn,*(uint16_t*)arg);
589  break;
590  case SO_DESTIP:
591  if(((wiz_IPAddress*)arg)->len == 16) setSn_DIP6R(sn, ((wiz_IPAddress*)arg)->ip);
592  else setSn_DIPR(sn, ((wiz_IPAddress*)arg)->ip);
593  break;
594  case SO_DESTPORT:
595  setSn_DPORTR(sn, *(uint16_t*)arg);
596  break;
597  case SO_KEEPALIVESEND:
598  CHECK_TCPMODE();
599  if(getSn_KPALVTR(sn) != 0) return SOCKERR_SOCKOPT;
601  while(getSn_CR(sn) != 0)
602  {
603  if (getSn_IR(sn) & Sn_IR_TIMEOUT)
604  {
606  return SOCKERR_TIMEOUT;
607  }
608  }
609  break;
610  case SO_KEEPALIVEAUTO:
611  CHECK_TCPMODE();
612  setSn_KPALVTR(sn,*(uint8_t*)arg);
613  break;
614  default:
615  return SOCKERR_ARG;
616  }
617  return SOCK_OK;
618 }
619 
620 int8_t getsockopt(uint8_t sn, sockopt_type sotype, void* arg)
621 {
622  CHECK_SOCKNUM();
623  switch(sotype)
624  {
625  case SO_FLAG:
626  *(uint8_t*)arg = (getSn_MR(sn) & 0xF0) | (getSn_MR2(sn)) | ((uint8_t)(((sock_io_mode >> sn) & 0x0001) << 3));
627  break;
628  case SO_TTL:
629  *(uint8_t*) arg = getSn_TTLR(sn);
630  break;
631  case SO_TOS:
632  *(uint8_t*) arg = getSn_TOSR(sn);
633  break;
634  case SO_MSS:
635  *(uint16_t*) arg = getSn_MSSR(sn);
636  break;
637  case SO_DESTIP:
638  CHECK_TCPMODE();
639  if(getSn_ESR(sn) & TCPSOCK_MODE) //IPv6 ?
640  {
641  getSn_DIP6R(sn, ((wiz_IPAddress*)arg)->ip);
642  ((wiz_IPAddress*)arg)->len = 16;
643  }
644  else
645  {
646  getSn_DIPR(sn, ((wiz_IPAddress*)arg)->ip);
647  ((wiz_IPAddress*)arg)->len = 4;
648  }
649  break;
650  case SO_DESTPORT:
651  *(uint16_t*) arg = getSn_DPORTR(sn);
652  break;
653  case SO_KEEPALIVEAUTO:
654  CHECK_TCPMODE();
655  *(uint16_t*) arg = getSn_KPALVTR(sn);
656  break;
657  case SO_SENDBUF:
658  *(datasize_t*) arg = getSn_TX_FSR(sn);
659  break;
660  case SO_RECVBUF:
661  *(datasize_t*) arg = getSn_RX_RSR(sn);
662  break;
663  case SO_STATUS:
664  *(uint8_t*) arg = getSn_SR(sn);
665  break;
666  case SO_EXTSTATUS:
667  CHECK_TCPMODE();
668  *(uint8_t*) arg = getSn_ESR(sn) & 0x07;
669  break;
670  case SO_REMAINSIZE:
671  if(getSn_MR(sn)==SOCK_CLOSED) return SOCKERR_SOCKSTATUS;
672  if(getSn_MR(sn) & 0x01) *(uint16_t*)arg = getSn_RX_RSR(sn);
673  else *(uint16_t*)arg = sock_remained_size[sn];
674  break;
675  case SO_PACKINFO:
676  if(getSn_MR(sn)==SOCK_CLOSED) return SOCKERR_SOCKSTATUS;
677  if(getSn_MR(sn) & 0x01) return SOCKERR_SOCKMODE;
678  else *(uint8_t*)arg = sock_pack_info[sn];
679  break;
680  case SO_MODE:
681  *(uint8_t*) arg = 0x0F & getSn_MR(sn);
682  break;
683  default:
684  return SOCKERR_SOCKOPT;
685  }
686  return SOCK_OK;
687 }
688 
689 int16_t peeksockmsg(uint8_t sn, uint8_t* submsg, uint16_t subsize)
690 {
691  uint32_t rx_ptr = 0;
692  uint16_t i = 0, sub_idx = 0;
693 
694  if( (getSn_RX_RSR(sn) > 0) && (subsize > 0) )
695  {
696  rx_ptr = ((uint32_t)getSn_RX_RD(sn) << 8) + WIZCHIP_RXBUF_BLOCK(sn);
697  sub_idx = 0;
698  for(i = 0; i < getSn_RX_RSR(sn) ; i++)
699  {
700  if(WIZCHIP_READ(rx_ptr) == submsg[sub_idx])
701  {
702  sub_idx++;
703  if(sub_idx == subsize) return (i + 1 - sub_idx);
704  }
705  else sub_idx = 0;
706  rx_ptr = WIZCHIP_OFFSET_INC(rx_ptr,1);
707  }
708  }
709  return -1;
710 }
getSIPR
#define getSIPR(sipr)
Definition: w6100.h:3622
sendto
datasize_t sendto(uint8_t sn, uint8_t *buf, datasize_t len, uint8_t *addr, uint16_t port, uint8_t addrlen)
Send datagram to the peer specifed by destination IP address and port number passed as parameter.
Definition: socket.c:372
getSn_DPORTR
#define getSn_DPORTR(sn)
Definition: w6100.h:3911
recv
datasize_t recv(uint8_t sn, uint8_t *buf, datasize_t len)
Receive data from the connected peer.
Definition: socket.c:338
Sn_CR_RECV
#define Sn_CR_RECV
Receive data.
Definition: w6100.h:2691
SF_MULTI_ENABLE
#define SF_MULTI_ENABLE
In UDP mode such as Sn_MR_UDP4 and Sn_MR_UDP6, Sn_MR_UDP6, Enable multicast mode. When Sn_MR_UDP6,...
Definition: socket.h:127
setSn_DIP6R
#define setSn_DIP6R(sn, dip6r)
Definition: w6100.h:3901
CHECK_SOCKNUM
#define CHECK_SOCKNUM()
Definition: socket.c:50
SOCK_BUSY
#define SOCK_BUSY
Socket is busy on processing the operation. Valid only Non-block IO Mode.
Definition: socket.h:83
Sn_CR_SEND_KEEP
#define Sn_CR_SEND_KEEP
Send keep alive message.
Definition: w6100.h:2675
getSn_MSSR
#define getSn_MSSR(sn)
Definition: w6100.h:3877
socket
int8_t socket(uint8_t sn, uint8_t protocol, uint16_t port, uint8_t flag)
Open a socket.
Definition: socket.c:101
setSn_CR
#define setSn_CR(sn, cr)
Definition: w6100.h:3820
Sn_MR_TCP4
#define Sn_MR_TCP4
Refer to Sn_MR_TCP.
Definition: w6100.h:2392
SO_SENDBUF
@ SO_SENDBUF
Valid only in getsockopt(). Get the free data size of SOCKETn TX buffer. getSn_TX_FSR()
Definition: socket.h:446
setSn_DIPR
#define setSn_DIPR(sn, dipr)
Definition: w6100.h:3893
SOCKERR_TIMEOUT
#define SOCKERR_TIMEOUT
Timeout occurred.
Definition: socket.h:97
getSn_PSR
#define getSn_PSR(sn)
Definition: w6100.h:3817
connect
int8_t connect(uint8_t sn, uint8_t *addr, uint16_t port, uint8_t addrlen)
Try to connect to a TCP SERVER.
Definition: socket.c:219
SOCK_CLOSE_WAIT
#define SOCK_CLOSE_WAIT
TCP SOCKETn Half Closing staus.
Definition: w6100.h:2863
TCPSOCK_MODE
#define TCPSOCK_MODE
It indicates the IP version when SOCKETn is opened as TCP6 or TCPD mode.(0 - IPv4 ,...
Definition: socket.h:177
SO_DESTPORT
@ SO_DESTPORT
Set/Get the destination Port number. To get it, SOCKETn should be TCP mode.
Definition: socket.h:443
getSn_RX_RD
#define getSn_RX_RD(sn)
Definition: w6100.h:3980
PACK_COMPLETED
#define PACK_COMPLETED
It indicates the read data is last in the received packet.
Definition: socket.h:168
CHECK_IPZERO
#define CHECK_IPZERO(addr, addrlen)
Definition: socket.c:92
Sn_MR_TCP6
#define Sn_MR_TCP6
IPv6 TCP mode.
Definition: w6100.h:2439
setSn_KPALVTR
#define setSn_KPALVTR(sn, kpalvtr)
Definition: w6100.h:3932
SF_FORCE_ARP
#define SF_FORCE_ARP
Force to APR.
Definition: socket.h:152
getSn_TOSR
#define getSn_TOSR(sn)
Definition: w6100.h:3853
setsockopt
int8_t setsockopt(uint8_t sn, sockopt_type sotype, void *arg)
Set SOCKETn options.
Definition: socket.c:576
SOCKERR_SOCKOPT
#define SOCKERR_SOCKOPT
Invalid socket option.
Definition: socket.h:88
SO_DESTIP
@ SO_DESTIP
Set/Get the destination IP address with argument wiz_IPAddress. To get it, SOCKETn should be TCP mode...
Definition: socket.h:442
PACK_FIRST
#define PACK_FIRST
It indicates the read data is first in the received packet.
Definition: socket.h:170
PACK_NONE
#define PACK_NONE
It indicates no information of a packet.
Definition: socket.h:171
getSn_RX_RSR
datasize_t getSn_RX_RSR(uint8_t s)
PACK_REMAINED
#define PACK_REMAINED
It indicates to remain data in the received packet.
Definition: socket.h:169
SF_UNI_BLOCK
#define SF_UNI_BLOCK
In UDP mdoe such as Sn_MR_UDP4, Sn_MR_UDP6 and Sn_MR_UDPD with SF_MULTI_ENABLE, Block a unicast packe...
Definition: socket.h:141
setSn_MR2
#define setSn_MR2(sn, mr2)
Definition: w6100.h:3914
CS_GET_MAXTXBUF
@ CS_GET_MAXTXBUF
get the size of SOCKET TX buffer allocated in TX memory
Definition: socket.h:421
getSn_ESR
#define getSn_ESR(sn)
Definition: w6100.h:3840
Sn_MR_UDPD
#define Sn_MR_UDPD
UDP Dual mode.
Definition: w6100.h:2499
setSn_IMR
#define setSn_IMR(sn, imr)
Definition: w6100.h:3828
SO_MSS
@ SO_MSS
Set/Get MSS. ( setSn_MSSR(), getSn_MSSR() )
Definition: socket.h:441
ctlsocket
int8_t ctlsocket(uint8_t sn, ctlsock_type cstype, void *arg)
Control SOCKETn.
Definition: socket.c:528
CHECK_TCPMODE
#define CHECK_TCPMODE()
Definition: socket.c:60
SF_DHA_MANUAL
#define SF_DHA_MANUAL
The destination hardware address of packet to be transmitted is set by user through _Sn_DHAR_....
Definition: socket.h:157
getLLAR
#define getLLAR(llar)
Definition: w6100.h:3628
SO_RECVBUF
@ SO_RECVBUF
Valid only in getsockopt(). Get the received data size in SOCKETn RX buffer. getSn_RX_RSR()
Definition: socket.h:447
SO_EXTSTATUS
@ SO_EXTSTATUS
Valid only in getsockopt(). Get the extended TCP SOCKETn status. getSn_ESR()
Definition: socket.h:449
CS_GET_INTMASK
@ CS_GET_INTMASK
get the masked interrupt of SOCKET. refer to sockint_kind.
Definition: socket.h:426
SOCKFATAL_PACKLEN
#define SOCKFATAL_PACKLEN
Invalid packet length. Fatal Error.
Definition: socket.h:103
SOCK_CLOSED
#define SOCK_CLOSED
SOCKETn Closed status.
Definition: w6100.h:2755
SO_MODE
@ SO_MODE
Definition: socket.h:451
Sn_MR_UDP
#define Sn_MR_UDP
IPv4 UDP mode.
Definition: w6100.h:2403
Sn_CR_DISCON
#define Sn_CR_DISCON
Send a disconnect request in TCP mode.
Definition: w6100.h:2594
sockopt_type
sockopt_type
The type of socket option in setsockopt() or getsockopt()
Definition: socket.h:436
getSn_DIP6R
#define getSn_DIP6R(sn, dip6r)
Definition: w6100.h:3903
getSn_KPALVTR
#define getSn_KPALVTR(sn)
Definition: w6100.h:3934
CS_GET_INTERRUPT
@ CS_GET_INTERRUPT
get the SOCKET interrupt. refer to sockint_kind.
Definition: socket.h:424
Sn_CR_OPEN
#define Sn_CR_OPEN
Initialize or Open SOCKETn.
Definition: w6100.h:2524
SIK_ALL
@ SIK_ALL
all interrupt
Definition: socket.h:410
W6100
#define W6100
W6100 Definition.
Definition: wizchip_conf.h:54
SO_REMAINSIZE
@ SO_REMAINSIZE
Valid only in getsockopt(). Get the remained packet size in non-TCP mode.
Definition: socket.h:450
getSn_IR
#define getSn_IR(sn)
Definition: w6100.h:3825
getSn_TxMAX
#define getSn_TxMAX(sn)
Definition: w6100.h:3945
CS_GET_IOMODE
@ CS_GET_IOMODE
get SOCKET IO mode
Definition: socket.h:420
SOCKERR_IPINVALID
#define SOCKERR_IPINVALID
Invalid source or destination IP address.
Definition: socket.h:96
Sn_MR_MACRAW
#define Sn_MR_MACRAW
MACRAW mode.
Definition: w6100.h:2427
SO_KEEPALIVESEND
@ SO_KEEPALIVESEND
Valid only in setsockopt(). Manually send keep-alive packet in TCP mode.
Definition: socket.h:444
Sn_CR_SEND
#define Sn_CR_SEND
Send Data.
Definition: w6100.h:2636
getSn_TX_FSR
datasize_t getSn_TX_FSR(uint8_t sn)
getSn_MR
#define getSn_MR(sn)
Definition: w6100.h:3812
CS_GET_MAXRXBUF
@ CS_GET_MAXRXBUF
get the size of SOCKET RX buffer allocated in RX memory
Definition: socket.h:422
Sn_IR_SENDOK
#define Sn_IR_SENDOK
SEND OK Interrupt.
Definition: w6100.h:2704
CS_CLR_INTERRUPT
@ CS_CLR_INTERRUPT
clear the interrupt of SOCKET with sockint_kind.
Definition: socket.h:423
CS_SET_INTMASK
@ CS_SET_INTMASK
set the interrupt mask of SOCKET with sockint_kind.
Definition: socket.h:425
WIZCHIP_RXBUF_BLOCK
#define WIZCHIP_RXBUF_BLOCK(N)
SOCKETn Rx buffer address block.
Definition: w6100.h:55
getSn_DIPR
#define getSn_DIPR(sn, dipr)
Definition: w6100.h:3895
Sn_CR_SEND6
#define Sn_CR_SEND6
Send Data.
Definition: w6100.h:2663
Sn_MR_TCPD
#define Sn_MR_TCPD
Both IPv4 & IPv6 TCP mode (TCP dual mode)
Definition: w6100.h:2485
SOCKERR_SOCKCLOSED
#define SOCKERR_SOCKCLOSED
Socket unexpectedly closed.
Definition: socket.h:90
listen
int8_t listen(uint8_t sn)
Listen to a connection request from a TCP CLIENT.
Definition: socket.c:204
getSn_RxMAX
#define getSn_RxMAX(sn)
Definition: w6100.h:3969
setSn_IRCLR
#define setSn_IRCLR(sn, irclr)
Definition: w6100.h:3833
_WIZCHIP_SOCK_NUM_
#define _WIZCHIP_SOCK_NUM_
Define I/O base address of _WIZCHIP_.
Definition: wizchip_conf.h:157
setSn_PSR
#define setSn_PSR(sn, psr)
Definition: w6100.h:3815
SOCKERR_SOCKSTATUS
#define SOCKERR_SOCKSTATUS
Invalid socket status for socket operation.
Definition: socket.h:93
SO_TTL
@ SO_TTL
Set/Get TTL. ( setSn_TTLR(), getSn_TTLR() ) .
Definition: socket.h:439
setSn_TTLR
#define setSn_TTLR(sn, ttlr)
Definition: w6100.h:3856
Sn_CR_CONNECT6
#define Sn_CR_CONNECT6
Send connection request in TCP CLIENT mode.
Definition: w6100.h:2573
WIZCHIP_OFFSET_INC
#define WIZCHIP_OFFSET_INC(ADDR, N)
Increase offset address.
Definition: w6100.h:57
SOCKERR_SOCKFLAG
#define SOCKERR_SOCKFLAG
Invalid socket flag.
Definition: socket.h:92
CS_SET_PREFER
@ CS_SET_PREFER
set the preferred source IPv6 address of transmission packet. Refer to SRCV6_PREFER_AUTO,...
Definition: socket.h:427
setSn_TOSR
#define setSn_TOSR(sn, tosr)
Definition: w6100.h:3851
SO_STATUS
@ SO_STATUS
Valid only in getsockopt(). Get the SOCKETn status. getSn_SR()
Definition: socket.h:448
SOCK_ANY_PORT_NUM
#define SOCK_ANY_PORT_NUM
Definition: socket.c:41
ctlsock_type
ctlsock_type
The type of ctlsocket().
Definition: socket.h:417
SO_FLAG
@ SO_FLAG
Valid only in getsockopt(), For set flag of socket refer to flag in socket(). .
Definition: socket.h:438
SOCK_IO_BLOCK
#define SOCK_IO_BLOCK
Socket Block IO Mode in setsockopt().
Definition: socket.h:184
CS_SET_IOMODE
@ CS_SET_IOMODE
set SOCKET IO mode with SOCK_IO_BLOCK or SOCK_IO_NONBLOCK
Definition: socket.h:419
wiz_send_data
void wiz_send_data(uint8_t sn, uint8_t *wizdata, datasize_t len)
It saves data to be sent in the SOCKETn TX buffer.
SO_PACKINFO
@ SO_PACKINFO
Valid only in getsockopt(). Get the packet information as PACK_FIRST, PACK_REMAINED,...
Definition: socket.h:452
setSn_DPORTR
#define setSn_DPORTR(sn, dportr)
Definition: w6100.h:3906
SOCK_IO_NONBLOCK
#define SOCK_IO_NONBLOCK
Socket Non-block IO Mode in setsockopt().
Definition: socket.h:185
SF_IO_NONBLOCK
#define SF_IO_NONBLOCK
Socket nonblock io mode. It used parameter in socket().
Definition: socket.h:159
SOCKERR_SOCKMODE
#define SOCKERR_SOCKMODE
Invalid socket mode for socket operation.
Definition: socket.h:91
SOCK_OK
#define SOCK_OK
Result is OK about socket process.
Definition: socket.h:82
getSn_CR
#define getSn_CR(sn)
Definition: w6100.h:3822
send
datasize_t send(uint8_t sn, uint8_t *buf, datasize_t len)
Send data to the connected peer.
Definition: socket.c:289
Sn_IR_TIMEOUT
#define Sn_IR_TIMEOUT
TIMEOUT Interrupt.
Definition: w6100.h:2714
Sn_CR_CLOSE
#define Sn_CR_CLOSE
Release or Close SOCKETn.
Definition: w6100.h:2604
close
int8_t close(uint8_t sn)
Close a SOCKET.
Definition: socket.c:186
SOCKERR_PORTZERO
#define SOCKERR_PORTZERO
Port number is zero.
Definition: socket.h:95
PACK_IPv6
#define PACK_IPv6
It indicates the destination IP address of the received packet is IPv6 or IPv4.
Definition: socket.h:164
getSn_SR
#define getSn_SR(sn)
Definition: w6100.h:3837
Sn_CR_LISTEN
#define Sn_CR_LISTEN
Wait a connection request in TCP SERVER mode.
Definition: w6100.h:2540
getsockopt
int8_t getsockopt(uint8_t sn, sockopt_type sotype, void *arg)
get SOCKETn options
Definition: socket.c:620
SO_KEEPALIVEAUTO
@ SO_KEEPALIVEAUTO
Set/Get keep-alive auto transmission timer in TCP mode.
Definition: socket.h:445
Sn_MR_UDP6
#define Sn_MR_UDP6
IPv6 UDP mode.
Definition: w6100.h:2450
socket.h
SOCKET APIs Header File.
setSn_PORTR
#define setSn_PORTR(sn, portr)
Definition: w6100.h:3880
CS_GET_PREFER
@ CS_GET_PREFER
get the preferred source IPv6 address of transmission packet. Refer to SRCV6_PREFER_AUTO,...
Definition: socket.h:428
SO_TOS
@ SO_TOS
Set/Get TOS. ( setSn_TOSR(), getSn_TOSR() )
Definition: socket.h:440
getSn_MR2
#define getSn_MR2(sn)
Definition: w6100.h:3916
Sn_MR_IPRAW4
#define Sn_MR_IPRAW4
Refer to Sn_MR_IPRAW.
Definition: w6100.h:2416
SOCKERR_ARG
#define SOCKERR_ARG
Invalid argument.
Definition: socket.h:94
SOCK_LISTEN
#define SOCK_LISTEN
TCP SOCKETn Listen status.
Definition: w6100.h:2781
Sn_CR_CONNECT
#define Sn_CR_CONNECT
Send a connection request in TCP CLIENT mode.
Definition: w6100.h:2557
disconnect
int8_t disconnect(uint8_t sn)
Try to disconnect to the connected peer.
Definition: socket.c:266
getSn_TTLR
#define getSn_TTLR(sn)
Definition: w6100.h:3858
WIZCHIP_READ
uint8_t WIZCHIP_READ(uint32_t AddrSel)
It reads 1 byte value from a register.
Sn_MR_UDP4
#define Sn_MR_UDP4
Refer to Sn_MR_UDP.
Definition: w6100.h:2404
Sn_MR_IPRAW6
#define Sn_MR_IPRAW6
IPv6 RAW mode.
Definition: w6100.h:2461
getSn_IMR
#define getSn_IMR(sn)
Definition: w6100.h:3830
wiz_IPAddress_t
Destination Information for Network Service of _WIZCHIP_.
Definition: wizchip_conf.h:517
SOCK_ESTABLISHED
#define SOCK_ESTABLISHED
TCP SOCKETn Established status.
Definition: w6100.h:2826
peeksockmsg
int16_t peeksockmsg(uint8_t sn, uint8_t *submsg, uint16_t subsize)
Peeks a sub-message in SOCKETn RX buffer.
Definition: socket.c:689
recvfrom
datasize_t recvfrom(uint8_t sn, uint8_t *buf, datasize_t len, uint8_t *addr, uint16_t *port, uint8_t *addrlen)
Receive datagram from a peer.
Definition: socket.c:441
wiz_recv_data
void wiz_recv_data(uint8_t sn, uint8_t *wizdata, datasize_t len)
It reads the received data from the SOCKETn RX buffer and copies the data to your system memory speci...
setSn_MSSR
#define setSn_MSSR(sn, mssr)
Definition: w6100.h:3872
CHECK_SOCKINIT
#define CHECK_SOCKINIT()
Definition: socket.c:82
setSn_MR
#define setSn_MR(sn, mr)
Definition: w6100.h:3810
w6100.h
W6100 HAL Header File.