Line No. | Rev | Author | Line |
---|---|---|---|
1 | 6 | kaklik | /*! \file ip.c \brief IP (Internet Protocol) Library. */ |
2 | //***************************************************************************** |
||
3 | // |
||
4 | // File Name : 'ip.c' |
||
5 | // Title : IP (Internet Protocol) Library |
||
6 | // Author : Pascal Stang |
||
7 | // Created : 8/30/2004 |
||
8 | // Revised : 7/3/2005 |
||
9 | // Version : 0.1 |
||
10 | // Target MCU : Atmel AVR series |
||
11 | // Editor Tabs : 4 |
||
12 | // |
||
13 | //***************************************************************************** |
||
14 | |||
15 | |||
16 | #include <inttypes.h> |
||
17 | #include "global.h" |
||
18 | #include "rprintf.h" |
||
19 | |||
20 | #include "net.h" |
||
21 | #include "nic.h" |
||
22 | #include "arp.h" |
||
23 | #include "ip.h" |
||
24 | |||
25 | struct ipConfig IpMyConfig; ///< Local IP address/config structure |
||
26 | |||
27 | |||
28 | void ipSetConfig(uint32_t myIp, uint32_t netmask, uint32_t gatewayIp) |
||
29 | { |
||
30 | struct netEthAddr ethaddr; |
||
31 | |||
32 | // set local addressing |
||
33 | IpMyConfig.ip = myIp; |
||
34 | IpMyConfig.netmask = netmask; |
||
35 | IpMyConfig.gateway = gatewayIp; |
||
36 | |||
37 | // set ARP association |
||
38 | nicGetMacAddress(ethaddr.addr); |
||
39 | arpSetAddress(ðaddr, myIp); |
||
40 | } |
||
41 | |||
42 | struct ipConfig* ipGetConfig(void) |
||
43 | { |
||
44 | return &IpMyConfig; |
||
45 | } |
||
46 | |||
47 | // deprecated |
||
48 | /* |
||
49 | uint32_t ipGetMyAddress(void) |
||
50 | { |
||
51 | return IpMyConfig.ip; |
||
52 | } |
||
53 | */ |
||
54 | |||
55 | void ipSend(uint32_t dstIp, uint8_t protocol, uint16_t len, uint8_t* data) |
||
56 | { |
||
57 | // make pointer to ethernet/IP header |
||
58 | struct netEthIpHeader* ethIpHeader; |
||
59 | |||
60 | // move data pointer to make room for headers |
||
61 | data -= ETH_HEADER_LEN+IP_HEADER_LEN; |
||
62 | ethIpHeader = (struct netEthIpHeader*)data; |
||
63 | |||
64 | // debugPrintHexTable(len+ETH_HEADER_LEN+IP_HEADER_LEN, data); |
||
65 | |||
66 | // adjust length to add IP header |
||
67 | len += IP_HEADER_LEN; |
||
68 | |||
69 | // fill IP header |
||
70 | ethIpHeader->ip.destipaddr = HTONL(dstIp); |
||
71 | ethIpHeader->ip.srcipaddr = HTONL(IpMyConfig.ip); |
||
72 | ethIpHeader->ip.proto = protocol; |
||
73 | ethIpHeader->ip.len = htons(len); |
||
74 | ethIpHeader->ip.vhl = 0x45; |
||
75 | ethIpHeader->ip.tos = 0; |
||
76 | ethIpHeader->ip.ipid = 0; |
||
77 | ethIpHeader->ip.ipoffset = 0; |
||
78 | ethIpHeader->ip.ttl = IP_TIME_TO_LIVE; |
||
79 | ethIpHeader->ip.ipchksum = 0; |
||
80 | |||
81 | // calculate and apply IP checksum |
||
82 | // DO THIS ONLY AFTER ALL CHANGES HAVE BEEN MADE TO IP HEADER |
||
83 | ethIpHeader->ip.ipchksum = netChecksum(ðIpHeader->ip, IP_HEADER_LEN); |
||
84 | |||
85 | // add ethernet routing |
||
86 | // check if we need to send to gateway |
||
87 | if( (dstIp & IpMyConfig.netmask) == (IpMyConfig.ip & IpMyConfig.netmask) ) |
||
88 | { |
||
89 | arpIpOut(ethIpHeader,0); // local send |
||
90 | //rprintf("Sending IP packet on local net\r\n"); |
||
91 | } |
||
92 | else |
||
93 | { |
||
94 | arpIpOut(ethIpHeader,IpMyConfig.gateway); // gateway send |
||
95 | //rprintf("Sending IP packet to gateway\r\n"); |
||
96 | } |
||
97 | |||
98 | // adjust length to add ethernet header |
||
99 | len += ETH_HEADER_LEN; |
||
100 | |||
101 | // debug |
||
102 | //debugPrintHexTable(ETH_HEADER_LEN, &data[0]); |
||
103 | //debugPrintHexTable(len-ETH_HEADER_LEN, &data[ETH_HEADER_LEN]); |
||
104 | |||
105 | // send it |
||
106 | nicSend(len, data); |
||
107 | } |
||
108 | |||
109 | void udpSend(uint32_t dstIp, uint16_t dstPort, uint16_t len, uint8_t* data) |
||
110 | { |
||
111 | // make pointer to UDP header |
||
112 | struct netUdpHeader* udpHeader; |
||
113 | // move data pointer to make room for UDP header |
||
114 | data -= UDP_HEADER_LEN; |
||
115 | udpHeader = (struct netUdpHeader*)data; |
||
116 | // adjust length to add UDP header |
||
117 | len += UDP_HEADER_LEN; |
||
118 | // fill UDP header |
||
119 | udpHeader->destport = HTONS(dstPort); |
||
120 | udpHeader->srcport = HTONS(dstPort); |
||
121 | udpHeader->udplen = htons(len); |
||
122 | udpHeader->udpchksum = 0; |
||
123 | |||
124 | // debugPrintHexTable(UDP_HEADER_LEN, (uint8_t*)udpPacket); |
||
125 | |||
126 | ipSend(dstIp, IP_PROTO_UDP, len, (uint8_t*)udpHeader); |
||
127 | } |
||
128 | |||
129 | void ipPrintConfig(struct ipConfig* config) |
||
130 | { |
||
131 | rprintfProgStrM("IP Addr : "); netPrintIPAddr(config->ip); rprintfCRLF(); |
||
132 | rprintfProgStrM("Netmask : "); netPrintIPAddr(config->netmask); rprintfCRLF(); |
||
133 | rprintfProgStrM("Gateway : "); netPrintIPAddr(config->gateway); rprintfCRLF(); |
||
134 | } |
Powered by WebSVN v2.8.3