?lang_form? ?lang_select? ?lang_submit? ?lang_endform?
{HEADER END}
{FILE START}

library

?curdirlinks? - Rev 6

?prevdifflink? - Blame - ?getfile?

/*! \file netstack.c \brief Network Stack. */
//*****************************************************************************
//
// File Name    : 'netstack.c'
// Title                : Network Stack
// Author               : Pascal Stang
// Created              : 6/28/2005
// Revised              : 9/20/2005
// Version              : 0.3
// Target MCU   : Atmel AVR series
// Editor Tabs  : 4
//
//*****************************************************************************

#include "rprintf.h"
#include "debug.h"

#include "netstack.h"

unsigned char NetBuffer[NETSTACK_BUFFERSIZE];

void netstackInit(uint32_t ipaddress, uint32_t netmask, uint32_t gatewayip)
{
        // init network device driver
        #ifdef NETSTACK_DEBUG
        rprintf("Initializing Network Device\r\n");
        #endif
        nicInit();
        // init ARP
        #ifdef NETSTACK_DEBUG
        rprintf("Initializing ARP cache\r\n");
        #endif
        arpInit();
        // init addressing
        #ifdef NETSTACK_DEBUG
        rprintf("Initializing Addressing\r\n");
        #endif
        ipSetConfig(ipaddress, netmask, gatewayip);
}

u08* netstackGetBuffer(void)
{
        return NetBuffer;
}

int netstackService(void)
{
        int len;
        struct netEthHeader* ethPacket;

        // look for a packet
        len = nicPoll(NETSTACK_BUFFERSIZE, NetBuffer);

        if(len)
        {
                ethPacket = (struct netEthHeader*)&NetBuffer[0];

                #if NET_DEBUG >= 5
                rprintf("Received packet len: %d, type:", len);
                rprintfu16(htons(ethPacket->type));
                rprintfCRLF();
                rprintf("Packet Contents\r\n");
                debugPrintHexTable(len, NetBuffer);
                #endif
                
                if(ethPacket->type == htons(ETHTYPE_IP))
                {
                        // process an IP packet
                        #ifdef NETSTACK_DEBUG
                        rprintfProgStrM("NET Rx: IP packet\r\n");
                        #endif
                        // add the source to the ARP cache
                        // also correctly set the ethernet packet length before processing?
                        arpIpIn((struct netEthIpHeader*)&NetBuffer[0]);
                        //arpPrintTable();
                        
                        netstackIPProcess( len-ETH_HEADER_LEN, (ip_hdr*)&NetBuffer[ETH_HEADER_LEN] );
                }
                else if(ethPacket->type == htons(ETHTYPE_ARP))
                {
                        // process an ARP packet
                        #ifdef NETSTACK_DEBUG
                        rprintfProgStrM("NET Rx: ARP packet\r\n");
                        #endif
                        arpArpIn(len, ((struct netEthArpHeader*)&NetBuffer[0]) );
                }
        }
        return len;
}

void netstackIPProcess(unsigned int len, ip_hdr* packet)
{
        // check IP addressing, stop processing if not for me and not a broadcast
        if( (htonl(packet->destipaddr) != ipGetConfig()->ip) &&
                (htonl(packet->destipaddr) != (ipGetConfig()->ip|ipGetConfig()->netmask)) &&
                (htonl(packet->destipaddr) != 0xFFFFFFFF) ) 
                return;

        // handle ICMP packet
        if( packet->proto == IP_PROTO_ICMP )
        {
                #ifdef NETSTACK_DEBUG
                rprintfProgStrM("NET Rx: ICMP/IP packet\r\n");
                //icmpPrintHeader((icmpip_hdr*)packet);
                #endif
                icmpIpIn((icmpip_hdr*)packet);
        }
        else if( packet->proto == IP_PROTO_UDP )
        {
                #ifdef NETSTACK_DEBUG
                rprintfProgStrM("NET Rx: UDP/IP packet\r\n");
                //debugPrintHexTable(NetBufferLen-14, &NetBuffer[14]);
                #endif
                netstackUDPIPProcess(len, ((udpip_hdr*)packet) );
        }
        else if( packet->proto == IP_PROTO_TCP )
        {
                #ifdef NETSTACK_DEBUG
                rprintfProgStrM("NET Rx: TCP/IP packet\r\n");
                #endif
                netstackTCPIPProcess(len, ((tcpip_hdr*)packet) );
        }
        else
        {
                #ifdef NETSTACK_DEBUG
                rprintfProgStrM("NET Rx: IP packet\r\n");
                #endif
        }
}

void netstackUDPIPProcess(unsigned int len, udpip_hdr* packet)
{
        #ifdef NETSTACK_DEBUG
        rprintf("NetStack UDP/IP Rx Dummy Handler\r\n");
        #endif
}

void netstackTCPIPProcess(unsigned int len, tcpip_hdr* packet)
{
        #ifdef NETSTACK_DEBUG
        rprintf("NetStack TCP/IP Rx Dummy Handler\r\n");
        #endif
}
{FILE END}
{FOOTER START}

Powered by WebSVN v2.8.3