00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include <inttypes.h>
00017 #include "global.h"
00018 #include "rprintf.h"
00019
00020 #include "net.h"
00021 #include "nic.h"
00022 #include "arp.h"
00023 #include "ip.h"
00024
00025 uint32_t IpMyAddress;
00026 uint32_t IpNetmask;
00027 uint32_t IpGateway;
00028
00029 void ipSetAddress(uint32_t myIp, uint32_t netmask, uint32_t gatewayIp)
00030 {
00031 struct netEthAddr ethaddr;
00032
00033 IpMyAddress = myIp;
00034 IpNetmask = netmask;
00035 IpGateway = gatewayIp;
00036
00037
00038 nicGetMacAddress(ethaddr.addr);
00039 arpSetAddress(ðaddr, myIp);
00040 }
00041
00042 uint32_t ipGetMyAddress(void)
00043 {
00044 return IpMyAddress;
00045 }
00046
00047 void ipSend(uint32_t dstIp, uint8_t protocol, uint16_t len, uint8_t* data)
00048 {
00049
00050 struct netEthIpHeader* ethIpHeader;
00051
00052
00053 data -= ETH_HEADER_LEN+IP_HEADER_LEN;
00054 ethIpHeader = (struct netEthIpHeader*)data;
00055
00056
00057
00058
00059 len += IP_HEADER_LEN;
00060
00061
00062 ethIpHeader->ip.destipaddr = HTONL(dstIp);
00063 ethIpHeader->ip.srcipaddr = HTONL(IpMyAddress);
00064 ethIpHeader->ip.proto = protocol;
00065 ethIpHeader->ip.len = htons(len);
00066 ethIpHeader->ip.vhl = 0x45;
00067 ethIpHeader->ip.tos = 0;
00068 ethIpHeader->ip.ipid = 0;
00069 ethIpHeader->ip.ipoffset = 0;
00070 ethIpHeader->ip.ttl = IP_TIME_TO_LIVE;
00071 ethIpHeader->ip.ipchksum = 0;
00072
00073
00074
00075 ethIpHeader->ip.ipchksum = netChecksum(ðIpHeader->ip, IP_HEADER_LEN);
00076
00077
00078
00079 if( (dstIp & IpNetmask) == (IpMyAddress & IpNetmask) )
00080 {
00081 arpIpOut(ethIpHeader,0);
00082
00083 }
00084 else
00085 {
00086 arpIpOut(ethIpHeader,IpGateway);
00087
00088 }
00089
00090
00091 len += ETH_HEADER_LEN;
00092
00093
00094
00095
00096
00097
00098 nicSend(len, data);
00099 }
00100
00101
00102 void udpSend(uint32_t dstIp, uint16_t dstPort, uint16_t len, uint8_t* data)
00103 {
00104
00105 struct netUdpHeader* udpHeader;
00106
00107 data -= UDP_HEADER_LEN;
00108 udpHeader = (struct netUdpHeader*)data;
00109
00110 len += UDP_HEADER_LEN;
00111
00112 udpHeader->destport = HTONS(dstPort);
00113 udpHeader->srcport = HTONS(dstPort);
00114 udpHeader->udplen = htons(len);
00115 udpHeader->udpchksum = 0;
00116
00117
00118
00119 ipSend(dstIp, IP_PROTO_UDP, len, (uint8_t*)udpHeader);
00120 }