/*! \file net.c \brief Network support library. */ //***************************************************************************** // // File Name : 'net.c' // Title : Network support library // Author : Pascal Stang // Created : 8/30/2004 // Revised : 7/3/2005 // Version : 0.1 // Target MCU : Atmel AVR series // Editor Tabs : 4 // //***************************************************************************** #include #include "HardwareSerial.h" #include #include "programStrings.h" #include "net.h" uint16_t htons(uint16_t val) { return (val<<8) | (val>>8); } uint32_t htonl(uint32_t val) { return (htons(val>>16) | (uint32_t)htons(val&0x0000FFFF)<<16); } uint16_t generateChecksum(uint16_t sum, netIpHeader *data, uint16_t len) { uint16_t t; uint32_t *dataptr; uint32_t *last_byte; #ifdef NET_CHECKSUM_DEBUG SPrint("Length for chksum func: "); Serial.println((long int)len, HEX); #endif dataptr = (uint32_t *) data; last_byte = (uint32_t *) data + len - 1; while(dataptr < last_byte) { // At least two more bytes t = (dataptr[0] << 8) + dataptr[1]; sum += t; if(sum < t) { sum++; // carry } dataptr += 2; } if(dataptr == last_byte) { t = (dataptr[0] << 8) + 0; sum += t; if(sum < t) { sum++; // carry } } // Return sum in host byte order. return sum; } uint16_t ipChecksum(netIpHeader *data, uint16_t len) { return htons(generateChecksum(0, data, len)); } uint16_t netChecksum(netIpHeader *data, uint16_t len) { uint16_t sum; sum = generateChecksum(0, &data[len], len); return (sum == 0) ? 0xffff : htons(sum); } void netPrintEthAddr(struct netEthAddr* ethaddr) { Serial.print(ethaddr->addr[0], HEX); Serial.print(':'); Serial.print(ethaddr->addr[1], HEX); Serial.print(':'); Serial.print(ethaddr->addr[2], HEX); Serial.print(':'); Serial.print(ethaddr->addr[3], HEX); Serial.print(':'); Serial.print(ethaddr->addr[4], HEX); Serial.print(':'); Serial.print(ethaddr->addr[5], HEX); } void netPrintIPAddr(uint32_t ipaddr) { Serial.print(((unsigned char*)&ipaddr)[3], DEC); SPrint("."); Serial.print(((unsigned char*)&ipaddr)[2], DEC); SPrint("."); Serial.print(((unsigned char*)&ipaddr)[1], DEC); SPrint("."); Serial.print(((unsigned char*)&ipaddr)[0], DEC); } /* void netPrintEthHeader(struct netEthHeader* eth_hdr) { SPrint("Eth Packet Type: 0x"); Serial.print(eth_hdr->type); SPrint(" SRC:"); netPrintEthAddr(ð_hdr->src); SPrint("->DST:"); netPrintEthAddr(ð_hdr->dest); Serial.println(); } void netPrintIpHeader(struct netIpHeader* ipheader) { SPrint("IP Header\r\n"); SPrint_P(PSTR("Ver : %d\r\n", (ipheader->vhl)>>4); SPrint_P(PSTR("Length : %d\r\n", htons(ipheader->len)); if(ipheader->proto == IP_PROTO_ICMP) SPrint("Protocol: ICMP\r\n"); else if(ipheader->proto == IP_PROTO_TCP) SPrint("Protocol: TCP\r\n"); else if(ipheader->proto == IP_PROTO_UDP) SPrint("Protocol: UDP\r\n"); else SPrint_P(PSTR("Protocol: %d\r\n", ipheader->proto); SPrint("SourceIP: "); netPrintIPAddr(htonl(ipheader->srcipaddr)); Serial.println(); SPrint("Dest IP: "); netPrintIPAddr(htonl(ipheader->destipaddr)); Serial.println(); } void netPrintTcpHeader(struct netTcpHeader* tcpheader) { SPrint("TCP Header\r\n"); SPrint_P(PSTR("Src Port: %d\r\n", htons(tcpheader->srcport)); SPrint_P(PSTR("Dst Port: %d\r\n", htons(tcpheader->destport)); SPrint("Seq Num : 0x"); Serial.printu32(htonl(tcpheader->seqno)); Serial.println(); SPrint("Ack Num : 0x"); Serial.printu32(htonl(tcpheader->ackno)); Serial.println(); SPrint("Flags : "); if(tcpheader->flags & TCP_FLAGS_FIN) SPrint("FIN "); if(tcpheader->flags & TCP_FLAGS_SYN) SPrint("SYN "); if(tcpheader->flags & TCP_FLAGS_RST) SPrint("RST "); if(tcpheader->flags & TCP_FLAGS_PSH) SPrint("PSH "); if(tcpheader->flags & TCP_FLAGS_ACK) SPrint("ACK "); if(tcpheader->flags & TCP_FLAGS_URG) SPrint("URG "); Serial.println(); } */