You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
3.6 KiB
139 lines
3.6 KiB
/*! \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 <inttypes.h>
|
|
#include "HardwareSerial.h"
|
|
|
|
#include <avr/pgmspace.h>
|
|
#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();
|
|
}
|
|
*/
|
|
|