1
0
Fork 0
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

/*! \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(&eth_hdr->src);
SPrint("->DST:");
netPrintEthAddr(&eth_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();
}
*/