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.
162 lines
3.8 KiB
162 lines
3.8 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 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();
|
|
}
|
|
*/
|
|
|