 |
io6Library
WIZnet Dual Stack TCP/IP Ethernet Controller Driver
|
Go to the documentation of this file.
41 #define SOCK_ANY_PORT_NUM 0x0400
44 static uint16_t sock_io_mode = 0;
45 static uint16_t sock_is_sending = 0;
50 #define CHECK_SOCKNUM() \
52 if(sn >= _WIZCHIP_SOCK_NUM_) return SOCKERR_SOCKNUM; \
55 #define CHECK_SOCKMODE(mode) \
57 if((getSn_MR(sn) & 0x0F) != mode) return SOCKERR_SOCKMODE; \
60 #define CHECK_TCPMODE() \
62 if((getSn_MR(sn) & 0x03) != 0x01) return SOCKERR_SOCKMODE; \
65 #define CHECK_UDPMODE() \
67 if((getSn_MR(sn) & 0x03) != 0x02) return SOCKERR_SOCKMODE; \
70 #define CHECK_IPMODE() \
72 if((getSn_MR(sn) & 0x07) != 0x03) return SOCKERR_SOCKMODE; \
75 #define CHECK_DGRAMMODE() \
77 if(getSn_MR(sn) == Sn_MR_CLOSED) return SOCKERR_SOCKMODE; \
78 if((getSn_MR(sn) & 0x03) == 0x01) return SOCKERR_SOCKMODE; \
82 #define CHECK_SOCKINIT() \
84 if((getSn_SR(sn) != SOCK_INIT)) return SOCKERR_SOCKINIT; \
87 #define CHECK_SOCKDATA() \
89 if(len == 0) return SOCKERR_DATALEN; \
92 #define CHECK_IPZERO(addr, addrlen) \
95 for(uint8_t i=0; i<addrlen; i++) ipzero += (uint16_t)addr[i]; \
96 if (ipzero == 0) return SOCKERR_IPINVALID; \
101 int8_t
socket(uint8_t sn, uint8_t protocol, uint16_t port, uint8_t flag)
104 uint16_t local_port=0;
106 switch (protocol & 0x0F)
162 setSn_MR(sn,(protocol | (flag & 0xF0)));
166 port = sock_any_port++;
174 sock_io_mode &= ~(1 <<sn);
176 sock_is_sending &= ~(1<<sn);
177 sock_remained_size[sn] = 0;
195 sock_io_mode &= ~(1<<sn);
196 sock_remained_size[sn] = 0;
197 sock_is_sending &= ~(1<<sn);
219 int8_t
connect(uint8_t sn, uint8_t * addr, uint16_t port, uint8_t addrlen)
249 if(sock_io_mode & (1<<sn))
return SOCK_BUSY;
275 if(sock_io_mode & (1<<sn))
return SOCK_BUSY;
289 datasize_t
send(uint8_t sn, uint8_t * buf, datasize_t len)
292 datasize_t freesize=0;
301 if (len > freesize) len = freesize;
311 if(len <= freesize)
break;
312 if( sock_io_mode & (1<<sn) )
return SOCK_BUSY;
315 if(sock_is_sending & (1<<sn))
325 if(sock_io_mode & (1<<sn))
return SOCK_BUSY;
332 sock_is_sending |= (1<<sn);
338 datasize_t
recv(uint8_t sn, uint8_t * buf, datasize_t len)
341 datasize_t recvsize = 0;
351 if(recvsize < len) len = recvsize;
362 if(sock_io_mode & (1<<sn))
return SOCK_BUSY;
364 if(recvsize < len) len = recvsize;
372 datasize_t
sendto(uint8_t sn, uint8_t * buf, datasize_t len, uint8_t * addr, uint16_t port, uint8_t addrlen)
376 uint16_t freesize = 0;
395 else if(addrlen == 4)
403 if((tmp & 0x03)==0x02)
410 if (len > freesize) len = freesize;
416 if(len <= freesize)
break;
417 if( sock_io_mode & (1<<sn) )
return SOCK_BUSY;
441 datasize_t
recvfrom(uint8_t sn, uint8_t * buf, datasize_t len, uint8_t * addr, uint16_t *port, uint8_t *addrlen)
444 datasize_t pack_len=0;
454 if(sock_remained_size[sn] == 0)
465 if( sock_io_mode & (1<<sn) )
return SOCK_BUSY;
471 pack_len = head[0] & 0x07;
472 pack_len = (pack_len << 8) + head[1];
482 sock_pack_info[sn] = head[0] & 0xF8;
483 if(sock_pack_info[sn] &
PACK_IPv6) *addrlen = 16;
501 sock_remained_size[sn] = pack_len;
508 *port = ( ((((uint16_t)head[0])) << 8) + head[1] );
514 if (len < sock_remained_size[sn]) pack_len = len;
515 else pack_len = sock_remained_size[sn];
521 sock_remained_size[sn] -= pack_len;
522 if(sock_remained_size[sn] != 0) sock_pack_info[sn] |=
PACK_REMAINED;
532 tmp = *((uint8_t*)arg);
541 *((uint8_t*)arg) = (uint8_t)((sock_io_mode >> sn) & 0x0001);
626 *(uint8_t*)arg = (
getSn_MR(sn) & 0xF0) | (
getSn_MR2(sn)) | ((uint8_t)(((sock_io_mode >> sn) & 0x0001) << 3));
673 else *(uint16_t*)arg = sock_remained_size[sn];
678 else *(uint8_t*)arg = sock_pack_info[sn];
681 *(uint8_t*) arg = 0x0F &
getSn_MR(sn);
689 int16_t
peeksockmsg(uint8_t sn, uint8_t* submsg, uint16_t subsize)
692 uint16_t i = 0, sub_idx = 0;
703 if(sub_idx == subsize)
return (i + 1 - sub_idx);
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.
datasize_t recv(uint8_t sn, uint8_t *buf, datasize_t len)
Receive data from the connected peer.
#define Sn_CR_RECV
Receive data.
#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,...
#define setSn_DIP6R(sn, dip6r)
#define SOCK_BUSY
Socket is busy on processing the operation. Valid only Non-block IO Mode.
#define Sn_CR_SEND_KEEP
Send keep alive message.
int8_t socket(uint8_t sn, uint8_t protocol, uint16_t port, uint8_t flag)
Open a socket.
#define Sn_MR_TCP4
Refer to Sn_MR_TCP.
@ SO_SENDBUF
Valid only in getsockopt(). Get the free data size of SOCKETn TX buffer. getSn_TX_FSR()
#define setSn_DIPR(sn, dipr)
#define SOCKERR_TIMEOUT
Timeout occurred.
int8_t connect(uint8_t sn, uint8_t *addr, uint16_t port, uint8_t addrlen)
Try to connect to a TCP SERVER.
#define SOCK_CLOSE_WAIT
TCP SOCKETn Half Closing staus.
#define TCPSOCK_MODE
It indicates the IP version when SOCKETn is opened as TCP6 or TCPD mode.(0 - IPv4 ,...
@ SO_DESTPORT
Set/Get the destination Port number. To get it, SOCKETn should be TCP mode.
#define PACK_COMPLETED
It indicates the read data is last in the received packet.
#define CHECK_IPZERO(addr, addrlen)
#define Sn_MR_TCP6
IPv6 TCP mode.
#define setSn_KPALVTR(sn, kpalvtr)
#define SF_FORCE_ARP
Force to APR.
int8_t setsockopt(uint8_t sn, sockopt_type sotype, void *arg)
Set SOCKETn options.
#define SOCKERR_SOCKOPT
Invalid socket option.
@ SO_DESTIP
Set/Get the destination IP address with argument wiz_IPAddress. To get it, SOCKETn should be TCP mode...
#define PACK_FIRST
It indicates the read data is first in the received packet.
#define PACK_NONE
It indicates no information of a packet.
datasize_t getSn_RX_RSR(uint8_t s)
#define PACK_REMAINED
It indicates to remain data in the received packet.
#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...
#define setSn_MR2(sn, mr2)
@ CS_GET_MAXTXBUF
get the size of SOCKET TX buffer allocated in TX memory
#define Sn_MR_UDPD
UDP Dual mode.
#define setSn_IMR(sn, imr)
@ SO_MSS
Set/Get MSS. ( setSn_MSSR(), getSn_MSSR() )
int8_t ctlsocket(uint8_t sn, ctlsock_type cstype, void *arg)
Control SOCKETn.
#define SF_DHA_MANUAL
The destination hardware address of packet to be transmitted is set by user through _Sn_DHAR_....
@ SO_RECVBUF
Valid only in getsockopt(). Get the received data size in SOCKETn RX buffer. getSn_RX_RSR()
@ SO_EXTSTATUS
Valid only in getsockopt(). Get the extended TCP SOCKETn status. getSn_ESR()
@ CS_GET_INTMASK
get the masked interrupt of SOCKET. refer to sockint_kind.
#define SOCKFATAL_PACKLEN
Invalid packet length. Fatal Error.
#define SOCK_CLOSED
SOCKETn Closed status.
#define Sn_MR_UDP
IPv4 UDP mode.
#define Sn_CR_DISCON
Send a disconnect request in TCP mode.
sockopt_type
The type of socket option in setsockopt() or getsockopt()
#define getSn_DIP6R(sn, dip6r)
#define getSn_KPALVTR(sn)
@ CS_GET_INTERRUPT
get the SOCKET interrupt. refer to sockint_kind.
#define Sn_CR_OPEN
Initialize or Open SOCKETn.
#define W6100
W6100 Definition.
@ SO_REMAINSIZE
Valid only in getsockopt(). Get the remained packet size in non-TCP mode.
@ CS_GET_IOMODE
get SOCKET IO mode
#define SOCKERR_IPINVALID
Invalid source or destination IP address.
#define Sn_MR_MACRAW
MACRAW mode.
@ SO_KEEPALIVESEND
Valid only in setsockopt(). Manually send keep-alive packet in TCP mode.
#define Sn_CR_SEND
Send Data.
datasize_t getSn_TX_FSR(uint8_t sn)
@ CS_GET_MAXRXBUF
get the size of SOCKET RX buffer allocated in RX memory
#define Sn_IR_SENDOK
SEND OK Interrupt.
@ CS_CLR_INTERRUPT
clear the interrupt of SOCKET with sockint_kind.
@ CS_SET_INTMASK
set the interrupt mask of SOCKET with sockint_kind.
#define WIZCHIP_RXBUF_BLOCK(N)
SOCKETn Rx buffer address block.
#define getSn_DIPR(sn, dipr)
#define Sn_CR_SEND6
Send Data.
#define Sn_MR_TCPD
Both IPv4 & IPv6 TCP mode (TCP dual mode)
#define SOCKERR_SOCKCLOSED
Socket unexpectedly closed.
int8_t listen(uint8_t sn)
Listen to a connection request from a TCP CLIENT.
#define setSn_IRCLR(sn, irclr)
#define _WIZCHIP_SOCK_NUM_
Define I/O base address of _WIZCHIP_.
#define setSn_PSR(sn, psr)
#define SOCKERR_SOCKSTATUS
Invalid socket status for socket operation.
@ SO_TTL
Set/Get TTL. ( setSn_TTLR(), getSn_TTLR() ) .
#define setSn_TTLR(sn, ttlr)
#define Sn_CR_CONNECT6
Send connection request in TCP CLIENT mode.
#define WIZCHIP_OFFSET_INC(ADDR, N)
Increase offset address.
#define SOCKERR_SOCKFLAG
Invalid socket flag.
@ CS_SET_PREFER
set the preferred source IPv6 address of transmission packet. Refer to SRCV6_PREFER_AUTO,...
#define setSn_TOSR(sn, tosr)
@ SO_STATUS
Valid only in getsockopt(). Get the SOCKETn status. getSn_SR()
#define SOCK_ANY_PORT_NUM
ctlsock_type
The type of ctlsocket().
@ SO_FLAG
Valid only in getsockopt(), For set flag of socket refer to flag in socket(). .
#define SOCK_IO_BLOCK
Socket Block IO Mode in setsockopt().
@ CS_SET_IOMODE
set SOCKET IO mode with SOCK_IO_BLOCK or SOCK_IO_NONBLOCK
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
Valid only in getsockopt(). Get the packet information as PACK_FIRST, PACK_REMAINED,...
#define setSn_DPORTR(sn, dportr)
#define SOCK_IO_NONBLOCK
Socket Non-block IO Mode in setsockopt().
#define SF_IO_NONBLOCK
Socket nonblock io mode. It used parameter in socket().
#define SOCKERR_SOCKMODE
Invalid socket mode for socket operation.
#define SOCK_OK
Result is OK about socket process.
datasize_t send(uint8_t sn, uint8_t *buf, datasize_t len)
Send data to the connected peer.
#define Sn_IR_TIMEOUT
TIMEOUT Interrupt.
#define Sn_CR_CLOSE
Release or Close SOCKETn.
int8_t close(uint8_t sn)
Close a SOCKET.
#define SOCKERR_PORTZERO
Port number is zero.
#define PACK_IPv6
It indicates the destination IP address of the received packet is IPv6 or IPv4.
#define Sn_CR_LISTEN
Wait a connection request in TCP SERVER mode.
int8_t getsockopt(uint8_t sn, sockopt_type sotype, void *arg)
get SOCKETn options
@ SO_KEEPALIVEAUTO
Set/Get keep-alive auto transmission timer in TCP mode.
#define Sn_MR_UDP6
IPv6 UDP mode.
#define setSn_PORTR(sn, portr)
@ CS_GET_PREFER
get the preferred source IPv6 address of transmission packet. Refer to SRCV6_PREFER_AUTO,...
@ SO_TOS
Set/Get TOS. ( setSn_TOSR(), getSn_TOSR() )
#define Sn_MR_IPRAW4
Refer to Sn_MR_IPRAW.
#define SOCKERR_ARG
Invalid argument.
#define SOCK_LISTEN
TCP SOCKETn Listen status.
#define Sn_CR_CONNECT
Send a connection request in TCP CLIENT mode.
int8_t disconnect(uint8_t sn)
Try to disconnect to the connected peer.
uint8_t WIZCHIP_READ(uint32_t AddrSel)
It reads 1 byte value from a register.
#define Sn_MR_UDP4
Refer to Sn_MR_UDP.
#define Sn_MR_IPRAW6
IPv6 RAW mode.
Destination Information for Network Service of _WIZCHIP_.
#define SOCK_ESTABLISHED
TCP SOCKETn Established status.
int16_t peeksockmsg(uint8_t sn, uint8_t *submsg, uint16_t subsize)
Peeks a sub-message in SOCKETn RX buffer.
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.
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...
#define setSn_MSSR(sn, mssr)