00001
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 #ifndef __UIP_H__
00054 #define __UIP_H__
00055
00056 #include "uipopt.h"
00057
00062 typedef u16_t uip_ip4addr_t[2];
00063 typedef u16_t uip_ip6addr_t[8];
00064 #if UIP_CONF_IPV6
00065 typedef uip_ip6addr_t uip_ipaddr_t;
00066 #else
00067 typedef uip_ip4addr_t uip_ipaddr_t;
00068 #endif
00069
00070
00071
00072
00073
00074
00075
00106 #define uip_sethostaddr(addr) uip_ipaddr_copy(uip_hostaddr, (addr))
00107
00126 #define uip_gethostaddr(addr) uip_ipaddr_copy((addr), uip_hostaddr)
00127
00138 #define uip_setdraddr(addr) uip_ipaddr_copy(uip_draddr, (addr))
00139
00150 #define uip_setnetmask(addr) uip_ipaddr_copy(uip_netmask, (addr))
00151
00152
00161 #define uip_getdraddr(addr) uip_ipaddr_copy((addr), uip_draddr)
00162
00171 #define uip_getnetmask(addr) uip_ipaddr_copy((addr), uip_netmask)
00172
00188 void uip_init(void);
00189
00195 void uip_setipid(u16_t id);
00196
00257 #define uip_input() uip_process(UIP_DATA)
00258
00301 #define uip_periodic(conn) do { uip_conn = &uip_conns[conn]; \
00302 uip_process(UIP_TIMER); } while (0)
00303
00308 #define uip_conn_active(conn) (uip_conns[conn].tcpstateflags != UIP_CLOSED)
00309
00323 #define uip_periodic_conn(conn) do { uip_conn = conn; \
00324 uip_process(UIP_TIMER); } while (0)
00325
00337 #define uip_poll_conn(conn) do { uip_conn = conn; \
00338 uip_process(UIP_POLL_REQUEST); } while (0)
00339
00340
00341 #if UIP_UDP
00342
00373 #define uip_udp_periodic(conn) do { uip_udp_conn = &uip_udp_conns[conn]; \
00374 uip_process(UIP_UDP_TIMER); } while (0)
00375
00390 #define uip_udp_periodic_conn(conn) do { uip_udp_conn = conn; \
00391 uip_process(UIP_UDP_TIMER); } while (0)
00392
00393
00394 #endif
00395
00422 #ifndef UIP_CONF_EXTERNAL_BUFFER
00423 extern u8_t uip_buf[UIP_BUFSIZE+2];
00424 #else
00425 extern unsigned char *uip_buf;
00426 #endif
00427
00430
00431
00432
00433
00434
00454 void uip_listen(u16_t port);
00455
00468 void uip_unlisten(u16_t port);
00469
00502 struct uip_conn *uip_connect(uip_ipaddr_t *ripaddr, u16_t port);
00503
00504
00505
00515 #define uip_outstanding(conn) ((conn)->len)
00516
00542 void uip_send(const void *data, int len);
00543
00553
00554 #define uip_datalen() uip_len
00555
00565 #define uip_urgdatalen() uip_urglen
00566
00574 #define uip_close() (uip_flags = UIP_CLOSE)
00575
00585 #define uip_abort() (uip_flags = UIP_ABORT)
00586
00595 #define uip_stop() (uip_conn->tcpstateflags |= UIP_STOPPED)
00596
00603 #define uip_stopped(conn) ((conn)->tcpstateflags & UIP_STOPPED)
00604
00614 #define uip_restart() do { uip_flags |= UIP_NEWDATA; \
00615 uip_conn->tcpstateflags &= ~UIP_STOPPED; \
00616 } while(0)
00617
00618
00619
00620
00621
00630 #define uip_udpconnection() (uip_conn == NULL)
00631
00641 #define uip_newdata() (uip_flags & UIP_NEWDATA)
00642
00652 #define uip_acked() (uip_flags & UIP_ACKDATA)
00653
00664 #define uip_connected() (uip_flags & UIP_CONNECTED)
00665
00674 #define uip_closed() (uip_flags & UIP_CLOSE)
00675
00684 #define uip_aborted() (uip_flags & UIP_ABORT)
00685
00694 #define uip_timedout() (uip_flags & UIP_TIMEDOUT)
00695
00706 #define uip_rexmit() (uip_flags & UIP_REXMIT)
00707
00720 #define uip_poll() (uip_flags & UIP_POLL)
00721
00728 #define uip_initialmss() (uip_conn->initialmss)
00729
00741 #define uip_mss() (uip_conn->mss)
00742
00770 struct uip_udp_conn *uip_udp_new(uip_ipaddr_t *ripaddr, u16_t rport);
00771
00779 #define uip_udp_remove(conn) (conn)->lport = 0
00780
00791 #define uip_udp_bind(conn, port) (conn)->lport = port
00792
00804 #define uip_udp_send(len) uip_send((char *)uip_appdata, len)
00805
00808
00809
00844 #define uip_ipaddr(addr, addr0,addr1,addr2,addr3) do { \
00845 ((u16_t *)(addr))[0] = HTONS(((addr0) << 8) | (addr1)); \
00846 ((u16_t *)(addr))[1] = HTONS(((addr2) << 8) | (addr3)); \
00847 } while(0)
00848
00856 #define uip_ip6addr(addr, addr0,addr1,addr2,addr3,addr4,addr5,addr6,addr7) do { \
00857 ((u16_t *)(addr))[0] = HTONS((addr0)); \
00858 ((u16_t *)(addr))[1] = HTONS((addr1)); \
00859 ((u16_t *)(addr))[2] = HTONS((addr2)); \
00860 ((u16_t *)(addr))[3] = HTONS((addr3)); \
00861 ((u16_t *)(addr))[4] = HTONS((addr4)); \
00862 ((u16_t *)(addr))[5] = HTONS((addr5)); \
00863 ((u16_t *)(addr))[6] = HTONS((addr6)); \
00864 ((u16_t *)(addr))[7] = HTONS((addr7)); \
00865 } while(0)
00866
00885 #if !UIP_CONF_IPV6
00886 #define uip_ipaddr_copy(dest, src) do { \
00887 ((u16_t *)dest)[0] = ((u16_t *)src)[0]; \
00888 ((u16_t *)dest)[1] = ((u16_t *)src)[1]; \
00889 } while(0)
00890 #else
00891 #define uip_ipaddr_copy(dest, src) memcpy(dest, src, sizeof(uip_ip6addr_t))
00892 #endif
00893
00914 #if !UIP_CONF_IPV6
00915 #define uip_ipaddr_cmp(addr1, addr2) (((u16_t *)addr1)[0] == ((u16_t *)addr2)[0] && \
00916 ((u16_t *)addr1)[1] == ((u16_t *)addr2)[1])
00917 #else
00918 #define uip_ipaddr_cmp(addr1, addr2) (memcmp(addr1, addr2, sizeof(uip_ip6addr_t)) == 0)
00919 #endif
00920
00945 #define uip_ipaddr_maskcmp(addr1, addr2, mask) \
00946 (((((u16_t *)addr1)[0] & ((u16_t *)mask)[0]) == \
00947 (((u16_t *)addr2)[0] & ((u16_t *)mask)[0])) && \
00948 ((((u16_t *)addr1)[1] & ((u16_t *)mask)[1]) == \
00949 (((u16_t *)addr2)[1] & ((u16_t *)mask)[1])))
00950
00951
00976 #define uip_ipaddr_mask(dest, src, mask) do { \
00977 ((u16_t *)dest)[0] = ((u16_t *)src)[0] & ((u16_t *)mask)[0]; \
00978 ((u16_t *)dest)[1] = ((u16_t *)src)[1] & ((u16_t *)mask)[1]; \
00979 } while(0)
00980
00999 #define uip_ipaddr1(addr) (htons(((u16_t *)(addr))[0]) >> 8)
01000
01019 #define uip_ipaddr2(addr) (htons(((u16_t *)(addr))[0]) & 0xff)
01020
01039 #define uip_ipaddr3(addr) (htons(((u16_t *)(addr))[1]) >> 8)
01040
01059 #define uip_ipaddr4(addr) (htons(((u16_t *)(addr))[1]) & 0xff)
01060
01070 #ifndef HTONS
01071 # if UIP_BYTE_ORDER == UIP_BIG_ENDIAN
01072 # define HTONS(n) (n)
01073 # else
01074 # define HTONS(n) (u16_t)((((u16_t) (n)) << 8) | (((u16_t) (n)) >> 8))
01075 # endif
01076 #else
01077 #error "HTONS already defined!"
01078 #endif
01079
01087 #ifndef htons
01088 u16_t htons(u16_t val);
01089 #endif
01090 #ifndef ntohs
01091 #define ntohs htons
01092 #endif
01093
01103 extern void *uip_appdata;
01104
01105 #if UIP_URGDATA > 0
01106
01107
01108
01109
01110
01111 extern void *uip_urgdata;
01112 #endif
01113
01114
01138 extern u16_t uip_len;
01139
01142 #if UIP_URGDATA > 0
01143 extern u16_t uip_urglen, uip_surglen;
01144 #endif
01145
01146
01157 struct uip_conn {
01158 uip_ipaddr_t ripaddr;
01160 u16_t lport;
01161 u16_t rport;
01164 u8_t rcv_nxt[4];
01166 u8_t snd_nxt[4];
01168 u16_t len;
01169 u16_t mss;
01171 u16_t initialmss;
01173 u8_t sa;
01175 u8_t sv;
01177 u8_t rto;
01178 u8_t tcpstateflags;
01179 u8_t timer;
01180 u8_t nrtx;
01184 uip_tcp_appstate_t appstate;
01185 };
01186
01187
01194 extern struct uip_conn *uip_conn;
01195
01196 extern struct uip_conn uip_conns[UIP_CONNS];
01205 extern u8_t uip_acc32[4];
01206
01210 #if UIP_UDP
01211
01214 struct uip_udp_conn {
01215 uip_ipaddr_t ripaddr;
01216 u16_t lport;
01217 u16_t rport;
01218 u8_t ttl;
01221 uip_udp_appstate_t appstate;
01222 };
01223
01227 extern struct uip_udp_conn *uip_udp_conn;
01228 extern struct uip_udp_conn uip_udp_conns[UIP_UDP_CONNS];
01229 #endif
01230
01236 struct uip_stats {
01237 struct {
01238 uip_stats_t drop;
01240 uip_stats_t recv;
01242 uip_stats_t sent;
01244 uip_stats_t vhlerr;
01246 uip_stats_t hblenerr;
01248 uip_stats_t lblenerr;
01250 uip_stats_t fragerr;
01252 uip_stats_t chkerr;
01254 uip_stats_t protoerr;
01256 } ip;
01257 struct {
01258 uip_stats_t drop;
01259 uip_stats_t recv;
01260 uip_stats_t sent;
01261 uip_stats_t typeerr;
01263 } icmp;
01264 struct {
01265 uip_stats_t drop;
01266 uip_stats_t recv;
01267 uip_stats_t sent;
01268 uip_stats_t chkerr;
01270 uip_stats_t ackerr;
01272 uip_stats_t rst;
01273 uip_stats_t rexmit;
01274 uip_stats_t syndrop;
01276 uip_stats_t synrst;
01278 } tcp;
01279 #if UIP_UDP
01280 struct {
01281 uip_stats_t drop;
01282 uip_stats_t recv;
01283 uip_stats_t sent;
01284 uip_stats_t chkerr;
01286 } udp;
01287 #endif
01288 };
01289
01295 extern struct uip_stats uip_stat;
01296
01297
01298
01299
01300
01301
01302
01303
01304
01305
01306
01307
01308
01309 extern u8_t uip_flags;
01310
01311
01312
01313
01314
01315
01316
01317
01318 #define UIP_ACKDATA 1
01319
01320
01321
01322 #define UIP_NEWDATA 2
01323
01324 #define UIP_REXMIT 4
01325
01326 #define UIP_POLL 8
01327
01328
01329 #define UIP_CLOSE 16
01330
01331
01332
01333
01334 #define UIP_ABORT 32
01335
01336
01337
01338
01339 #define UIP_CONNECTED 64
01340
01341
01342
01343
01344 #define UIP_TIMEDOUT 128
01345
01346
01347
01348
01349
01350
01351 void uip_process(u8_t flag);
01352
01353
01354
01355
01356
01357
01358
01359
01360 #define UIP_DATA 1
01361
01362
01363
01364 #define UIP_TIMER 2
01365
01366 #define UIP_POLL_REQUEST 3
01367
01368 #define UIP_UDP_SEND_CONN 4
01369
01370
01371 #if UIP_UDP
01372 #define UIP_UDP_TIMER 5
01373 #endif
01374
01375
01376 #define UIP_CLOSED 0
01377 #define UIP_SYN_RCVD 1
01378 #define UIP_SYN_SENT 2
01379 #define UIP_ESTABLISHED 3
01380 #define UIP_FIN_WAIT_1 4
01381 #define UIP_FIN_WAIT_2 5
01382 #define UIP_CLOSING 6
01383 #define UIP_TIME_WAIT 7
01384 #define UIP_LAST_ACK 8
01385 #define UIP_TS_MASK 15
01386
01387 #define UIP_STOPPED 16
01388
01389
01390
01391 #ifdef __ICCARM__
01392 #pragma pack(1)
01393 #endif
01394
01395
01396 #if defined ( __CC_ARM )
01397 __packed
01398 #elif defined ( __GNUC__ )
01399 __attribute__ ((__packed__))
01400 #endif
01401 struct uip_tcpip_hdr {
01402 #if UIP_CONF_IPV6
01403
01404 u8_t vtc,
01405 tcflow;
01406 u16_t flow;
01407 u8_t len[2];
01408 u8_t proto, ttl;
01409 uip_ip6addr_t srcipaddr, destipaddr;
01410 #else
01411
01412 u8_t vhl,
01413 tos,
01414 len[2],
01415 ipid[2],
01416 ipoffset[2],
01417 ttl,
01418 proto;
01419 u16_t ipchksum;
01420 u16_t srcipaddr[2],
01421 destipaddr[2];
01422 #endif
01423
01424
01425 u16_t srcport,
01426 destport;
01427 u8_t seqno[4],
01428 ackno[4],
01429 tcpoffset,
01430 flags,
01431 wnd[2];
01432 u16_t tcpchksum;
01433 u8_t urgp[2];
01434 u8_t optdata[4];
01435 } ;
01436
01437 #ifdef __ICCARM__
01438 #pragma pack()
01439 #endif
01440
01441
01442 #ifdef __ICCARM__
01443 #pragma pack(1)
01444 #endif
01445
01446
01447 #if defined ( __CC_ARM )
01448 __packed
01449 #elif defined ( __GNUC__ )
01450 __attribute__ ((__packed__))
01451 #endif
01452 struct uip_icmpip_hdr {
01453 #if UIP_CONF_IPV6
01454
01455 u8_t vtc,
01456 tcf;
01457 u16_t flow;
01458 u8_t len[2];
01459 u8_t proto, ttl;
01460 uip_ip6addr_t srcipaddr, destipaddr;
01461 #else
01462
01463 u8_t vhl,
01464 tos,
01465 len[2],
01466 ipid[2],
01467 ipoffset[2],
01468 ttl,
01469 proto;
01470 u16_t ipchksum;
01471 u16_t srcipaddr[2],
01472 destipaddr[2];
01473 #endif
01474
01475
01476 u8_t type, icode;
01477 u16_t icmpchksum;
01478 #if !UIP_CONF_IPV6
01479 u16_t id, seqno;
01480 #else
01481 u8_t flags, reserved1, reserved2, reserved3;
01482 u8_t icmp6data[16];
01483 u8_t options[1];
01484 #endif
01485 } ;
01486
01487 #ifdef __ICCARM__
01488 #pragma pack()
01489 #endif
01490
01491
01492
01493 #ifdef __ICCARM__
01494 #pragma pack(1)
01495 #endif
01496
01497
01498 #if defined ( __CC_ARM )
01499 __packed
01500 #elif defined ( __GNUC__ )
01501 __attribute__ ((__packed__))
01502 #endif
01503 struct uip_udpip_hdr {
01504 #if UIP_CONF_IPV6
01505
01506 u8_t vtc,
01507 tcf;
01508 u16_t flow;
01509 u8_t len[2];
01510 u8_t proto, ttl;
01511 uip_ip6addr_t srcipaddr, destipaddr;
01512 #else
01513
01514 u8_t vhl,
01515 tos,
01516 len[2],
01517 ipid[2],
01518 ipoffset[2],
01519 ttl,
01520 proto;
01521 u16_t ipchksum;
01522 u16_t srcipaddr[2],
01523 destipaddr[2];
01524 #endif
01525
01526
01527 u16_t srcport,
01528 destport;
01529 u16_t udplen;
01530 u16_t udpchksum;
01531 } ;
01532
01533 #ifdef __ICCARM__
01534 #pragma pack()
01535 #endif
01536
01537
01538
01553 #define UIP_APPDATA_SIZE (UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN)
01554
01555
01556 #define UIP_PROTO_ICMP 1
01557 #define UIP_PROTO_TCP 6
01558 #define UIP_PROTO_UDP 17
01559 #define UIP_PROTO_ICMP6 58
01560
01561
01562 #if UIP_CONF_IPV6
01563 #define UIP_IPH_LEN 40
01564 #else
01565 #define UIP_IPH_LEN 20
01566 #endif
01567 #define UIP_UDPH_LEN 8
01568 #define UIP_TCPH_LEN 20
01569 #define UIP_IPUDPH_LEN (UIP_UDPH_LEN + UIP_IPH_LEN)
01570
01571
01572 #define UIP_IPTCPH_LEN (UIP_TCPH_LEN + UIP_IPH_LEN)
01573
01574
01575 #define UIP_TCPIP_HLEN UIP_IPTCPH_LEN
01576
01577
01578 #if UIP_FIXEDADDR
01579 extern const uip_ipaddr_t uip_hostaddr, uip_netmask, uip_draddr;
01580 #else
01581 extern uip_ipaddr_t uip_hostaddr, uip_netmask, uip_draddr;
01582 #endif
01583
01584
01585
01589 #ifdef __ICCARM__
01590 #pragma pack(1)
01591 #endif
01592
01593
01594 #if defined ( __CC_ARM )
01595 __packed
01596 #elif defined ( __GNUC__ )
01597 __attribute__ ((__packed__))
01598 #endif
01599 struct uip_eth_addr {
01600 u8_t addr[6];
01601 } ;
01602
01603 #ifdef __ICCARM__
01604 #pragma pack()
01605 #endif
01606
01623 u16_t uip_chksum(u16_t *buf, u16_t len);
01624
01634 u16_t uip_ipchksum(void);
01635
01645 u16_t uip_tcpchksum(void);
01646
01656 u16_t uip_udpchksum(void);
01657
01658
01659 #endif
01660
01661