?lang_form? ?lang_select? ?lang_submit? ?lang_endform?
{HEADER END}
{BLAME START}

library

?curdirlinks? -

Blame information for rev 6

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(&ethaddr, 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(&ethIpHeader->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 }
{BLAME END}
{FOOTER START}

Powered by WebSVN v2.8.3