/*! \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 netChecksum(netIpHeader *data, uint16_t len) { register uint32_t sum = 0; for (;;) { if (len < 2) break; //sum += *((uint16_t *)data)++; sum += *((uint16_t *)data); data+=2; len -= 2; } if (len) sum += *(uint8_t *) data; while ((len = (uint16_t) (sum >> 16)) != 0) sum = (uint16_t) sum + len; Serial.print("Checksum: "); Serial.println((uint16_t) sum ^ 0xFFFF, HEX); return (uint16_t) sum ^ 0xFFFF; } 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_P(PSTR(".")); Serial.print(((unsigned char*)&ipaddr)[2], DEC); SPrint_P(PSTR(".")); Serial.print(((unsigned char*)&ipaddr)[1], DEC); SPrint_P(PSTR(".")); Serial.print(((unsigned char*)&ipaddr)[0], DEC); } /* void netPrintEthHeader(struct netEthHeader* eth_hdr) { SPrint_P(PSTR("Eth Packet Type: 0x")); Serial.print(eth_hdr->type); SPrint_P(PSTR(" SRC:")); netPrintEthAddr(ð_hdr->src); SPrint_P(PSTR("->DST:")); netPrintEthAddr(ð_hdr->dest); Serial.println(); } void netPrintIpHeader(struct netIpHeader* ipheader) { SPrint_P(PSTR("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_P(PSTR("Protocol: ICMP\r\n")); else if(ipheader->proto == IP_PROTO_TCP) SPrint_P(PSTR("Protocol: TCP\r\n")); else if(ipheader->proto == IP_PROTO_UDP) SPrint_P(PSTR("Protocol: UDP\r\n")); else SPrint_P(PSTR("Protocol: %d\r\n", ipheader->proto); SPrint_P(PSTR("SourceIP: ")); netPrintIPAddr(htonl(ipheader->srcipaddr)); Serial.println(); SPrint_P(PSTR("Dest IP: ")); netPrintIPAddr(htonl(ipheader->destipaddr)); Serial.println(); } void netPrintTcpHeader(struct netTcpHeader* tcpheader) { SPrint_P(PSTR("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_P(PSTR("Seq Num : 0x")); Serial.printu32(htonl(tcpheader->seqno)); Serial.println(); SPrint_P(PSTR("Ack Num : 0x")); Serial.printu32(htonl(tcpheader->ackno)); Serial.println(); SPrint_P(PSTR("Flags : ")); if(tcpheader->flags & TCP_FLAGS_FIN) SPrint_P(PSTR("FIN ")); if(tcpheader->flags & TCP_FLAGS_SYN) SPrint_P(PSTR("SYN ")); if(tcpheader->flags & TCP_FLAGS_RST) SPrint_P(PSTR("RST ")); if(tcpheader->flags & TCP_FLAGS_PSH) SPrint_P(PSTR("PSH ")); if(tcpheader->flags & TCP_FLAGS_ACK) SPrint_P(PSTR("ACK ")); if(tcpheader->flags & TCP_FLAGS_URG) SPrint_P(PSTR("URG ")); Serial.println(); } */