1 /*******************************************************************************
\r
2 * (c) Copyright 2009 SLS Corporation,All Rights Reserved.
\r
4 * tcpip.h:header file for TCP/IP implementation.
\r
5 * Version Author Comment
\r
6 * 1.0.0 SLS corp. First release
\r
8 /***************************************************************************//**
\r
9 * This header file contains the definition and datastructures for the TCP/IP
\r
10 * stack implementation.
\r
15 #define BUF_LEN 1500
\r
17 /* IP header length in terms of 16-bit words */
\r
18 #define IP_HDR_LEN 10
\r
19 #define IP_HDR_CSUM_OFFSET 5
\r
20 #define TCP_HDR_CSUM_OFFSET 8
\r
22 #define ETH_ADDR_LEN 6
\r
23 #define IP_ADDR_LEN 4
\r
24 #define ETH_TYPE_LEN 2
\r
25 #define ARP_HW_TYPE_LEN 2
\r
26 #define ARP_PROTO_TYPE_LEN 2
\r
27 #define ARP_OPCODE_LEN 2
\r
29 #define ETH_TYPE_0 0x08 /* both IP and ARP have 08 as the first byte */
\r
30 #define ETH_TYPE_ARP_1 0x06 /* 0806 is ARP */
\r
31 #define ETH_TYPE_IP_1 0x00 /* 0800 is IP */
\r
33 #define ARP_HW_TYPE_0 0x00 /* 0001 for ethernet */
\r
34 #define ARP_HW_TYPE_1 0x01 /* 0001 for ethernet */
\r
36 #define ARP_PROTO_TYPE_0 0x08 /* 0800 is IP */
\r
37 #define ARP_PROTO_TYPE_1 0x00
\r
39 #define ARP_OPCODE_0 0x00 /* same for req and reply */
\r
40 #define ARP_OPCODE_REQ_1 0x01 /* 0001 is Request */
\r
41 #define ARP_OPCODE_REPLY_1 0x02 /* 0002 is Reply */
\r
43 extern unsigned char my_IP_address[IP_ADDR_LEN];
\r
45 typedef struct ether_hdr {
\r
46 unsigned char da[ETH_ADDR_LEN]; /* destination MAC address */
\r
47 unsigned char sa[ETH_ADDR_LEN]; /* source MAC address */
\r
48 unsigned char type_code[ETH_TYPE_LEN]; /* type code */
\r
51 typedef struct arp_pkt {
\r
52 unsigned char hw_type[ARP_HW_TYPE_LEN]; /* Hardware Type */
\r
53 unsigned char proto_type[ARP_PROTO_TYPE_LEN]; /* Protocol Type */
\r
54 unsigned char hw_addr_len; /* Hardware Address Length */
\r
55 unsigned char proto_addr_len; /* Protocol Address Length */
\r
56 unsigned char opcode[ARP_OPCODE_LEN]; /* Opcode */
\r
57 unsigned char mac_sa[ETH_ADDR_LEN]; /* sender MAC address */
\r
58 unsigned char ip_sa[IP_ADDR_LEN]; /* sender IP address */
\r
59 unsigned char mac_ta[ETH_ADDR_LEN]; /* target MAC address */
\r
60 unsigned char ip_ta[IP_ADDR_LEN]; /* target IP address */
\r
63 #define ICMP_PROTO 0x01
\r
64 #define TCP_PROTO 0x06
\r
65 #define UDP_PROTO 0x11
\r
67 #define IP_CSUM_LEN 2
\r
69 #define IP_TLEN_LEN 2
\r
70 #define IP_FRAG_OFF_LEN 2
\r
72 typedef struct ip_hdr {
\r
73 unsigned char ver_hlen; /* version - 4 bits; IP hdr len - 4 bits */
\r
74 unsigned char tos; /* Type of service */
\r
75 unsigned char tlen[IP_TLEN_LEN]; /* Size of datagram (header + data) */
\r
76 unsigned char id[IP_ID_LEN]; /* together with sa, uniequly identifies pkt */
\r
77 unsigned char frag_off[IP_FRAG_OFF_LEN]; /* flags - 3 bits; fragment offset - 13 bits */
\r
78 unsigned char ttl; /* time to live */
\r
79 unsigned char proto; /* protocol */
\r
80 unsigned char csum[IP_CSUM_LEN]; /* header checksum */
\r
81 unsigned char sa[IP_ADDR_LEN]; /* IP source address */
\r
82 unsigned char da[IP_ADDR_LEN]; /* IP dest address */
\r
86 #define ICMP_TYPE_ECHO_REQUEST 8
\r
87 #define ICMP_TYPE_ECHO_REPLY 0
\r
89 typedef struct icmp_hdr {
\r
91 unsigned char icode;
\r
92 unsigned char csum[IP_CSUM_LEN];
\r
95 #define TCP_PORT_LEN 2
\r
96 #define TCP_SEQ_LEN 4
\r
97 #define TCP_WSIZE_LEN 2
\r
98 #define TCP_UPTR_LEN 2
\r
99 #define TCP_CSUM_LEN 2
\r
100 #define TCP_PLEN_LEN 2
\r
102 typedef struct tcp_hdr {
\r
103 unsigned char sp[TCP_PORT_LEN]; /* Source port */
\r
104 unsigned char dp[TCP_PORT_LEN]; /* Destination port */
\r
105 unsigned char seqnum[TCP_SEQ_LEN]; /* Sequence number */
\r
106 unsigned char acknum[TCP_SEQ_LEN]; /* Acknowledgement number */
\r
107 unsigned char data_off; /* Data Offset - 4 upper bits are valid */
\r
108 unsigned char urg_ack_psh_rst_syn_fin; /* 6 lower bits are valid */
\r
109 unsigned char wsize[TCP_WSIZE_LEN]; /* Window */
\r
110 unsigned char csum[TCP_CSUM_LEN]; /* Chekcsum */
\r
111 unsigned char uptr[TCP_UPTR_LEN]; /* Urgent pointer */
\r
114 #define UDP_LEN_LEN 2
\r
115 #define UDP_CSUM_LEN 2
\r
117 typedef struct udp_hdr {
\r
118 unsigned char sp[TCP_PORT_LEN]; /* Source port */
\r
119 unsigned char dp[TCP_PORT_LEN]; /* Destination port */
\r
120 unsigned char len[UDP_LEN_LEN]; /* length of packet */
\r
121 unsigned char csum[UDP_CSUM_LEN]; /* checksum */
\r
124 #define BOOTP_OPTCODE_DHCP_SUBNET 1 /* Subnet mask */
\r
125 #define BOOTP_OPTCODE_DHCP_ROUTER 3 /* Router*/
\r
126 #define BOOTP_OPTCODE_DHCP_DOMAIN 6 /* Domain */
\r
127 #define BOOTP_OPTCODE_DHCP_LEASE 51 /* Lease time*/
\r
128 #define BOOTP_OPTCODE_DHCP_TYPE 53 /* 53, 1, DHCP_TYPE_* */
\r
129 #define BOOTP_OPTCODE_DHCP_SID 54 /* 54, 4, a.b.c.d, Server ID */
\r
130 #define BOOTP_OPTCODE_DHCP_RENEW 58 /* Renewal time */
\r
131 #define BOOTP_OPTCODE_DHCP_REBIND 59 /* Rebinding time */
\r
133 #define BOOTP_OPTCODE_END 255 /* last in options */
\r
135 #define DHCP_TYPE_DISCOVER 1
\r
136 #define DHCP_TYPE_OFFER 2
\r
137 #define DHCP_TYPE_REQUEST 3
\r
138 #define DHCP_TYPE_DECLINE 4
\r
139 #define DHCP_TYPE_ACK 5
\r
140 #define DHCP_TYPE_NAK 6
\r
141 #define DHCP_TYPE_RELEASE 7
\r
144 #define BOOTP_OP_REQUEST 1
\r
145 #define BOOTP_OP_REPLY 2
\r
146 #define BOOTP_HWTYPE_ETH 1
\r
147 #define BOOTP_XID_LEN 4
\r
148 #define BOOTP_SEC_LEN 2
\r
149 #define BOOTP_CHLEN 16
\r
150 #define BOOTP_SN_LEN 64
\r
151 #define BOOTP_FL_LEN 128
\r
152 #define BOOTP_VEN_LEN 64
\r
154 #define BOOTP_CLIENT_PORT 68
\r
155 #define BOOTP_SERVER_PORT 67
\r
157 typedef struct bootp_pkt {
\r
158 unsigned char op; /* packet op code */
\r
159 unsigned char hwtype; /* hardware type */
\r
160 unsigned char hlen; /* hardware address length */
\r
161 unsigned char hops; /* client sets to zero */
\r
162 unsigned char xid[BOOTP_XID_LEN]; /* transaction ID, random */
\r
163 unsigned char secs[BOOTP_SEC_LEN]; /* seconds since boot */
\r
164 unsigned char flags[2]; /* flags */
\r
165 unsigned char ciaddr[IP_ADDR_LEN]; /* client IP ADDR */
\r
166 unsigned char yiaddr[IP_ADDR_LEN]; /* Your IP Addr */
\r
167 unsigned char siaddr[IP_ADDR_LEN]; /* Server IP ADDR */
\r
168 unsigned char giaddr[IP_ADDR_LEN]; /* Gateway IP ADDR */
\r
169 unsigned char chaddr[BOOTP_CHLEN]; /* Client Hardware Addr */
\r
170 unsigned char sname[BOOTP_SN_LEN]; /* Server Name */
\r
171 unsigned char file[BOOTP_FL_LEN]; /* File Path */
\r
172 unsigned char vend[BOOTP_VEN_LEN]; /* Vendor Data */
\r
175 typedef struct tcp_pseudo_hdr {
\r
176 unsigned char sa[IP_ADDR_LEN];
\r
177 unsigned char da[IP_ADDR_LEN];
\r
178 unsigned char zero;
\r
179 unsigned char proto;
\r
180 unsigned char plen[TCP_PLEN_LEN];
\r
181 } tcp_pseudo_hdr_t;
\r
183 typedef enum tcp_state_e {
\r
184 TCP_STATE_LISTEN = 0,
\r
185 TCP_STATE_SYN_RECVD,
\r
186 TCP_STATE_ESTABLISHED,
\r
187 TCP_STATE_LAST_ACK,
\r
192 typedef struct tcp_control_block {
\r
193 unsigned char local_port[TCP_PORT_LEN];
\r
194 unsigned char remote_port[TCP_PORT_LEN];
\r
195 unsigned char remote_addr[IP_ADDR_LEN];
\r
197 unsigned int local_seq;
\r
198 unsigned int remote_seq;
\r
199 unsigned char remote_mac[ETH_ADDR_LEN]; /* this really doesn't belong here */
\r
201 const uint8_t * tx_block_addr;
\r
202 unsigned short int tx_block_size;
\r
203 unsigned short int tx_block_idx;
\r
204 uint8_t * tcp_packet;
\r
205 } tcp_control_block_t;
\r
208 typedef enum tcp_cntrol_flags_e {
\r
209 TCP_CNTRL_FIN = 0x01,
\r
210 TCP_CNTRL_SYN = 0x02,
\r
211 TCP_CNTRL_RST = 0x04,
\r
212 TCP_CNTRL_PSH = 0x08,
\r
213 TCP_CNTRL_ACK = 0x10,
\r
214 TCP_CNTRL_URG = 0x20
\r
215 } tcp_control_flags_t;
\r
218 typedef struct arp_entry {
\r
219 unsigned char mac[ETH_ADDR_LEN]; /* MAC address */
\r
220 unsigned char ip[IP_ADDR_LEN]; /* IP address */
\r
221 unsigned char used; /* Is this entry used? */
\r
224 typedef arp_pkt_t *arp_pkt_xp;
\r
225 typedef ether_hdr_t *eth_hdr_xp;
\r
226 typedef ip_hdr_t *ip_hdr_xp;
\r
227 typedef icmp_hdr_t *icmp_hdr_xp;
\r
228 typedef udp_hdr_t *udp_hdr_xp;
\r
229 typedef tcp_hdr_t *tcp_hdr_xp;
\r
230 typedef tcp_pseudo_hdr_t *tcp_pseudo_hdr_xp;
\r
231 typedef bootp_pkt_t *bootp_pkt_xp;
\r
233 #endif /* _NETTYPE_H_ */
\r