00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include <inttypes.h>
00016 #include "global.h"
00017 #include "rprintf.h"
00018
00019 #include "net.h"
00020
00021 unsigned long IpMyAddress;
00022
00023 uint16_t htons(uint16_t val)
00024 {
00025 return (val<<8) | (val>>8);
00026 }
00027
00028 uint32_t htonl(uint32_t val)
00029 {
00030 return (htons(val>>16) | (uint32_t)htons(val&0x0000FFFF)<<16);
00031 }
00032
00033
00034 uint16_t netChecksum(void *data, uint16_t len)
00035 {
00036 register uint32_t sum = 0;
00037
00038 for (;;) {
00039 if (len < 2)
00040 break;
00041
00042 sum += *((uint16_t *)data);
00043 data+=2;
00044 len -= 2;
00045 }
00046 if (len)
00047 sum += *(uint8_t *) data;
00048
00049 while ((len = (uint16_t) (sum >> 16)) != 0)
00050 sum = (uint16_t) sum + len;
00051
00052 return (uint16_t) sum ^ 0xFFFF;
00053 }
00054
00055 void netPrintEthAddr(struct netEthAddr* ethaddr)
00056 {
00057 rprintfu08(ethaddr->addr[0]);
00058 rprintfChar(':');
00059 rprintfu08(ethaddr->addr[1]);
00060 rprintfChar(':');
00061 rprintfu08(ethaddr->addr[2]);
00062 rprintfChar(':');
00063 rprintfu08(ethaddr->addr[3]);
00064 rprintfChar(':');
00065 rprintfu08(ethaddr->addr[4]);
00066 rprintfChar(':');
00067 rprintfu08(ethaddr->addr[5]);
00068 }
00069
00070 void netPrintIPAddr(uint32_t ipaddr)
00071 {
00072 rprintf("%d.%d.%d.%d",
00073 ((unsigned char*)&ipaddr)[3],
00074 ((unsigned char*)&ipaddr)[2],
00075 ((unsigned char*)&ipaddr)[1],
00076 ((unsigned char*)&ipaddr)[0]);
00077 }
00078
00079 void netPrintEthHeader(struct netEthHeader* eth_hdr)
00080 {
00081 rprintfProgStrM("Eth Packet Type: 0x");
00082 rprintfu16(eth_hdr->type);
00083
00084 rprintfProgStrM(" SRC:");
00085 rprintfu08(eth_hdr->src.addr[0]);
00086 rprintfu08(eth_hdr->src.addr[1]);
00087 rprintfu08(eth_hdr->src.addr[2]);
00088 rprintfu08(eth_hdr->src.addr[3]);
00089 rprintfu08(eth_hdr->src.addr[4]);
00090 rprintfu08(eth_hdr->src.addr[5]);
00091
00092 rprintfProgStrM("->DST:");
00093 rprintfu08(eth_hdr->dest.addr[0]);
00094 rprintfu08(eth_hdr->dest.addr[1]);
00095 rprintfu08(eth_hdr->dest.addr[2]);
00096 rprintfu08(eth_hdr->dest.addr[3]);
00097 rprintfu08(eth_hdr->dest.addr[4]);
00098 rprintfu08(eth_hdr->dest.addr[5]);
00099 rprintfCRLF();
00100 }