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 "ip.h"
00023
00024 uint32_t IpMyAddress;
00025 uint32_t IpNetmask;
00026 uint32_t IpGateway;
00027
00028 void ipSetAddress(uint32_t myIp, uint32_t netmask, uint32_t gatewayIp)
00029 {
00030 IpMyAddress = myIp;
00031 IpNetmask = netmask;
00032 IpGateway = gatewayIp;
00033 }
00034
00035 uint32_t ipGetMyAddress(void)
00036 {
00037 return IpMyAddress;
00038 }
00039
00040 void ipSend(uint32_t dstIp, uint8_t protocol, uint16_t len, uint8_t* data)
00041 {
00042
00043 struct netEthIpHeader* ethIpHeader;
00044
00045
00046 data -= ETH_HEADER_LEN+IP_HEADER_LEN;
00047 ethIpHeader = (struct netEthIpHeader*)data;
00048
00049
00050
00051
00052 len += IP_HEADER_LEN;
00053
00054
00055 ethIpHeader->ip.destipaddr = HTONL(dstIp);
00056 ethIpHeader->ip.srcipaddr = HTONL(IpMyAddress);
00057 ethIpHeader->ip.proto = protocol;
00058 ethIpHeader->ip.len = htons(len);
00059 ethIpHeader->ip.vhl = 0x45;
00060 ethIpHeader->ip.tos = 0;
00061 ethIpHeader->ip.ipid = 0;
00062 ethIpHeader->ip.ipoffset = 0;
00063 ethIpHeader->ip.ttl = IP_TIME_TO_LIVE;
00064 ethIpHeader->ip.ipchksum = 0;
00065
00066
00067
00068 ethIpHeader->ip.ipchksum = netChecksum(ðIpHeader->ip, IP_HEADER_LEN);
00069
00070
00071
00072 if( (dstIp & IpNetmask) == (IpMyAddress & IpNetmask) )
00073 arpIpOut(ethIpHeader,0);
00074 else
00075 arpIpOut(ethIpHeader,IpGateway);
00076
00077
00078 len += ETH_HEADER_LEN;
00079
00080
00081
00082
00083
00084
00085 nicSend(len, data);
00086 }
00087
00088
00089 void udpSend(uint32_t dstIp, uint16_t dstPort, uint16_t len, uint8_t* data)
00090 {
00091
00092 struct netUdpHeader* udpHeader;
00093
00094 data -= UDP_HEADER_LEN;
00095 udpHeader = (struct netUdpHeader*)data;
00096
00097 len += UDP_HEADER_LEN;
00098
00099 udpHeader->destport = HTONS(dstPort);
00100 udpHeader->srcport = HTONS(dstPort);
00101 udpHeader->udplen = htons(len);
00102 udpHeader->udpchksum = 0;
00103
00104
00105
00106 ipSend(dstIp, IP_PROTO_UDP, len, (uint8_t*)udpHeader);
00107 }