RetroArch
uip_tcp.h
Go to the documentation of this file.
1 #ifndef __UIP_TCP_H__
2 #define __UIP_TCP_H__
3 
4 #include "uip.h"
5 #include "uip_ip.h"
6 #include "uip_pbuf.h"
7 
8 #define UIP_TCP_PRIO_MIN 1
9 #define UIP_TCP_PRIO_NORMAL 64
10 #define UIP_TCP_PRIO_MAX 127
11 
12 /* Keepalive values */
13 #define UIP_TCP_KEEPDEFAULT 7200000 /* KEEPALIVE timer in miliseconds */
14 #define UIP_TCP_KEEPINTVL 75000 /* Time between KEEPALIVE probes in miliseconds */
15 #define UIP_TCP_KEEPCNT 9 /* Counter for KEEPALIVE probes */
16 #define UIP_TCP_MAXIDLE (UIP_TCP_KEEPCNT*UIP_TCP_KEEPINTVL) /* Maximum KEEPALIVE probe time */
17 
18 #define UIP_TCP_TMR_INTERVAL 250
19 #define UIP_TCP_SLOW_INTERVAL (2*UIP_TCP_TMR_INTERVAL)
20 
21 #define UIP_TCP_OOSEQ_TIMEOUT 6 /* x RTO */
22 
23 #define UIP_TCP_MSL 60000 /* The maximum segment lifetime in microseconds */
24 
25 #define UIP_TCP_SEQ_LT(a,b) ((s32_t)((a)-(b)) < 0)
26 #define UIP_TCP_SEQ_LEQ(a,b) ((s32_t)((a)-(b)) <= 0)
27 #define UIP_TCP_SEQ_GT(a,b) ((s32_t)((a)-(b)) > 0)
28 #define UIP_TCP_SEQ_GEQ(a,b) ((s32_t)((a)-(b)) >= 0)
29 
30 #define UIP_TCP_SEQ_BETWEEN(a,b,c) (UIP_TCP_SEQ_GEQ(a,b) && UIP_TCP_SEQ_LEQ(a,c))
31 #define UIP_TCP_FIN 0x01U
32 #define UIP_TCP_SYN 0x02U
33 #define UIP_TCP_RST 0x04U
34 #define UIP_TCP_PSH 0x08U
35 #define UIP_TCP_ACK 0x10U
36 #define UIP_TCP_URG 0x20U
37 #define UIP_TCP_ECE 0x40U
38 #define UIP_TCP_CWR 0x80U
39 
40 #define UIP_TCP_FLAGS 0x3fU
41 
42 /* Length of the TCP header, excluding options. */
43 #define UIP_TCP_HLEN 20
44 
45 #define UIP_TCP_FIN_WAIT_TIMEOUT 20000 /* milliseconds */
46 #define UIP_TCP_SYN_RCVD_TIMEOUT 20000 /* milliseconds */
47 
48 #define UIP_TCPH_OFFSET(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) >> 8)
49 #define UIP_TCPH_HDRLEN(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) >> 12)
50 #define UIP_TCPH_FLAGS(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) & UIP_TCP_FLAGS)
51 
52 #define UIP_TCPH_OFFSET_SET(phdr, offset) (phdr)->_hdrlen_rsvd_flags = htons(((offset) << 8)|UIP_TCPH_FLAGS(phdr))
53 #define UIP_TCPH_HDRLEN_SET(phdr, len) (phdr)->_hdrlen_rsvd_flags = htons(((len)<<12)|UIP_TCPH_FLAGS(phdr))
54 #define UIP_TCPH_FLAGS_SET(phdr, flags) (phdr)->_hdrlen_rsvd_flags = htons((ntohs((phdr)->_hdrlen_rsvd_flags)&~UIP_TCP_FLAGS)|(flags))
55 #define UIP_TCPH_SET_FLAG(phdr, flags ) (phdr)->_hdrlen_rsvd_flags = htons(ntohs((phdr)->_hdrlen_rsvd_flags)|(flags))
56 #define UIP_TCPH_UNSET_FLAG(phdr, flags) (phdr)->_hdrlen_rsvd_flags = htons(ntohs((phdr)->_hdrlen_rsvd_flags)|(UIP_TCPH_FLAGS(phdr)&~(flags)) )
57 
58 #define UIP_TCP_TCPLEN(seg) ((seg)->len+((UIP_TCPH_FLAGS((seg)->tcphdr)&UIP_TCP_FIN || UIP_TCPH_FLAGS((seg)->tcphdr)&UIP_TCP_SYN)?1:0))
59 
60 #define UIP_TCP_REG(pcbs,npcb) \
61  do { \
62  npcb->next = *pcbs; \
63  *(pcbs) = npcb; \
64  tcp_tmr_needed(); \
65  } while(0)
66 
67 #define UIP_TCP_RMV(pcbs,npcb) \
68  do { \
69  if(*(pcbs)==npcb) { \
70  *(pcbs) = (*pcbs)->next; \
71  } else { \
72  for(uip_tcp_tmp_pcb=*pcbs;uip_tcp_tmp_pcb!=NULL;uip_tcp_tmp_pcb=uip_tcp_tmp_pcb->next) { \
73  if(uip_tcp_tmp_pcb->next!=NULL && uip_tcp_tmp_pcb->next==npcb) { \
74  uip_tcp_tmp_pcb->next = npcb->next; \
75  break; \
76  } \
77  } \
78  } \
79  } while(0)
80 
81 #define uip_tcp_sndbuf(pcb) (pcb)->snd_buf
82 
83 #define uip_tcp_acknow(pcb) \
84  (pcb)->flags |= UIP_TF_ACK_NOW; \
85  uip_tcpoutput((pcb))
86 
87 #define uip_tcp_ack(pcb) \
88  if((pcb)->flags&UIP_TF_ACK_DELAY) { \
89  (pcb)->flags &= ~UIP_TF_ACK_DELAY; \
90  (pcb)->flags |= UIP_TF_ACK_NOW; \
91  uip_tcpoutput((pcb)); \
92  } else { \
93  (pcb)->flags |= UIP_TF_ACK_DELAY; \
94  }
95 
96 /* The TCP Header */
98 struct uip_tcp_hdr {
101  PACK_STRUCT_FIELD(u32_t seqno);
102  PACK_STRUCT_FIELD(u32_t ackno);
103  PACK_STRUCT_FIELD(u16_t _hdrlen_rsvd_flags);
106  PACK_STRUCT_FIELD(u16_t urgp);
109 
122 };
123 
124 struct uip_tcpseg {
125  struct uip_tcpseg *next;
126  struct uip_pbuf *p;
130 };
131 
132 struct uip_tcp_pcb {
134 
135  struct uip_tcp_pcb *next;
137 
139  void *cb_arg;
140 
143 
145 #define UIP_TF_ACK_DELAY (u8_t)0x01U /* Delayed ACK. */
146 #define UIP_TF_ACK_NOW (u8_t)0x02U /* Immediate ACK. */
147 #define UIP_TF_INFR (u8_t)0x04U /* In fast recovery. */
148 #define UIP_TF_RESET (u8_t)0x08U /* Connection was reset. */
149 #define UIP_TF_CLOSED (u8_t)0x10U /* Connection was sucessfully closed. */
150 #define UIP_TF_GOT_FIN (u8_t)0x20U /* Connection was closed by the remote end. */
151 #define UIP_TF_NODELAY (u8_t)0x40U /* Disable Nagle algorithm */
152 
155 
158 
161 
165 
168 
171 
174 
176 
180 
183  struct uip_tcpseg *ooseq;
184 
185  s8_t (*accept)(void *arg,struct uip_tcp_pcb *newpcb,s8_t err);
186  s8_t (*connected)(void *arg,struct uip_tcp_pcb *newpcb,s8_t err);
187  s8_t (*poll)(void *arg,struct uip_tcp_pcb *pcb);
188 
189  s8_t (*sent)(void *arg,struct uip_tcp_pcb *pcb,u16_t space);
190  s8_t (*recv)(void *arg,struct uip_tcp_pcb *pcb,struct uip_pbuf *p,s8_t err);
191 
192  void (*errf)(void *arg,s8_t err);
193 
196 };
197 
200 
203 
205  void *cb_arg;
206 
208 
209  s8_t (*accept)(void *arg,struct uip_tcp_pcb *newpcb,s8_t err);
210 };
211 
214  struct uip_tcp_pcb *pcbs;
215 };
216 
217 extern struct uip_tcp_pcb *uip_tcp_tmp_pcb;
218 extern struct uip_tcp_pcb *uip_tcp_active_pcbs;
219 extern struct uip_tcp_pcb *uip_tcp_tw_pcbs;
221 
222 void uip_tcp_tmr();
223 void uip_tcp_slowtmr();
224 void uip_tcp_fasttmr();
225 void uip_tcp_init();
226 void uip_tcp_rst(u32_t seqno,u32_t ackno,struct uip_ip_addr *lipaddr,struct uip_ip_addr *ripaddr,u16_t lport,u16_t rport);
227 void uip_tcp_abort(struct uip_tcp_pcb *pcb);
228 void uip_tcp_pcbremove(struct uip_tcp_pcb **pcblist,struct uip_tcp_pcb *pcb);
229 void uip_tcp_pcbpurge(struct uip_tcp_pcb *pcb);
230 void uip_tcp_rexmit(struct uip_tcp_pcb *pcb);
231 void uip_tcp_rexmit_rto(struct uip_tcp_pcb *pcb);
232 void uip_tcp_accept(struct uip_tcp_pcb *pcb,s8_t (*accept)(void *,struct uip_tcp_pcb *,s8_t));
233 void uip_tcp_recved(struct uip_tcp_pcb *pcb,u16_t len);
234 void uip_tcp_err(struct uip_tcp_pcb *pcb,void (*errf)(void *,s8_t));
235 void uip_tcp_keepalive(struct uip_tcp_pcb *pcb);
236 void uip_tcp_arg(struct uip_tcp_pcb *pcb,void *arg);
237 void uip_tcp_recv(struct uip_tcp_pcb *pcb,s8_t (*recv)(void *,struct uip_tcp_pcb *,struct uip_pbuf *,s8_t));
238 void uip_tcp_sent(struct uip_tcp_pcb *pcb,s8_t (*sent)(void *,struct uip_tcp_pcb *,u16_t));
239 void uip_tcp_poll(struct uip_tcp_pcb *pcb,s8_t (*poll)(void *,struct uip_tcp_pcb *),u8_t interval);
240 s8_t uip_tcp_close(struct uip_tcp_pcb *pcb);
241 s8_t uip_tcp_bind(struct uip_tcp_pcb *pcb,struct uip_ip_addr *ipaddr,u16_t port);
242 s8_t uip_tcp_write(struct uip_tcp_pcb *pcb,const void *arg,u16_t len,u8_t copy);
243 struct uip_tcp_pcb* uip_tcp_listen(struct uip_tcp_pcb *pcb);
244 struct uip_tcp_pcb* uip_tcp_new();
246 
248 s8_t uip_tcpoutput(struct uip_tcp_pcb *pcb);
249 s8_t uip_tcpenqueue(struct uip_tcp_pcb *pcb,void *arg,u16_t len,u8_t flags,u8_t copy,u8_t *optdata,u8_t optlen);
250 u8_t uip_tcpseg_free(struct uip_tcpseg *seg);
251 u8_t uip_tcpsegs_free(struct uip_tcpseg *seg);
253 void uip_tcpinput(struct uip_pbuf *p,struct uip_netif *inp);
254 struct uip_tcpseg* uip_tcpseg_copy(struct uip_tcpseg *seg);
255 
256 #endif
Definition: uip_ip.h:82
u8_t flags
Definition: uip_tcp.h:144
void uip_tcp_pcbremove(struct uip_tcp_pcb **pcblist, struct uip_tcp_pcb *pcb)
Definition: uip_tcp.c:528
struct uip_tcp_pcb * uip_tcp_new()
Definition: uip_tcp.c:554
struct uip_pbuf * p
Definition: uip_tcp.h:126
u32_t snd_lbb
Definition: uip_tcp.h:175
s8_t(* connected)(void *arg, struct uip_tcp_pcb *newpcb, s8_t err)
Definition: uip_tcp.h:186
u8_t nrtx
Definition: uip_tcp.h:167
u32_t rttest
Definition: uip_tcp.h:162
static u32_t chksum(void *dataptr, u16_t len)
Definition: inet6.c:59
s8 s8_t
Definition: cc.h:44
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
u16_t ssthresh
Definition: uip_tcp.h:173
struct uip_tcpseg * unsent
Definition: uip_tcp.h:181
u16_t mss
Definition: uip_tcp.h:160
Definition: uip_tcp.h:198
Definition: uip_tcp.h:98
s8_t(* sent)(void *arg, struct uip_tcp_pcb *pcb, u16_t space)
Definition: uip_tcp.h:189
u8_t * dataptr
Definition: uip_tcp.h:127
u32_t keepalive
Definition: uip_tcp.h:194
Definition: uip_tcp.h:113
#define PACK_STRUCT_BEGIN
Definition: arch.h:46
void uip_tcp_sent(struct uip_tcp_pcb *pcb, s8_t(*sent)(void *, struct uip_tcp_pcb *, u16_t))
Definition: uip_tcp.c:475
GLenum GLsizei len
Definition: glext.h:7389
u32_t rtseq
Definition: uip_tcp.h:163
void uip_tcp_init()
Definition: uip_tcp.c:446
Definition: uip_tcp.h:112
void uip_tcp_slowtmr()
Definition: uip_tcp.c:804
includes all by default used to find thumbnails Please choose a single playlist first Add Entry Add Folder Select Files< multiple > Please fill out all required fields RetroArch updated successfully Please restart the application for the changes to take effect Contributors Move Down Load Remove Add Pass No shader passes Reset All Passes Download thumbnail Start on Download All Thumbnails This Playlist Configured in port
Definition: msg_hash_us.h:7699
Definition: uip_tcp.h:132
Definition: uip_pbuf.h:27
u32_t snd_max
Definition: uip_tcp.h:175
u16_t snd_buf
Definition: uip_tcp.h:178
void uip_tcp_pcbpurge(struct uip_tcp_pcb *pcb)
Definition: uip_tcp.c:542
s8_t uip_tcp_bind(struct uip_tcp_pcb *pcb, struct uip_ip_addr *ipaddr, u16_t port)
Definition: uip_tcp.c:559
void uip_tcp_rst(u32_t seqno, u32_t ackno, struct uip_ip_addr *lipaddr, struct uip_ip_addr *ripaddr, u16_t lport, u16_t rport)
Definition: uip_tcp.c:666
typedef void(__stdcall *PFN_DESTRUCTION_CALLBACK)(void *pData)
u8_t snd_queuelen
Definition: uip_tcp.h:179
void uip_tcp_poll(struct uip_tcp_pcb *pcb, s8_t(*poll)(void *, struct uip_tcp_pcb *), u8_t interval)
Definition: uip_tcp.c:480
struct uip_tcp_pcb * next
Definition: uip_tcp.h:135
struct uip_tcpseg * unacked
Definition: uip_tcp.h:182
s16_t sa
Definition: uip_tcp.h:164
u16_t acked
Definition: uip_tcp.h:177
void uip_tcpinput(struct uip_pbuf *p, struct uip_netif *inp)
Definition: uip_tcp.c:230
Definition: uip_tcp.h:114
u16_t cwnd
Definition: uip_tcp.h:172
Definition: uip_tcp.h:212
struct uip_tcpseg * next
Definition: uip_tcp.h:125
union uip_tcp_listen_pcbs_t uip_tcp_listen_pcbs
Definition: uip_tcp.c:50
ssize_t recv(int sockfd, void *buf, size_t len, int flags)
u8_t dupacks
Definition: uip_tcp.h:170
u8_t uip_tcpseg_free(struct uip_tcpseg *seg)
Definition: uip_tcp.c:940
struct uip_tcp_pcb * uip_tcp_tmp_pcb
Definition: uip_tcp.c:45
u16_t rtime
Definition: uip_tcp.h:159
s8_t(* poll)(void *arg, struct uip_tcp_pcb *pcb)
Definition: uip_tcp.h:187
u8_t polltmr
Definition: uip_tcp.h:157
void uip_tcp_recved(struct uip_tcp_pcb *pcb, u16_t len)
Definition: uip_tcp.c:613
void * cb_arg
Definition: uip_tcp.h:205
s8_t uip_tcp_close(struct uip_tcp_pcb *pcb)
Definition: uip_tcp.c:625
void * cb_arg
Definition: uip_tcp.h:139
uip_tcp_state
Definition: uip_tcp.h:110
u32_t rcv_nxt
Definition: uip_tcp.h:153
struct uip_tcp_pcb_listen * next
Definition: uip_tcp.h:201
Definition: uip_tcp.h:120
struct uip_tcp_pcb_listen * listen_pcbs
Definition: uip_tcp.h:213
u32_t snd_wl2
Definition: uip_tcp.h:175
void uip_tcp_rexmit_rto(struct uip_tcp_pcb *pcb)
Definition: uip_tcp.c:774
s8_t(* accept)(void *arg, struct uip_tcp_pcb *newpcb, s8_t err)
Definition: uip_tcp.h:209
s8_t uip_tcp_write(struct uip_tcp_pcb *pcb, const void *arg, u16_t len, u8_t copy)
Definition: uip_tcp.c:74
struct uip_tcp_hdr * tcphdr
Definition: uip_tcp.h:129
GLenum src
Definition: glext.h:6980
u32_t snd_wnd
Definition: uip_tcp.h:175
u16_t remote_port
Definition: uip_tcp.h:142
struct uip_tcp_pcb * uip_tcp_active_pcbs
Definition: uip_tcp.c:47
void uip_tcp_arg(struct uip_tcp_pcb *pcb, void *arg)
Definition: uip_tcp.c:486
GLfloat GLfloat p
Definition: glext.h:9809
#define PACK_STRUCT_END
Definition: arch.h:50
s8_t uip_tcpenqueue(struct uip_tcp_pcb *pcb, void *arg, u16_t len, u8_t flags, u8_t copy, u8_t *optdata, u8_t optlen)
Definition: uip_tcp.c:86
u16_t rcv_wnd
Definition: uip_tcp.h:154
s16 s16_t
Definition: cc.h:46
u32_t lastack
Definition: uip_tcp.h:169
struct uip_tcpseg * ooseq
Definition: uip_tcp.h:183
s8_t(* accept)(void *arg, struct uip_tcp_pcb *newpcb, s8_t err)
Definition: uip_tcp.h:185
u8 u8_t
Definition: cc.h:43
s16_t sv
Definition: uip_tcp.h:164
s8_t(* recv)(void *arg, struct uip_tcp_pcb *pcb, struct uip_pbuf *p, s8_t err)
Definition: uip_tcp.h:190
void uip_tcp_keepalive(struct uip_tcp_pcb *pcb)
Definition: uip_tcp.c:732
u8_t pollinterval
Definition: uip_tcp.h:157
u32_t snd_nxt
Definition: uip_tcp.h:175
void uip_tcp_rexmit(struct uip_tcp_pcb *pcb)
Definition: uip_tcp.c:756
struct uip_tcp_pcb * uip_tcp_pcballoc(u8_t prio)
Definition: uip_tcp.c:491
u8_t prio
Definition: uip_tcp.h:204
u32_t snd_wl1
Definition: uip_tcp.h:175
u16_t len
Definition: uip_tcp.h:128
UIP_IP_PCB
Definition: uip_tcp.h:133
void uip_tcp_fasttmr()
Definition: uip_tcp.c:792
struct uip_tcp_pcb * pcbs
Definition: uip_tcp.h:214
u32_t tmr
Definition: uip_tcp.h:156
Definition: uip_tcp.h:124
u32 u32_t
Definition: cc.h:47
u16_t local_port
Definition: uip_tcp.h:141
u16_t local_port
Definition: uip_tcp.h:207
u32_t uip_tcpiss_next()
Definition: uip_tcp.c:906
u16_t rto
Definition: uip_tcp.h:166
PACK_STRUCT_FIELD(u16_t src)
Definition: uip_tcp.h:118
s8_t uip_tcpoutput(struct uip_tcp_pcb *pcb)
Definition: uip_tcp.c:360
PACK_STRUCT_BEGIN struct uip_tcp_hdr PACK_STRUCT_STRUCT
void uip_tcp_recv(struct uip_tcp_pcb *pcb, s8_t(*recv)(void *, struct uip_tcp_pcb *, struct uip_pbuf *, s8_t))
Definition: uip_tcp.c:470
Definition: uip_tcp.h:115
GLenum GLenum dst
Definition: glext.h:6980
Definition: uip_tcp.h:121
void uip_tcp_err(struct uip_tcp_pcb *pcb, void(*errf)(void *, s8_t))
Definition: uip_tcp.c:465
enum uip_tcp_state state
Definition: uip_tcp.h:202
Definition: uip_tcp.h:116
GLbitfield flags
Definition: glext.h:7828
void(* errf)(void *arg, s8_t err)
Definition: uip_tcp.h:192
UIP_IP_PCB
Definition: uip_tcp.h:199
void uip_tcp_accept(struct uip_tcp_pcb *pcb, s8_t(*accept)(void *, struct uip_tcp_pcb *, s8_t))
Definition: uip_tcp.c:460
s8_t uip_tcp_sendctrl(struct uip_tcp_pcb *pcb, u8_t flags)
Definition: uip_tcp.c:69
u8_t uip_tcpsegs_free(struct uip_tcpseg *seg)
Definition: uip_tcp.c:926
void uip_tcp_abort(struct uip_tcp_pcb *pcb)
Definition: uip_tcp.c:694
Definition: uip_tcp.h:111
u8_t keepcnt
Definition: uip_tcp.h:195
Definition: uip_tcp.h:117
u8_t prio
Definition: uip_tcp.h:138
Definition: uip_tcp.h:119
struct uip_tcpseg * uip_tcpseg_copy(struct uip_tcpseg *seg)
Definition: uip_tcp.c:913
Definition: uip_netif.h:29
struct uip_tcp_pcb * uip_tcp_tw_pcbs
Definition: uip_tcp.c:48
u16 u16_t
Definition: cc.h:45
struct uip_tcp_pcb * uip_tcp_listen(struct uip_tcp_pcb *pcb)
Definition: uip_tcp.c:587
void uip_tcp_tmr()
Definition: uip_tcp.c:439
enum uip_tcp_state state
Definition: uip_tcp.h:136