diff options
Diffstat (limited to 'c/src/lib/libbsp/arm/nds/dswifi/arm9')
26 files changed, 0 insertions, 6022 deletions
diff --git a/c/src/lib/libbsp/arm/nds/dswifi/arm9/makefile b/c/src/lib/libbsp/arm/nds/dswifi/arm9/makefile deleted file mode 100644 index ef827e7062..0000000000 --- a/c/src/lib/libbsp/arm/nds/dswifi/arm9/makefile +++ /dev/null @@ -1,150 +0,0 @@ -#--------------------------------------------------------------------------------- -.SUFFIXES: -#--------------------------------------------------------------------------------- -ifeq ($(strip $(DEVKITARM)),) -$(error "Please set DEVKITARM in your environment. export DEVKITARM=<path to>devkitARM) -endif - -include $(DEVKITARM)/ds_rules - -TOPDIR ?= $(CURDIR)/.. - -#--------------------------------------------------------------------------------- -# BUILD is the directory where object files & intermediate files will be placed -# SOURCES is a list of directories containing source code -# INCLUDES is a list of directories containing extra header files -# DATA is a list of directories containing binary files -# all directories are relative to this makefile -#--------------------------------------------------------------------------------- -BUILD ?= release -SOURCES := source ../common/source -INCLUDES := include ../common/source ../include -DATA := data - -#--------------------------------------------------------------------------------- -# options for code generation -#--------------------------------------------------------------------------------- -ARCH := -mthumb -mthumb-interwork -fno-schedule-insns2 - -# note: arm9tdmi isn't the correct CPU arch, but anything newer and LD -# *insists* it has a FPU or VFP, and it won't take no for an answer! -CFLAGS := -g -Wall -O2\ - -mcpu=arm9tdmi -mtune=arm9tdmi -fomit-frame-pointer\ - -ffast-math \ - $(ARCH) - -CFLAGS += $(INCLUDE) -DARM9 -CXXFLAGS := $(CFLAGS) - -ASFLAGS := -g $(ARCH) -LDFLAGS = -specs=ds_arm9.specs -g $(ARCH) -mno-fpu -Wl,-Map,$(notdir $*.map) - -ifneq ($(BUILD),debug) -export ARM9BIN := $(TOPDIR)/lib/libdswifi9.a -else -export ARM9BIN := $(TOPDIR)/lib/libdswifi9d.a -CFLAGS += -DSGIP_DEBUG -endif - - -#--------------------------------------------------------------------------------- -# any extra libraries we wish to link with the project -#--------------------------------------------------------------------------------- -LIBS := -#-lnds9 - -#--------------------------------------------------------------------------------- -# list of directories containing libraries, this must be the top level containing -# include and lib -#--------------------------------------------------------------------------------- -LIBDIRS := $(LIBNDS) - -#--------------------------------------------------------------------------------- -# no real need to edit anything past this point unless you need to add additional -# rules for different file extensions -#--------------------------------------------------------------------------------- -ifneq ($(BUILD),$(notdir $(CURDIR))) -#--------------------------------------------------------------------------------- - - -export DEPSDIR := $(CURDIR)/$(BUILD) - -export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ - $(foreach dir,$(DATA),$(CURDIR)/$(dir)) - -export CC := $(PREFIX)gcc -export CXX := $(PREFIX)g++ -export AR := $(PREFIX)ar -export OBJCOPY := $(PREFIX)objcopy - -CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) -CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) -SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) -BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) - -#--------------------------------------------------------------------------------- -# use CXX for linking C++ projects, CC for standard C -#--------------------------------------------------------------------------------- -ifeq ($(strip $(CPPFILES)),) -#--------------------------------------------------------------------------------- - export LD := $(CC) -#--------------------------------------------------------------------------------- -else -#--------------------------------------------------------------------------------- - export LD := $(CXX) -#--------------------------------------------------------------------------------- -endif -#--------------------------------------------------------------------------------- - -export OFILES := $(addsuffix .o,$(BINFILES)) \ - $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) - -export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ - $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ - $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ - -I$(CURDIR)/$(BUILD) - -export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) - -.PHONY: $(BUILD) clean - -#--------------------------------------------------------------------------------- -$(BUILD): - @[ -d $@ ] || mkdir -p $@ - @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/makefile - -#--------------------------------------------------------------------------------- -clean: - @echo clean ... - @rm -fr debug release - @rm -f $(TOPDIR)/lib/libdswifi9* - -all: $(ARM9BIN) - -#--------------------------------------------------------------------------------- -else - -DEPENDS := $(OFILES:.o=.d) - -#--------------------------------------------------------------------------------- -# main targets -#--------------------------------------------------------------------------------- -$(ARM9BIN) : $(OFILES) - @rm -f "$(ARM9BIN)" - @$(AR) rcs "$(ARM9BIN)" $(OFILES) - @echo built ... $(notdir $@) - -#--------------------------------------------------------------------------------- -# you need a rule like this for each extension you use as binary data -#--------------------------------------------------------------------------------- -%.bin.o : %.bin -#--------------------------------------------------------------------------------- - @echo $(notdir $<) - @$(bin2o) - - --include $(DEPENDS) - -#--------------------------------------------------------------------------------------- -endif -#--------------------------------------------------------------------------------------- diff --git a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP.c b/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP.c deleted file mode 100644 index fa57f98adb..0000000000 --- a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP.c +++ /dev/null @@ -1,63 +0,0 @@ -// DSWifi Project - sgIP Internet Protocol Stack Implementation -// Copyright (C) 2005-2006 Stephen Stair - sgstair@akkit.org - http://www.akkit.org -/****************************************************************************** -DSWifi Lib and test materials are licenced under the MIT open source licence: -Copyright (c) 2005-2006 Stephen Stair - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -******************************************************************************/ - -#include "sgIP.h" - -unsigned long volatile sgIP_timems; -int sgIP_errno; - -// sgIP_Init(): Initializes sgIP hub and sets up a default surrounding interface (ARP and IP) -void sgIP_Init() { - sgIP_timems = 0; - sgIP_memblock_Init(); - sgIP_Hub_Init(); - sgIP_ARP_Init(); - sgIP_TCP_Init(); - sgIP_UDP_Init(); - sgIP_DNS_Init(); - sgIP_DHCP_Init(); - sgIP_Hub_AddProtocolInterface(PROTOCOL_ETHER_IP,&sgIP_IP_ReceivePacket,0); -} - - -unsigned long count_100ms; -unsigned long count_1000ms; -void sgIP_Timer(int num_ms) { - sgIP_timems+=num_ms; - count_100ms+=num_ms; - if(count_100ms>=100) { - count_100ms-=100; - if(count_100ms>=100) count_100ms=0; - sgIP_ARP_Timer100ms(); - } - count_1000ms+=num_ms; - if(count_1000ms>=1000) { - count_1000ms-=1000; - if(count_1000ms>=1000) count_1000ms=0; - sgIP_DNS_Timer1000ms(); - } - sgIP_TCP_Timer(); -} - diff --git a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP.h b/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP.h deleted file mode 100644 index 8965fe1ae6..0000000000 --- a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP.h +++ /dev/null @@ -1,56 +0,0 @@ -// DSWifi Project - sgIP Internet Protocol Stack Implementation -// Copyright (C) 2005-2006 Stephen Stair - sgstair@akkit.org - http://www.akkit.org -/****************************************************************************** -DSWifi Lib and test materials are licenced under the MIT open source licence: -Copyright (c) 2005-2006 Stephen Stair - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -******************************************************************************/ - - -#ifndef SGIP_H -#define SGIP_H - -#include "sgIP_Config.h" -#include "sgIP_memblock.h" -#include "sgIP_Hub.h" -#include "sgIP_IP.h" -#include "sgIP_ARP.h" -#include "sgIP_ICMP.h" -#include "sgIP_TCP.h" -#include "sgIP_UDP.h" -#include "sgIP_DNS.h" -#include "sgIP_DHCP.h" - -extern unsigned long volatile sgIP_timems; - -#ifdef __cplusplus -extern "C" { -#endif - - void sgIP_Init(void); - void sgIP_Timer(int num_ms); - - -#ifdef __cplusplus -}; -#endif - - -#endif diff --git a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_ARP.c b/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_ARP.c deleted file mode 100644 index eca655fe78..0000000000 --- a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_ARP.c +++ /dev/null @@ -1,304 +0,0 @@ -// DSWifi Project - sgIP Internet Protocol Stack Implementation -// Copyright (C) 2005-2006 Stephen Stair - sgstair@akkit.org - http://www.akkit.org -/****************************************************************************** -DSWifi Lib and test materials are licenced under the MIT open source licence: -Copyright (c) 2005-2006 Stephen Stair - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -******************************************************************************/ - -#include "sgIP_ARP.h" - -sgIP_ARP_Record ArpRecords[SGIP_ARP_MAXENTRIES]; - - -int sgIP_FindArpSlot(sgIP_Hub_HWInterface * hw, unsigned long destip) { - int i; - for(i=0;i<SGIP_ARP_MAXENTRIES;i++) { - if(ArpRecords[i].flags&SGIP_ARP_FLAG_ACTIVE) { - if(ArpRecords[i].linked_interface==hw && ArpRecords[i].protocol_address==destip) return i; - } - } - return -1; -} -int sgIP_GetArpSlot() { - int i,m,midle; - m=0; - midle=0; - for(i=0;i<SGIP_ARP_MAXENTRIES;i++) { - if(ArpRecords[i].flags&SGIP_ARP_FLAG_ACTIVE) { - if(ArpRecords[i].idletime>=midle) { - midle=ArpRecords[i].idletime; m=i; - } - } else { - return i; - } - } - // this slot *was* in use, so let's fix that situation. - if(ArpRecords[m].queued_packet) sgIP_memblock_free(ArpRecords[m].queued_packet); - ArpRecords[m].flags=0; - ArpRecords[m].retrycount=0; - ArpRecords[m].idletime=0; - ArpRecords[m].queued_packet=0; - return m; -} - -int sgIP_is_broadcast_address(sgIP_Hub_HWInterface * hw, unsigned long ipaddr) { - if((hw->snmask | ipaddr) == 0xFFFFFFFF) return 1; - return 0; -} - -// this function will protect against malformed packets that could cause internal problems. -int sgIP_ARP_Check_isok(sgIP_Hub_HWInterface * hw, sgIP_memblock * mb, sgIP_Header_ARP * arp) { - return 1; // doesn't do anything yet ;) -} - -void sgIP_ARP_Init() { - int i; - for(i=0;i<SGIP_ARP_MAXENTRIES;i++) { - ArpRecords[i].flags=0; - ArpRecords[i].idletime=0; - ArpRecords[i].queued_packet=0; - } -} -void sgIP_ARP_Timer100ms() { - int i; - for(i=0;i<SGIP_ARP_MAXENTRIES;i++) { - if(ArpRecords[i].flags & SGIP_ARP_FLAG_ACTIVE) { - ArpRecords[i].idletime++; - if(!(ArpRecords[i].flags&SGIP_ARP_FLAG_HAVEHWADDR)) { - ArpRecords[i].retrycount++; - if(ArpRecords[i].retrycount>125) { // it's a lost cause. - if(ArpRecords[i].queued_packet) { // if there is already a queued packet, kill it. - sgIP_memblock_free(ArpRecords[i].queued_packet); - } - ArpRecords[i].flags=0; - continue; - } - if((ArpRecords[i].retrycount&7)==7) { // attempt retransmit of ARP frame. - sgIP_ARP_SendARPRequest(ArpRecords[i].linked_interface, ArpRecords[i].linked_protocol, ArpRecords[i].protocol_address); - } - } - } - } -} - -void sgIP_ARP_FlushInterface(sgIP_Hub_HWInterface * hw) { - int i; - for(i=0;i<SGIP_ARP_MAXENTRIES;i++) { - if(ArpRecords[i].linked_interface==hw) ArpRecords[i].flags=0; - if(hw==0) ArpRecords[i].flags=0; // flush all interfaces - } -} - // don't *really* need to process this, but it helps. -int sgIP_ARP_ProcessIPFrame(sgIP_Hub_HWInterface * hw, sgIP_memblock * mb) { - - return 0; -} -int sgIP_ARP_ProcessARPFrame(sgIP_Hub_HWInterface * hw, sgIP_memblock * mb) { - int i, j, ip; - if(!hw || !mb) return 0; - sgIP_memblock_exposeheader(mb,-14); // hide 14 bytes at the start temporarily... - // look at arp frame... - sgIP_Header_ARP * arp = (sgIP_Header_ARP *) mb->datastart; - - if(!sgIP_ARP_Check_isok(hw,mb,arp)) { - sgIP_memblock_free(mb); - return 0; // error - arp header incorrect somehow. - } - sgIP_memblock_exposeheader(mb,14); // re-expose 14 bytes at the start... - - if(htons(arp->opcode)==1) { // request - // requested IP - ip = arp->addresses[arp->hw_addr_len*2+4+0]+(arp->addresses[arp->hw_addr_len*2+4+1]<<8)+(arp->addresses[arp->hw_addr_len*2+4+2]<<16)+(arp->addresses[arp->hw_addr_len*2+4+3]<<24); - SGIP_DEBUG_MESSAGE(("ARP: request IP %08X",ip)); - if(ip==hw->ipaddr) {// someone's asking for our info, toss them a reply. - sgIP_ARP_SendARPResponse(hw,mb); - return 0; - } - } - if(htons(arp->opcode)==2) { // response - // sender IP - ip = arp->addresses[arp->hw_addr_len+0]+(arp->addresses[arp->hw_addr_len+1]<<8)+(arp->addresses[arp->hw_addr_len+2]<<16)+(arp->addresses[arp->hw_addr_len+3]<<24); - i=sgIP_FindArpSlot(hw,ip); - if(i!=-1) { // we've been waiting for you... - for(j=0;j<arp->hw_addr_len;j++) ArpRecords[i].hw_address[j]=arp->addresses[j]; - ArpRecords[i].flags|=SGIP_ARP_FLAG_HAVEHWADDR; - sgIP_memblock * mb2; - mb2=ArpRecords[i].queued_packet; - ArpRecords[i].queued_packet=0; - if(mb2) sgIP_ARP_SendProtocolFrame(hw,mb2,ArpRecords[i].linked_protocol,ip); - } - } - - sgIP_memblock_free(mb); - return 0; -} -int sgIP_ARP_SendProtocolFrame(sgIP_Hub_HWInterface * hw, sgIP_memblock * mb, unsigned short protocol, unsigned long destaddr) { - int i,j; - int m; - sgIP_Header_Ethernet * ether; - if(!hw || !mb) return 0; - sgIP_memblock_exposeheader(mb,14); // add 14 bytes at the start for the header - - if(sgIP_is_broadcast_address(hw,destaddr)) { - // construct ethernet header - ether = (sgIP_Header_Ethernet *) mb->datastart; - for(j=0;j<6;j++) { - ether->src_mac[j] = hw->hwaddr[j]; - ether->dest_mac[j]= 0xFF; // broadcast destination - } - ether->protocol=protocol; - return sgIP_Hub_SendRawPacket(hw,mb); // this function will free the memory block when it's done. - } - - i=sgIP_FindArpSlot(hw,destaddr); - if(i!=-1) { - if(ArpRecords[i].flags & SGIP_ARP_FLAG_HAVEHWADDR) { // we have the adddress - ArpRecords[i].idletime=0; - // construct ethernet header - ether = (sgIP_Header_Ethernet *) mb->datastart; - for(j=0;j<6;j++) { - ether->src_mac[j] = hw->hwaddr[j]; - ether->dest_mac[j]= ArpRecords[i].hw_address[j]; - } - ether->protocol=protocol; - return sgIP_Hub_SendRawPacket(hw,mb); // this function will free the memory block when it's done. - } else { // we don't have the address, but are looking for it. - if(ArpRecords[i].queued_packet) { // if there is already a queued packet, reject the new one. - sgIP_memblock_free(mb); - return 0; // couldn't send. - } else { - sgIP_memblock_exposeheader(mb,-14); // re-hide ethernet header. - ArpRecords[i].queued_packet=mb; // queue packet. - ArpRecords[i].linked_protocol=protocol; // queue packet. - return 0; - } - } - } - m=sgIP_GetArpSlot(); // gets and cleans out an arp slot for us - // build new record - ArpRecords[m].flags=SGIP_ARP_FLAG_ACTIVE; - ArpRecords[m].idletime=0; - ArpRecords[m].retrycount=0; - ArpRecords[m].linked_interface=hw; - ArpRecords[m].protocol_address=destaddr; - sgIP_memblock_exposeheader(mb,-14); // re-hide ethernet header. - ArpRecords[m].queued_packet=mb; - ArpRecords[m].linked_protocol=protocol; - sgIP_ARP_SendARPRequest(hw,protocol,destaddr); - return 0; // queued, but not sent yet. -} - -int sgIP_ARP_SendARPResponse(sgIP_Hub_HWInterface * hw, sgIP_memblock * mb) { - int i; - if(!hw || !mb) return 0; - sgIP_memblock_exposeheader(mb,-14); // hide 14 bytes at the start temporarily... - - // Repurpose existing ARP packet - sgIP_Header_ARP * arp = (sgIP_Header_ARP *) mb->datastart; - if(!sgIP_ARP_Check_isok(hw,mb,arp)) { - sgIP_memblock_free(mb); - return 0; // error - arp header incorrect somehow. - } - - if(arp->hw_addr_len!=hw->hwaddrlen || arp->protocol_addr_len!=4) { - // eek! can't send it back in this sorry state! - sgIP_memblock_free(mb); - return 0; - } - - arp->opcode=htons(2); // response - for(i=0;i<hw->hwaddrlen;i++) arp->addresses[i+4+hw->hwaddrlen]=arp->addresses[i]; // copy src hw addr - for(i=0;i<4;i++) arp->addresses[i+(hw->hwaddrlen)*2+4]=arp->addresses[i+hw->hwaddrlen]; - for(i=0;i<hw->hwaddrlen;i++) arp->addresses[i]=hw->hwaddr[i]; - for(i=0;i<4;i++) arp->addresses[i+(hw->hwaddrlen)]=(hw->ipaddr>>(i*8))&255; - - // construct ethernet header - sgIP_memblock_exposeheader(mb,14); // add 14 bytes at the start for the header - sgIP_Header_Ethernet * ether = (sgIP_Header_Ethernet *) mb->datastart; - for(i=0;i<6;i++) { - ether->src_mac[i] = hw->hwaddr[i]; - ether->dest_mac[i]= arp->addresses[i+4+hw->hwaddrlen]; // requesting party - } - ether->protocol=htons(0x0806); // ARP protocol - - // Send ethernet packet - return sgIP_Hub_SendRawPacket(hw,mb); // this function will free the memory block when it's done. -} -int sgIP_ARP_SendGratARP(sgIP_Hub_HWInterface * hw) { - int i; - if(!hw) return 0; - sgIP_memblock * mb = sgIP_memblock_alloc(SGIP_HEADER_ARP_BASESIZE+2*4 + 2*hw->hwaddrlen); - if(!mb) return 0; - - // Construct ARP packet - sgIP_Header_ARP * arp = (sgIP_Header_ARP *) mb->datastart; - arp->hwspace=htons(1); // ethernet - arp->protocol=htons(0x0800); - arp->opcode=htons(2); // response - arp->hw_addr_len=hw->hwaddrlen; - arp->protocol_addr_len= 4; - for(i=0;i<hw->hwaddrlen;i++) arp->addresses[i]=hw->hwaddr[i]; - for(i=0;i<4;i++) arp->addresses[i+hw->hwaddrlen]=(hw->ipaddr>>(i*8))&255; - for(i=0;i<hw->hwaddrlen;i++) arp->addresses[i+4+hw->hwaddrlen]=hw->hwaddr[i]; - for(i=0;i<4;i++) arp->addresses[i+hw->hwaddrlen*2+4]=(hw->ipaddr>>(i*8))&255; - - // construct ethernet header - sgIP_memblock_exposeheader(mb,14); // add 14 bytes at the start for the header - sgIP_Header_Ethernet * ether = (sgIP_Header_Ethernet *) mb->datastart; - for(i=0;i<6;i++) { - ether->src_mac[i] = hw->hwaddr[i]; - ether->dest_mac[i]= 0xFF; // broadcast packet - } - ether->protocol=htons(0x0806); // ARP protocol - - // Send ethernet packet - return sgIP_Hub_SendRawPacket(hw,mb); // this function will free the memory block when it's done. -} -int sgIP_ARP_SendARPRequest(sgIP_Hub_HWInterface * hw, int protocol, unsigned long protocol_addr) { - int i; - if(!hw) return 0; - sgIP_memblock * mb = sgIP_memblock_alloc(SGIP_HEADER_ARP_BASESIZE+2*4 + 2*hw->hwaddrlen); - if(!mb) return 0; - - // Construct ARP packet - sgIP_Header_ARP * arp = (sgIP_Header_ARP *) mb->datastart; - arp->hwspace=htons(1); // 1=ethernet - arp->protocol=(protocol); - arp->opcode=htons(1); // 1=request - arp->hw_addr_len=hw->hwaddrlen; - arp->protocol_addr_len= 4; - for(i=0;i<hw->hwaddrlen;i++) arp->addresses[i]=hw->hwaddr[i]; - for(i=0;i<4;i++) arp->addresses[i+hw->hwaddrlen]=(hw->ipaddr>>(i*8))&255; - for(i=0;i<hw->hwaddrlen;i++) arp->addresses[i+4+hw->hwaddrlen]=0; - for(i=0;i<4;i++) arp->addresses[i+hw->hwaddrlen*2+4]=(protocol_addr>>(i*8))&255; - - // construct ethernet header - sgIP_memblock_exposeheader(mb,14); // add 14 bytes at the start for the header - sgIP_Header_Ethernet * ether = (sgIP_Header_Ethernet *) mb->datastart; - for(i=0;i<6;i++) { - ether->src_mac[i] = hw->hwaddr[i]; - ether->dest_mac[i]= 0xFF; // broadcast packet - } - ether->protocol=htons(0x0806); // ARP protocol - - // Send ethernet packet - return sgIP_Hub_SendRawPacket(hw,mb); // this function will free the memory block when it's done. -} diff --git a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_ARP.h b/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_ARP.h deleted file mode 100644 index eda6e89d32..0000000000 --- a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_ARP.h +++ /dev/null @@ -1,80 +0,0 @@ -// DSWifi Project - sgIP Internet Protocol Stack Implementation -// Copyright (C) 2005-2006 Stephen Stair - sgstair@akkit.org - http://www.akkit.org -/****************************************************************************** -DSWifi Lib and test materials are licenced under the MIT open source licence: -Copyright (c) 2005-2006 Stephen Stair - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -******************************************************************************/ -#ifndef SGIP_ARP_H -#define SGIP_ARP_H - -#include "sgIP_Config.h" -#include "sgIP_memblock.h" -#include "sgIP_Hub.h" - -#define SGIP_ARP_FLAG_ACTIVE 0x0001 -#define SGIP_ARP_FLAG_HAVEHWADDR 0x0002 - -typedef struct SGIP_ARP_RECORD { - unsigned short flags, retrycount; - unsigned long idletime; - sgIP_Hub_HWInterface * linked_interface; - sgIP_memblock * queued_packet; - int linked_protocol; - unsigned long protocol_address; - char hw_address[SGIP_MAXHWADDRLEN]; -} sgIP_ARP_Record; - - -typedef struct SGIP_HEADER_ARP { - unsigned short hwspace; // ethernet=1; - unsigned short protocol; - unsigned char hw_addr_len; - unsigned char protocol_addr_len; - unsigned short opcode; // request=1, reply=2 - unsigned char addresses[8+12]; // sender HW, sender Protocol, dest HW, dest Protocol -} sgIP_Header_ARP; - -#define SGIP_HEADER_ARP_BASESIZE 8 - -#ifdef __cplusplus -extern "C" { -#endif - - extern void sgIP_ARP_Init(void); - extern void sgIP_ARP_Timer100ms(void); - extern void sgIP_ARP_FlushInterface(sgIP_Hub_HWInterface * hw); - - extern int sgIP_ARP_ProcessIPFrame(sgIP_Hub_HWInterface * hw, sgIP_memblock * mb); - extern int sgIP_ARP_ProcessARPFrame(sgIP_Hub_HWInterface * hw, sgIP_memblock * mb); - extern int sgIP_ARP_SendProtocolFrame(sgIP_Hub_HWInterface * hw, sgIP_memblock * mb, unsigned short protocol, unsigned long destaddr); - - extern int sgIP_ARP_SendARPResponse(sgIP_Hub_HWInterface * hw, sgIP_memblock * mb); - extern int sgIP_ARP_SendGratARP(sgIP_Hub_HWInterface * hw); - extern int sgIP_ARP_SendARPRequest(sgIP_Hub_HWInterface * hw, int protocol, unsigned long protocol_addr); - - - -#ifdef __cplusplus -}; -#endif - - -#endif diff --git a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_Config.h b/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_Config.h deleted file mode 100644 index 26772b0f40..0000000000 --- a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_Config.h +++ /dev/null @@ -1,274 +0,0 @@ -// DSWifi Project - sgIP Internet Protocol Stack Implementation -// Copyright (C) 2005-2006 Stephen Stair - sgstair@akkit.org - http://www.akkit.org -/****************************************************************************** -DSWifi Lib and test materials are licenced under the MIT open source licence: -Copyright (c) 2005-2006 Stephen Stair - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -******************************************************************************/ - - -#ifndef SGIP_CONFIG_H -#define SGIP_CONFIG_H - -#include <errno.h> - -////////////////////////////////////////////////////////////////////////// -// General options - these control the core functionality of the stack. - -// SGIP_USEDYNAMICMEMORY: Allows the stack to use memory as it needs it, via malloc()/free() -// This option is extremely useful in environments where it can be used, as it prevents the -// overhead of allocating per-connection memory in advance, and allows an unlimited number -// of connections, provided the memory space. This option requires the implementation of -// two C functions, "void * sgIP_malloc(int)" and "void sgIP_free(void *)", which behave -// similarly to the malloc and free functions commonly used in C. -#define SGIP_USEDYNAMICMEMORY - -// SGIP_INTERRUPT_THREADING_MODEL: Provides memory protection in a system that can allow -// multiple processing "threads" by way of interrupts. This is not required on single -// threaded systems, and not adequate on multithreaded systems, but provides a way to -// allow protection against contention on interrupt-driven systems. This option requires -// the system to implement two C functions "int sgIP_DisableInterrupts()" and additionally -// "void sgIP_RestoreInterrupts(int)" that takes as a parameter the value returned by -// sgIP_DisableInterrupts(). Interrupts are disabled upon beginning work with sensitive -// memory areas or allocation/deallocation of memory, and are restored afterwards. -#define SGIP_INTERRUPT_THREADING_MODEL - -// SGIP_MULTITHREADED_THREADING_MODEL: Standard memory protection for large multithreaded -// systems, such as operating systems and the like. This kind of memory protection is -// useful for true multithreaded systems but useless in a single-threaded system and -// harmful in an interrupt-based multiprocess system. -//#define SGIP_MULTITHREADED_THREADING_MODEL - -#define SGIP_LITTLEENDIAN - -////////////////////////////////////////////////////////////////////////// -// Temporary memory system settings - -// SGIP_MEMBLOCK_DATASIZE: This is the maximum data size contained in a single sgIP_memblock. -// for best performance ensure this value is larger than any packet that is expected to be -// received, however, in a memory-tight situation, much smaller values can be used. -#define SGIP_MEMBLOCK_DATASIZE 1600 - -// SGIP_MEMBLOCK_BASENUM: The starting number of memblocks that will be allocated. This is -// also the total number of memblocks that will be allocated if sgIP is not configured to use -// dynamic memory allocation. -#define SGIP_MEMBLOCK_BASENUM 12 - -// SGIP_MEMBLOCK_STEPNUM: In the case that all memblocks are full, and dynamic memory is -// enabled, this many additional memblocks will be allocated in an attempt to satasfy the -// memory usage demands of the stack. -#define SGIP_MEMBLOCK_STEPNUM 6 - -// SGIP_MEMBLOCK_DYNAMIC_MALLOC_ALL: Who cares what the other memblock defines say, let's -// Generate all memblocks by mallocing 'em. -#define SGIP_MEMBLOCK_DYNAMIC_MALLOC_ALL - -////////////////////////////////////////////////////////////////////////// -// Hardware layer settings - -// SGIP_MAXHWADDRLEN: The maximum usable hardware address length. Ethernet is 6 bytes. -#define SGIP_MAXHWADDRLEN 8 - -// SGIP_MAXHWHEADER: The maximum allocated size for hardware headers. -#define SGIP_MAXHWHEADER 16 - -// SGIP_MTU_OVERRIDE: This is the maximum MTU that will be accepted. By default it is being -// set to 1460 bytes in order to be courteous to Ethernet and it's ridiculously low MTU. -// This value will allow you to prevent fragmentation of IP packets by not using the full -// MTU available to your network interface when the IP packet will just be sliced and diced -// at the next smaller MTU. (the stack will still use HW mtu if it's lower.) -#define SGIP_MTU_OVERRIDE 1460 - - -////////////////////////////////////////////////////////////////////////// -// Connection settings - can be tuned to change memory usage and performance - -// SGIP_TCP_STATELESS_LISTEN: Uses a technique to prevent syn-flooding from blocking listen -// ports by using all the connection blocks/memory. -#define SGIP_TCP_STATELESS_LISTEN - -// SGIP_TCP_STEALTH: Only sends packets in response to connections to active ports. Doing so -// causes ports to appear not as closed, but as if the deviced does not exist when probing -// ports that are not in use. -//#define SGIP_TCP_STEALTH - -// SGIP_TCP_TTL: Time-to-live value given to outgoing packets, in the absence of a reason to -// manually override this value. -#define SGIP_IP_TTL 128 - -// SGIP_TCPRECEIVEBUFFERLENGTH: The size (in bytes) of the receive FIFO in a TCP connection -#define SGIP_TCP_RECEIVEBUFFERLENGTH 8192 - -// SGIP_TCPTRANSMITBUFFERLENGTH: The size (in bytes) of the transmit FIFO in a TCP connection -#define SGIP_TCP_TRANSMITBUFFERLENGTH 8192 - -// SGIP_TCPOOBBUFFERLENGTH: The size (in bytes) of the receive OOB data FIFO in a TCP connection -#define SGIP_TCP_OOBBUFFERLENGTH 256 - -// SGIP_ARP_MAXENTRIES: The maximum number of cached ARP entries - this is defined staticly -// because it's somewhat impractical to dynamicly allocate memory for such a small structure -// (at least on most smaller systems) -#define SGIP_ARP_MAXENTRIES 32 - -// SGIP_HUB_MAXHWINTERFACES: The maximum number of hardware interfaces the sgIP hub will -// connect to. A hardware interface being some port (ethernet, wifi, etc) that will relay -// packets to the outside world. -#define SGIP_HUB_MAXHWINTERFACES 1 - -// SGIP_HUB_MAXPROTOCOLINTERFACES: The maximum number of protocol interfaces the sgIP hub will -// connect to. A protocol interface being a software handler for a certain protocol type -// (such as IP) -#define SGIP_HUB_MAXPROTOCOLINTERFACES 1 - -#define SGIP_TCP_FIRSTOUTGOINGPORT 40000 -#define SGIP_TCP_LASTOUTGOINGPORT 65000 -#define SGIP_UDP_FIRSTOUTGOINGPORT 40000 -#define SGIP_UDP_LASTOUTGOINGPORT 65000 - -#define SGIP_TCP_GENTIMEOUTMS 6000 -#define SGIP_TCP_TRANSMIT_DELAY 25 -#define SGIP_TCP_TRANSMIT_IMMTHRESH 40 -#define SGIP_TCP_TIMEMS_2MSL 1000*60*2 -#define SGIP_TCP_MAXRETRY 7 -#define SGIP_TCP_MAXSYNS 64 -#define SGIP_TCP_REACK_THRESH 1000 - -#define SGIP_TCP_SYNRETRYMS 250 -#define SGIP_TCP_GENRETRYMS 500 -#define SGIP_TCP_BACKOFFMAX 6000 - -#define SGIP_SOCKET_MAXSOCKETS 32 - -//#define SGIP_SOCKET_DEFAULT_NONBLOCK 1 - - -////////////////////////////////////////////////////////////////////////// -// DNS settings - -#define SGIP_DNS_MAXRECORDSCACHE 16 -#define SGIP_DNS_MAXRECORDADDRS 4 -#define SGIP_DNS_MAXALIASES 4 -#define SGIP_DNS_TIMEOUTMS 5000 -#define SGIP_DNS_MAXRETRY 3 -#define SGIP_DNS_MAXSERVERRETRY 4 - -////////////////////////////////////////////////////////////////////////// - -#define SGIP_DHCP_ERRORTIMEOUT 45000 -#define SGIP_DHCP_RESENDTIMEOUT 3000 -#define SGIP_DHCP_DEFAULTHOSTNAME "NintendoDS" -#define SGIP_DHCP_CLASSNAME "sgIP 0.3" - -////////////////////////////////////////////////////////////////////////// -// Static memory settings - only used if SGIP_USEDYNAMICMEMORY is NOT defined. - -// SGIP_TCP_MAXCONNECTIONS: In the case dynamic memory is not used, this value gives the max -// number of TCP blocks available for inbound/outbound connections via TCP. -#define SGIP_TCP_MAXCONNECTIONS 10 - - - - -////////////////////////////////////////////////////////////////////////// -// Debugging options - - -// SGIP_DEBUG: Enable debug logging. -// requires external function "void sgIP_dbgprint(char *, ...);" -//#define SGIP_DEBUG - -#ifdef SGIP_DEBUG -#define SGIP_DEBUG_MESSAGE(param) sgIP_dbgprint param -#define SGIP_DEBUG_ERROR(param) sgIP_dbgprint param; while(1); -#else -#define SGIP_DEBUG_MESSAGE(param) -#define SGIP_DEBUG_ERROR(param) -#endif - - -////////////////////////////////////////////////////////////////////////// -// Error handling -extern int sgIP_errno; -#define SGIP_ERROR(a) ((errno=(a)), -1) -#define SGIP_ERROR0(a) ((errno=(a)), 0) - -////////////////////////////////////////////////////////////////////////// -// Error checking - - -#ifdef SGIP_MULTITHREADED_THREADING_MODEL -#ifdef SGIP_INTERRUPT_THREADING_MODEL -#error SGIP_INTERRUPT_THREADING_MODEL and SGIP_MULTITHREADED_THREADING_MODEL cannot be used together! -#endif -#endif - - -////////////////////////////////////////////////////////////////////////// -// External option-based dependencies - - -#ifdef SGIP_INTERRUPT_THREADING_MODEL -#ifdef __cplusplus -extern "C" { -#endif - extern int sgIP_DisableInterrupts(void); - extern void sgIP_RestoreInterrupts(int); - extern void sgIP_IntrWaitEvent(void); -#ifdef __cplusplus -}; -#endif -#define SGIP_INTR_PROTECT() \ - int tIME; \ - tIME=sgIP_DisableInterrupts() -#define SGIP_INTR_REPROTECT() \ - tIME=sgIP_DisableInterrupts() -#define SGIP_INTR_UNPROTECT() \ - sgIP_RestoreInterrupts(tIME) -#define SGIP_WAITEVENT() \ - sgIP_IntrWaitEvent() -#else // !SGIP_INTERRUPT_THREADING_MODEL -#define SGIP_INTR_PROTECT() -#define SGIP_INTR_REPROTECT() -#define SGIP_INTR_UNPROTECT() -#define SGIP_WAITEVENT(); -#endif // SGIP_INTERRUPT_THREADING_MODEL - -#ifdef SGIP_DEBUG -#ifdef __cplusplus -extern "C" { -#endif - extern void sgIP_dbgprint(char *, ...); -#ifdef __cplusplus -}; -#endif -#endif // SGIP_DEBUG - -#ifdef SGIP_USEDYNAMICMEMORY -#ifdef __cplusplus -extern "C" { -#endif - extern void * sgIP_malloc(int); - extern void sgIP_free(void *); -#ifdef __cplusplus -}; -#endif -#endif // SGIP_USEDYNAMICMEMORY - -#endif diff --git a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_DHCP.c b/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_DHCP.c deleted file mode 100644 index 33805ba5e4..0000000000 --- a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_DHCP.c +++ /dev/null @@ -1,375 +0,0 @@ -// DSWifi Project - sgIP Internet Protocol Stack Implementation -// Copyright (C) 2005-2006 Stephen Stair - sgstair@akkit.org - http://www.akkit.org -/****************************************************************************** -DSWifi Lib and test materials are licenced under the MIT open source licence: -Copyright (c) 2005-2006 Stephen Stair - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -******************************************************************************/ - -#include "sgIP_DHCP.h" -#include "sgIP_DNS.h" -#include <string.h> -#include "sys/socket.h" -#include "netinet/in.h" - -extern unsigned long volatile sgIP_timems; -int dhcp_socket; -char dhcp_hostname[64]; -int dhcp_tid; -unsigned long dhcp_timestart, dhcp_timelastaction; -sgIP_DHCP_Packet * dhcp_p; -sgIP_Hub_HWInterface * dhcp_int; -int dhcp_optionptr; -int dhcp_requestDNS; -int dhcp_status; -int dhcp_state; // 0== send DHCPDISCOVER wait for DHCPOFFER, 1== send DHCPREQUEST wait for DHCPACK -unsigned long dhcp_rcvd_ip, dhcp_rcvd_gateway, dhcp_rcvd_snmask, dhcp_rcvd_dns[3], dhcp_serverip; - - -void sgIP_DHCP_Init() { - dhcp_socket=0; - dhcp_p=0; - dhcp_int=0; - dhcp_rcvd_ip=0; - strcpy(dhcp_hostname,SGIP_DHCP_DEFAULTHOSTNAME); - dhcp_status=SGIP_DHCP_STATUS_IDLE; -} -void sgIP_DHCP_SetHostName(char * s) { - strncpy(dhcp_hostname,s,63); - dhcp_hostname[63]=0; -} -int sgIP_DHCP_IsDhcpIp(unsigned long ip) { // check if the IP address was assigned via dhcp. - return ip==dhcp_rcvd_ip; -} - -void sgIP_DHCP_SendDgram() { - struct sockaddr_in sain; - int len_dhcp; - sain.sin_port=htons(67); // bootp server port - sain.sin_addr.s_addr=0xFFFFFFFF; // broadcast - dhcp_p->options[dhcp_optionptr++]=0xFF; // terminate options list. - //sendto(dhcp_socket,dhcp_p,sizeof(sgIP_DHCP_Packet)-312+dhcp_optionptr,0,(struct sockaddr *)&sain,sizeof(sain)); - len_dhcp = sizeof(sgIP_DHCP_Packet)-312+dhcp_optionptr; - if(len_dhcp<300) len_dhcp=300; - sendto(dhcp_socket,dhcp_p,len_dhcp,0,(struct sockaddr *)&sain,sizeof(sain)); - sgIP_free(dhcp_p); - dhcp_p=0; - dhcp_timelastaction=sgIP_timems; -} - -void sgIP_DHCP_BeginDgram(int dgramtype) { - int i; - if(dhcp_p) sgIP_free(dhcp_p); - dhcp_p = (sgIP_DHCP_Packet *) sgIP_malloc(sizeof(sgIP_DHCP_Packet)); - if(!dhcp_p) return; - - // ensure packet is zero'd.. seems to pacify some routers. malloc doesn't initialise the memory returned. - memset(dhcp_p,0,sizeof(sgIP_DHCP_Packet)); - - dhcp_p->op=1; // 1==BOOTREQUEST - dhcp_p->htype=1; // 1== ethernet address type - dhcp_p->hlen=6; // hardware address length - dhcp_p->hops=0; // client sets to zero - dhcp_p->xid=dhcp_tid; // DHCP transaction ID - dhcp_p->secs=(sgIP_timems-dhcp_timestart)/1000; // seconds since DHCP start - dhcp_p->flags=htons(0x0000); // top bit set = request broadcast response - dhcp_p->ciaddr=0; - dhcp_p->yiaddr=0; - dhcp_p->siaddr=0; - dhcp_p->giaddr=0; - - memcpy(dhcp_p->chaddr,dhcp_int->hwaddr,6); - - dhcp_optionptr=0; - dhcp_p->options[dhcp_optionptr++]=0x63; - dhcp_p->options[dhcp_optionptr++]=0x82; - dhcp_p->options[dhcp_optionptr++]=0x53; - dhcp_p->options[dhcp_optionptr++]=0x63; // 4-byte "magic cookie" (bleh!) - // add some necessary options... - by default add the dhcp message type, host name, class id, and parameter request list - dhcp_p->options[dhcp_optionptr++]=0x35; // DHCP Message type - dhcp_p->options[dhcp_optionptr++]=0x01; - dhcp_p->options[dhcp_optionptr++]=dgramtype; - - dhcp_p->options[dhcp_optionptr++]=0x3D; // DHCP client identifier - dhcp_p->options[dhcp_optionptr++]=0x07; // length - dhcp_p->options[dhcp_optionptr++]=0x01; // hw type - for(i=0;i<6;i++) dhcp_p->options[dhcp_optionptr++]=dhcp_int->hwaddr[i]; - - dhcp_p->options[dhcp_optionptr++]=0x0C; // DHCP host name - dhcp_p->options[dhcp_optionptr++]=strlen(dhcp_hostname); - for(i=0;i<strlen(dhcp_hostname);i++) { - dhcp_p->options[dhcp_optionptr++]=dhcp_hostname[i]; - } - - dhcp_p->options[dhcp_optionptr++]=0x37; // DHCP Parameter request list - dhcp_p->options[dhcp_optionptr++]=2+dhcp_requestDNS; - dhcp_p->options[dhcp_optionptr++]=1; // subnet mask - dhcp_p->options[dhcp_optionptr++]=3; // router - if(dhcp_requestDNS) dhcp_p->options[dhcp_optionptr++]=6; // dns server - - if(dgramtype==DHCP_TYPE_REQUEST) { - dhcp_p->options[dhcp_optionptr++]=0x32; // DHCP Requested IP address - dhcp_p->options[dhcp_optionptr++]=0x04; - dhcp_p->options[dhcp_optionptr++]=(dhcp_rcvd_ip)&255; - dhcp_p->options[dhcp_optionptr++]=(dhcp_rcvd_ip>>8)&255; - dhcp_p->options[dhcp_optionptr++]=(dhcp_rcvd_ip>>16)&255; - dhcp_p->options[dhcp_optionptr++]=(dhcp_rcvd_ip>>24)&255; - - dhcp_p->options[dhcp_optionptr++]=0x36; // DHCP Server identifier - dhcp_p->options[dhcp_optionptr++]=0x04; - dhcp_p->options[dhcp_optionptr++]=(dhcp_serverip)&255; - dhcp_p->options[dhcp_optionptr++]=(dhcp_serverip>>8)&255; - dhcp_p->options[dhcp_optionptr++]=(dhcp_serverip>>16)&255; - dhcp_p->options[dhcp_optionptr++]=(dhcp_serverip>>24)&255; - } - - dhcp_p->options[dhcp_optionptr++]=0x3C; // DHCP Vendor Class ID - dhcp_p->options[dhcp_optionptr++]=strlen(SGIP_DHCP_CLASSNAME); - for(i=0;i<strlen(SGIP_DHCP_CLASSNAME);i++) { - dhcp_p->options[dhcp_optionptr++]=(SGIP_DHCP_CLASSNAME)[i]; - } - - // reason we don't send it immediately is in case the calling code wants to modify some data or add some options. -} - - - -void sgIP_DHCP_Start(sgIP_Hub_HWInterface * interface, int getDNS) { // begin dhcp transaction to get IP and maybe DNS data. - struct sockaddr_in sain; - int i; - SGIP_DEBUG_MESSAGE(("sgIP_DHCP_Start()")); - sgIP_DHCP_Terminate(); - dhcp_requestDNS=getDNS?1:0; - dhcp_int=interface; - dhcp_timestart=sgIP_timems; - dhcp_timelastaction=sgIP_timems; - dhcp_tid=sgIP_timems; - dhcp_status=SGIP_DHCP_STATUS_WORKING; - dhcp_state=0; - - dhcp_rcvd_ip = 0; - dhcp_rcvd_gateway=0; - dhcp_rcvd_snmask=0; - dhcp_rcvd_dns[0]=0; - dhcp_rcvd_dns[1]=0; - dhcp_rcvd_dns[2]=0; - - dhcp_socket=socket(AF_INET,SOCK_DGRAM,0); - sain.sin_addr.s_addr=0; - sain.sin_port=htons(68); // BOOTP client - bind(dhcp_socket,(struct sockaddr *)&sain,sizeof(sain)); - i=1; - ioctl(dhcp_socket,FIONBIO,&i); - - sgIP_DHCP_BeginDgram(DHCP_TYPE_DISCOVER); - sgIP_DHCP_SendDgram(); -} -void sgIP_DHCP_Release() { // call to dump our DHCP address and leave. - if(dhcp_status==SGIP_DHCP_STATUS_WORKING) { - sgIP_DHCP_Terminate(); - } else { - sgIP_DHCP_BeginDgram(DHCP_TYPE_RELEASE); - dhcp_p->ciaddr=dhcp_int->ipaddr; - sgIP_DHCP_SendDgram(); - - } -} -int sgIP_DHCP_Update() { // MUST be called periodicly; returns status - call until it returns SGIP_DHCP_STATUS_SUCCESS or _FAILED. - sgIP_DHCP_Packet * p; - struct sockaddr_in * sain; - int i,j,n,l; - if(dhcp_status!=SGIP_DHCP_STATUS_WORKING) return dhcp_status; - int send = 0; - - p=(sgIP_DHCP_Packet *)sgIP_malloc(sizeof(sgIP_DHCP_Packet)); - if(p) { - - while(1) { - l=recvfrom(dhcp_socket,p,sizeof(sgIP_DHCP_Packet),0,(struct sockaddr *)&sain,&n); - if(l==-1) break; - if(p->op!=2 || p->htype!=1 || p->hlen!=6 || p->xid!=dhcp_tid ) continue; - // check magic cookie - if(p->options[0]!=0x63 || p->options[1]!=0x82 || p->options[2]!=0x53 || p->options[3]!=0x63) continue; - i=4; // yay, the cookie is valid. - l -= (sizeof(sgIP_DHCP_Packet)-312); // number of bytes remaining in the options - while(i<l) { - n=p->options[i++]; - switch(n) { - case 0: // ignore - break; - case 255: // end-of-options marker. - l=0; - break; - case 53: // message type, variable length, 2+n - j=p->options[i++]; - if(dhcp_state==0) { - if(p->options[i]!=DHCP_TYPE_OFFER) l=-1; - } else { - if(p->options[i]==DHCP_TYPE_ACK) { - sgIP_free(p); - sgIP_DHCP_Terminate(); - dhcp_int->ipaddr=dhcp_rcvd_ip; - dhcp_int->gateway=dhcp_rcvd_gateway; - dhcp_int->snmask=dhcp_rcvd_snmask; - SGIP_DEBUG_MESSAGE(("DHCP Configured!")); - SGIP_DEBUG_MESSAGE(("IP%08X SM%08X GW%08X",dhcp_rcvd_ip,dhcp_rcvd_snmask,dhcp_rcvd_gateway)); - if(dhcp_requestDNS) { - dhcp_int->dns[0]=dhcp_rcvd_dns[0]; - dhcp_int->dns[1]=dhcp_rcvd_dns[1]; - dhcp_int->dns[2]=dhcp_rcvd_dns[2]; - SGIP_DEBUG_MESSAGE(("DNS %08X %08X %08X",dhcp_rcvd_dns[0],dhcp_rcvd_dns[1],dhcp_rcvd_dns[2])); - } - - dhcp_status=SGIP_DHCP_STATUS_SUCCESS; - return dhcp_status; - } else { - l=-1; - } - } - i+=j; - - break; - case 1: // subnet mask field, variable length 2+n - j=p->options[i++]; - if(dhcp_state==1 || j<4) {i+=j; break; } - dhcp_rcvd_snmask = (dhcp_rcvd_snmask>>8) | (p->options[i++]<<24); - dhcp_rcvd_snmask = (dhcp_rcvd_snmask>>8) | (p->options[i++]<<24); - dhcp_rcvd_snmask = (dhcp_rcvd_snmask>>8) | (p->options[i++]<<24); - dhcp_rcvd_snmask = (dhcp_rcvd_snmask>>8) | (p->options[i++]<<24); - i+=j-4; - break; - case 3: // gateway, variable length 2+n - j=p->options[i++]; - if(dhcp_state==1 || j<4) {i+=j; break; } - dhcp_rcvd_gateway = (dhcp_rcvd_gateway>>8) | (p->options[i++]<<24); - dhcp_rcvd_gateway = (dhcp_rcvd_gateway>>8) | (p->options[i++]<<24); - dhcp_rcvd_gateway = (dhcp_rcvd_gateway>>8) | (p->options[i++]<<24); - dhcp_rcvd_gateway = (dhcp_rcvd_gateway>>8) | (p->options[i++]<<24); - i+=j-4; - break; - case 54: // server ID, variable length 2+n - j=p->options[i++]; - if(dhcp_state==1 || j<4) {i+=j; break; } - dhcp_serverip = (dhcp_serverip>>8) | (p->options[i++]<<24); - dhcp_serverip = (dhcp_serverip>>8) | (p->options[i++]<<24); - dhcp_serverip = (dhcp_serverip>>8) | (p->options[i++]<<24); - dhcp_serverip = (dhcp_serverip>>8) | (p->options[i++]<<24); - i+=j-4; - break; - case 6: // dns servers, variable length 2+n - if(dhcp_requestDNS && !dhcp_state) { - j=p->options[i++]; - n=0; - while(n<3 && 4*n+3<j) { - dhcp_rcvd_dns[n] = (dhcp_rcvd_dns[n]>>8) | (p->options[i++]<<24); - dhcp_rcvd_dns[n] = (dhcp_rcvd_dns[n]>>8) | (p->options[i++]<<24); - dhcp_rcvd_dns[n] = (dhcp_rcvd_dns[n]>>8) | (p->options[i++]<<24); - dhcp_rcvd_dns[n] = (dhcp_rcvd_dns[n]>>8) | (p->options[i++]<<24); - n++; - } - i+=j-4*n; - break; - } - default: - j=p->options[i++]; - i+=j; - } - } - if(l==-1) continue; - dhcp_rcvd_ip=(p->yiaddr); - - // discover succeeded. increment transaction id. force sending REQUEST message next. - dhcp_state=1; - dhcp_tid += ( sgIP_timems-dhcp_timestart ) + 1; - send = 1; - break; - } - - sgIP_free(p); - // has timeout expired? - if( (sgIP_timems-dhcp_timestart) > SGIP_DHCP_ERRORTIMEOUT) { - SGIP_DEBUG_MESSAGE(("sgIP DHCP error timeout!")); - sgIP_DHCP_Terminate(); - dhcp_status=SGIP_DHCP_STATUS_FAILED; - return dhcp_status; - } - if( send || (sgIP_timems-dhcp_timelastaction) > SGIP_DHCP_RESENDTIMEOUT ) - { - if(dhcp_state==0) sgIP_DHCP_BeginDgram(DHCP_TYPE_DISCOVER); else sgIP_DHCP_BeginDgram(DHCP_TYPE_REQUEST); - sgIP_DHCP_SendDgram(); - } - } else { - SGIP_DEBUG_MESSAGE(("sgIP DHCP alloc failed!")); - sgIP_DHCP_Terminate(); - dhcp_status=SGIP_DHCP_STATUS_FAILED; - } - - return dhcp_status; -} -void sgIP_DHCP_Terminate() { // kill the process where it stands; deallocate all DHCP resources. - if(dhcp_socket) closesocket(dhcp_socket); - dhcp_socket=0; - if(dhcp_p) sgIP_free(dhcp_p); - dhcp_p=0; - dhcp_status=SGIP_DHCP_STATUS_IDLE; -} - -int gethostname(char *name, size_t len) -{ - int size = sizeof(dhcp_hostname); - if (name == NULL) - return SGIP_ERROR(EFAULT); - - if ( len <= size ) - return SGIP_ERROR(EINVAL); - - strncpy(name, dhcp_hostname, size); - name[size]=0; - return 0; -} - -int sethostname(const char *name, size_t len) -{ - sgIP_DNS_Record *rec; - - int size = sizeof(dhcp_hostname); - if (name == NULL) - return SGIP_ERROR(EFAULT); - - if ( len > size - 1) - return SGIP_ERROR(EINVAL); - - rec = sgIP_DNS_FindDNSRecord(dhcp_hostname); - - strncpy(dhcp_hostname, name, len); - dhcp_hostname[len]=0; - strncpy(rec->aliases[0], name, len); - rec->aliases[0][len]=0; - strncpy(rec->name, name, len); - rec->name[len]=0; - - return 0; -} - - - - - - diff --git a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_DHCP.h b/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_DHCP.h deleted file mode 100644 index ba980af362..0000000000 --- a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_DHCP.h +++ /dev/null @@ -1,86 +0,0 @@ -// DSWifi Project - sgIP Internet Protocol Stack Implementation -// Copyright (C) 2005-2006 Stephen Stair - sgstair@akkit.org - http://www.akkit.org -/****************************************************************************** -DSWifi Lib and test materials are licenced under the MIT open source licence: -Copyright (c) 2005-2006 Stephen Stair - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -******************************************************************************/ -#ifndef SGIP_DHCP_H -#define SGIP_DHCP_H - -#include "sgIP_Config.h" -#include "sgIP_Hub.h" - -// "DHCP Server" port is 67, "DHCP Client" port is 68 -// DHCP messages broadcast by a client prior to that client obtaining its IP address must have the source address field in the IP header set to 0. - - - -typedef struct SGIP_DHCP_PACKET { // yes, freaking big endian prevails here too. - unsigned char op; // opcode/message type (1=BOOTREQUEST, 2=BOOTREPLY) - unsigned char htype; // hardware address type - unsigned char hlen; // Hardware address length (should be 6, for ethernet/wifi) - unsigned char hops; // set to 0 - unsigned long xid; // 4-byte client specified transaction ID - unsigned short secs; // seconds elapsed since client started trying to boot - unsigned short flags; // flags - unsigned long ciaddr; // client IP address, filled in by client if verifying previous params - unsigned long yiaddr; // "your" (client) IP address - unsigned long siaddr; // IP addr of next server to use in bootstrap. - unsigned long giaddr; // Relay agent IP address - unsigned char chaddr[16]; // client hardware address - char sname[64]; // optional server hostname (null terminated string) - char file[128]; // boot file name, null terminated string - char options[312]; // optional parameters -} sgIP_DHCP_Packet; - -enum SGIP_DHCP_STATUS { - SGIP_DHCP_STATUS_IDLE, - SGIP_DHCP_STATUS_WORKING, - SGIP_DHCP_STATUS_FAILED, - SGIP_DHCP_STATUS_SUCCESS -}; - -#define DHCP_TYPE_DISCOVER 1 -#define DHCP_TYPE_OFFER 2 -#define DHCP_TYPE_REQUEST 3 -#define DHCP_TYPE_ACK 5 -#define DHCP_TYPE_RELEASE 7 - - -#ifdef __cplusplus -extern "C" { -#endif - - void sgIP_DHCP_Init(void); - - void sgIP_DHCP_SetHostName(char * s); // just for the fun of it. - int sgIP_DHCP_IsDhcpIp(unsigned long ip); // check if the IP address was assigned via dhcp. - void sgIP_DHCP_Start(sgIP_Hub_HWInterface * interface, int getDNS); // begin dhcp transaction to get IP and maybe DNS data. - void sgIP_DHCP_Release(void); // call to dump our DHCP address and leave. - int sgIP_DHCP_Update(void); // MUST be called periodicly after _Start; returns status - call until it returns something other than SGIP_DHCP_STATUS_WORKING - void sgIP_DHCP_Terminate(void); // kill the process where it stands; deallocate all DHCP resources. - -#ifdef __cplusplus -}; -#endif - - -#endif diff --git a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_DNS.c b/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_DNS.c deleted file mode 100644 index 432236b205..0000000000 --- a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_DNS.c +++ /dev/null @@ -1,492 +0,0 @@ -// DSWifi Project - sgIP Internet Protocol Stack Implementation -// Copyright (C) 2005-2006 Stephen Stair - sgstair@akkit.org - http://www.akkit.org -/****************************************************************************** -DSWifi Lib and test materials are licenced under the MIT open source licence: -Copyright (c) 2005-2006 Stephen Stair - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -******************************************************************************/ - -#include "sgIP_DNS.h" -#include "sgIP_Hub.h" -#include "netinet/in.h" -#include "sys/socket.h" - -int dns_sock; -int time_count; -int last_id; -int query_time_start; -extern unsigned long volatile sgIP_timems; - -// cache record data -sgIP_DNS_Record dnsrecords[SGIP_DNS_MAXRECORDSCACHE]; - -// data to return via hostent -volatile sgIP_DNS_Record dnsrecord_return; -volatile char * alias_list[SGIP_DNS_MAXALIASES+1]; -volatile char * addr_list[SGIP_DNS_MAXRECORDADDRS+1]; -char ipaddr_alias[256]; -unsigned long ipaddr_ip; -volatile sgIP_DNS_Hostent dnsrecord_hostent; - -unsigned char querydata[512]; -unsigned char responsedata[512]; - -void sgIP_DNS_Init() { - int i; - for(i=0;i<SGIP_DNS_MAXRECORDSCACHE;i++) dnsrecords[i].flags=0; - dns_sock=-1; - time_count=0; -} - -void sgIP_DNS_Timer1000ms() { - int i; - time_count++; - for(i=0;i<SGIP_DNS_MAXRECORDSCACHE;i++) { - if(dnsrecords[i].flags & SGIP_DNS_FLAG_RESOLVED) { - dnsrecords[i].TTL-=1; - if(dnsrecords[i].TTL<=0) { - dnsrecords[i].flags=0; - } - } - } -} - -int sgIP_DNS_isipaddress(const char * name, unsigned long * ipdest) { - int i,j,t,ndot; - unsigned long out_addr, g[4]; - const char * c; - - ndot=0; - c=name; - while(*c) { // scan for invalid characters - if(!((*c>='0' && *c<='9') || (*c>='A' && *c<='F') || (*c>='a' && *c<='f') || *c=='.' || *c=='x' || *c=='X')) return 0; - if(*c=='.') ndot++; - c++; - } - if(ndot>3) return 0; - c=name; - for(i=0;i<=ndot;i++) { - g[i]=0; - t=0; - j=0; - while(*c && *c!='.') { - if(j==0 && *c=='0') { t++; } - else if(j==1 && t==1 && (*c=='x' || *c=='X')) { t++; } - else { - switch(t) { - case 0: // decimal - if(*c=='x' || *c=='X' || (*c>='A' && *c<='F') || (*c>='a' && *c<='f')) return 0; - g[i]=(g[i]*10)+(*c-'0'); - break; - case 1: // octal - if(*c=='x' || *c=='X' || (*c>='A' && *c<='F') || (*c>='a' && *c<='f') || *c=='8' || *c=='9') return 0; - g[i]=(g[i]<<3)+(*c-'0'); - break; - case 2: // hex - if(*c=='x' || *c=='X') return 0; - if(*c>='0' && *c<='9') { - g[i]=(g[i]<<4)+(*c-'0'); - } else { - g[i]=(g[i]<<4)+(*c&0xDF)+9; - } - break; - } - } - j++; c++; - } - if(*c) c++; else break; - } - out_addr=0; - switch(ndot) { - case 0: - out_addr=g[0]; - break; - case 1: - if(g[0]>=0x100 || g[1]>=0x1000000) return 0; - out_addr= (g[0]<<24) | g[1]; - break; - case 2: - if(g[0]>=0x100 || g[1]>=0x100 || g[2]>=0x10000) return 0; - out_addr= (g[0]<<24) | (g[1]<<16) | g[2]; - break; - case 3: - if(g[0]>=0x100 || g[1]>=0x100 || g[2]>=0x100 || g[3]>=0x100) return 0; - out_addr= (g[0]<<24) | (g[1]<<16) | (g[2]<<8) | g[3]; - break; - } - *ipdest=htonl(out_addr); - return 1; -} - -sgIP_DNS_Record * sgIP_DNS_FindDNSRecord(const char * name) { - int i,j,k,n,c,c2; - SGIP_INTR_PROTECT(); - for(i=0;i<SGIP_DNS_MAXRECORDSCACHE;i++) { - if((dnsrecords[i].flags&(SGIP_DNS_FLAG_ACTIVE|SGIP_DNS_FLAG_RESOLVED)) == (SGIP_DNS_FLAG_ACTIVE|SGIP_DNS_FLAG_RESOLVED)) { - for(j=0;j<dnsrecords[i].numalias;j++) { - k=0; - for(n=0;name[n] && dnsrecords[i].aliases[j][n]; n++) { // obscure and complex case-insensitive string compare. - c=name[n]; - c2=dnsrecords[i].aliases[j][n]; - if(c>='a' && c<='z') c+='A'-'a'; - if(c2>='a' && c2<='z') c2+='A'-'a'; - if(c==c2) { - k++; - } else { - k=0; break; - } - } - if(name[n] || dnsrecords[i].aliases[j][n]) k=0; - if(k) { - SGIP_INTR_UNPROTECT(); - return dnsrecords+i; - } - } - } - } - - SGIP_INTR_UNPROTECT(); - return 0; -} - -sgIP_DNS_Record * sgIP_DNS_GetUnusedRecord() { - int i,j,minttl; - SGIP_INTR_PROTECT(); - for(i=0;i<SGIP_DNS_MAXRECORDSCACHE;i++) { - if(!(dnsrecords[i].flags&SGIP_DNS_FLAG_ACTIVE)) { - SGIP_INTR_UNPROTECT(); - return dnsrecords+i; - } - } - minttl=dnsrecords[0].TTL; j=0; - for(i=1;i<SGIP_DNS_MAXRECORDSCACHE;i++) { - if(dnsrecords[i].TTL<minttl && !(dnsrecords[i].flags&SGIP_DNS_FLAG_BUSY)) { - j=i; - minttl=dnsrecords[i].TTL; - } - } - dnsrecords[j].flags=0; - SGIP_INTR_UNPROTECT(); - return dnsrecords+j; -} - -static -void sgIP_ntoa(unsigned long ipaddr) { - int c,i,j,n; - c=0; - for(j=0;j<4;j++) { - if(j) ipaddr_alias[c++]='.'; - n=(ipaddr>>(j*8))&255; - i=0; - if(n>=100) { i=n/100; ipaddr_alias[c++]='0'+i; n-=i*100; } - if(n>=10 || i) { i=n/10; ipaddr_alias[c++]='0'+i; n-=i*10; } - ipaddr_alias[c++]='0'+n; - } - ipaddr_alias[c]=0; -} - -static -sgIP_DNS_Hostent * sgIP_DNS_GenerateHostentIP(unsigned long ipaddr) { - - sgIP_ntoa(ipaddr); - - alias_list[0]=ipaddr_alias; - alias_list[1]=0; - ipaddr_ip=ipaddr; - addr_list[0]=(char *)&ipaddr_ip; - addr_list[1]=0; - - dnsrecord_hostent.h_addr_list=(char **)addr_list; - dnsrecord_hostent.h_addrtype=1; - dnsrecord_hostent.h_aliases=(char **)alias_list; - dnsrecord_hostent.h_length=4; - dnsrecord_hostent.h_name=ipaddr_alias; - return (sgIP_DNS_Hostent *)&dnsrecord_hostent; -} - -sgIP_DNS_Hostent * sgIP_DNS_GenerateHostent(sgIP_DNS_Record * dnsrec) { - volatile int i; - dnsrecord_return = *dnsrec; // copy struct - for(i=0;i<dnsrecord_return.numalias;i++) { - alias_list[i]=dnsrecord_return.aliases[i]; - } - alias_list[i]=0; - for(i=0;i<dnsrecord_return.numaddr;i++) { - addr_list[i]=(char *)&(dnsrecord_return.addrdata[i*dnsrecord_return.addrlen]); - } - addr_list[i]=0; - dnsrecord_hostent.h_addr_list=(char **)addr_list; - dnsrecord_hostent.h_addrtype=dnsrecord_return.addrclass; - dnsrecord_hostent.h_aliases=(char **)alias_list; - dnsrecord_hostent.h_length=dnsrecord_return.addrlen; - dnsrecord_hostent.h_name=(char *)dnsrecord_return.name; - return (sgIP_DNS_Hostent *)&dnsrecord_hostent; -} - -static -int sgIP_DNS_genquery(const char * name) { - int i,j,c,l; - unsigned short * querydata_s = (unsigned short *) querydata; - unsigned char * querydata_c = querydata; - // header section - querydata_s[0]=htons(time_count&0xFFFF); - last_id=querydata_s[0]; - querydata_s[1]=htons(0x0100); // recursion desired, standard query - querydata_s[2]=htons(1); // one QD (question) - querydata_s[3]=0; // no resource records - querydata_s[4]=0; // no nameserver records - querydata_s[5]=0; // no additional records - // question section - - querydata_c+=12; - querydata_s+=6; - j=0; - i=0; - while(1) { - l=j; - j++; - c=0; - while(name[i]!=0 && name[i]!='.' && i<255) { - querydata_c[j++]=name[i++]; c++; - } - querydata_c[l]=c; - if(name[i]==0 || i>=255) break; - if(c==0) return 0; // this should never happen (unless there's really invalid input with 2 dots next to each other.) - i++; - } - querydata_c[j++]=0; // terminating zero length - // qtype - querydata_c[j++]=0; - querydata_c[j++]=1; // 00 01 "A" (address) - // qclass - querydata_c[j++]=0; - querydata_c[j++]=1; // 00 01 "IN" (internet) - - return j+12; // length -} - -void sgIP_DNS_CopyAliasAt(char * deststr,int offset) { - char * c; - int i,j; - i=0; - c=(char *)responsedata+offset; - do { - j=c[0]; - if(j>63) { - j=((j&63)<<8) | c[1]; - c=(char *)responsedata+j; - continue; - } - if(!j) break; - c++; - for(;j>0;j--) { - deststr[i++]= *(c++); - } - deststr[i++]='.'; - } while(1); - if(i>0) i--; - deststr[i]=0; -} - - -sgIP_DNS_Hostent * sgIP_DNS_gethostbyname(const char * name) { - sgIP_DNS_Record * rec; - sgIP_DNS_Hostent * he; - sgIP_Hub_HWInterface * hw; - int len,i,sainlen; - int retries,dtime; - unsigned long serverip; - struct sockaddr_in sain; - unsigned long IP; - SGIP_INTR_PROTECT(); - - // is name an IP address? - if(sgIP_DNS_isipaddress(name,&IP)) { - SGIP_INTR_UNPROTECT(); - return sgIP_DNS_GenerateHostentIP(IP); - } - - // check cache, return if value required is in cache... - rec=sgIP_DNS_FindDNSRecord(name); - if(rec) { - he=sgIP_DNS_GenerateHostent(rec); - SGIP_INTR_UNPROTECT(); - return he; - } - - // not in cache? generate a query... - len=sgIP_DNS_genquery(name); - - // send off the query, handle retransmit and trying other dns servers. - if(dns_sock==-1) { - hw=sgIP_Hub_GetDefaultInterface(); - serverip=hw->dns[0]; - - dns_sock=socket(AF_INET,SOCK_DGRAM,0); - i=1; - i=ioctl(dns_sock,FIONBIO,&i); // set non-blocking - - retries=0; - do { - query_time_start=sgIP_timems; - sain.sin_addr.s_addr=serverip; - sain.sin_port=htons(53); - i=sendto(dns_sock,querydata,len,0,(struct sockaddr *)&sain,sizeof(sain)); -dns_listenonly: - - do { - i=recvfrom(dns_sock,responsedata,512,0,(struct sockaddr *)&sain,&sainlen); - if(i!=-1) break; - dtime=sgIP_timems-query_time_start; - if(dtime>SGIP_DNS_TIMEOUTMS) break; - SGIP_INTR_UNPROTECT(); - SGIP_WAITEVENT(); - SGIP_INTR_REPROTECT(); - } while(1); - - if(i==-1) { // no reply, retry - retries++; - if(retries>=SGIP_DNS_MAXRETRY) { // maybe try another server? for now just quit. - closesocket(dns_sock); - dns_sock=-1; - SGIP_INTR_UNPROTECT(); - - return NULL; - } - continue; // send again - } - - // got something, is it what we want? - if(i<12 || sain.sin_addr.s_addr!=serverip || sain.sin_port!=htons(53)) { // suspicious. - goto dns_listenonly; // yay! a goto! - go back and see if we can get a more official response. - } - - // parse response. - { - const unsigned short * resdata_s = (unsigned short *) responsedata; - const unsigned char * resdata_c = responsedata; - const char * c; - int j,q,a, nalias,naddr; - if(last_id!=resdata_s[0]) { // bad. - goto dns_listenonly; - } - q=htons(resdata_s[2]); - a=htons(resdata_s[3]); - // no answer. - if (a == 0) - { - closesocket(dns_sock); - dns_sock=-1; - SGIP_INTR_UNPROTECT(); - - return NULL; - } - - resdata_c+=12; - while(q) { // ignore questions - do { - j=resdata_c[0]; - if(j>63) { resdata_c+=2; break; } - resdata_c += j+1; - } while(j); - resdata_c+=4; - q--; - } - - nalias=0; - naddr=0; - rec=sgIP_DNS_GetUnusedRecord(); - rec->flags=SGIP_DNS_FLAG_ACTIVE | SGIP_DNS_FLAG_BUSY; - while(a) { - if(nalias<SGIP_DNS_MAXALIASES) sgIP_DNS_CopyAliasAt(rec->aliases[nalias++],resdata_c-responsedata); - do { - j=resdata_c[0]; - if(j>63) { resdata_c+=2; break; } - resdata_c += j+1; - } while(j); - // CNAME=5, A=1 - j=resdata_c[1]; - rec->addrclass=(resdata_c[2]<<8)|resdata_c[3]; - rec->TTL = (resdata_c[4]<<24)|(resdata_c[5]<<16)|(resdata_c[6]<<8)|resdata_c[7]; - if(j==1) { // A - if(naddr<SGIP_DNS_MAXRECORDADDRS) { - rec->addrdata[naddr*4] = resdata_c[10]; - rec->addrdata[naddr*4+1] = resdata_c[11]; - rec->addrdata[naddr*4+2] = resdata_c[12]; - rec->addrdata[naddr*4+3] = resdata_c[13]; - naddr++; - } - } - j=(resdata_c[8]<<8)|resdata_c[9]; - resdata_c+=10+j; - a--; - } - - // likely we have all the data we care for now. - rec->addrlen=4; - rec->numaddr=naddr; - rec->numalias=nalias; - for(c=name,i=0;*c;c++,i++) rec->name[i]=*c; - rec->name[i]=0; - rec->flags=SGIP_DNS_FLAG_ACTIVE | SGIP_DNS_FLAG_RESOLVED; - break; // we got our answer, let's get out of here! - } - } while(1); - - closesocket(dns_sock); - dns_sock=-1; - } else { - SGIP_INTR_UNPROTECT(); - return NULL; - } - - // received response, return data - he=sgIP_DNS_GenerateHostent(rec); - SGIP_INTR_UNPROTECT(); - return he; -} - -unsigned long inet_addr(const char *cp) { - unsigned long IP; - if(sgIP_DNS_isipaddress(cp,&IP)) { - return IP; - } - return 0xFFFFFFFF; -} - -int inet_aton(const char *cp, struct in_addr *inp) { - unsigned long IP; - - if(sgIP_DNS_isipaddress(cp,&IP)) { - inp->s_addr = IP; - return 1; - } - - return 0; -} - - -char *inet_ntoa(struct in_addr in) { - sgIP_ntoa(in.s_addr); - return (char *)ipaddr_alias; -} - - - diff --git a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_DNS.h b/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_DNS.h deleted file mode 100644 index 2b23a2cec0..0000000000 --- a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_DNS.h +++ /dev/null @@ -1,69 +0,0 @@ -// DSWifi Project - sgIP Internet Protocol Stack Implementation -// Copyright (C) 2005-2006 Stephen Stair - sgstair@akkit.org - http://www.akkit.org -/****************************************************************************** -DSWifi Lib and test materials are licenced under the MIT open source licence: -Copyright (c) 2005-2006 Stephen Stair - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -******************************************************************************/ -#ifndef SGIP_DNS_H -#define SGIP_DNS_H - -#include "sgIP_Config.h" - -#define SGIP_DNS_FLAG_ACTIVE 1 -#define SGIP_DNS_FLAG_RESOLVED 2 -#define SGIP_DNS_FLAG_BUSY 4 - -typedef struct SGIP_DNS_RECORD { - char name [256]; - char aliases[SGIP_DNS_MAXALIASES][256]; - unsigned char addrdata[SGIP_DNS_MAXRECORDADDRS*4]; - short addrlen; - short addrclass; - int numaddr,numalias; - int TTL; - int flags; -} sgIP_DNS_Record; - -typedef struct SGIP_DNS_HOSTENT { - char * h_name; - char ** h_aliases; - int h_addrtype; // class - 1=IN (internet) - int h_length; - char ** h_addr_list; -} sgIP_DNS_Hostent; - -#ifdef __cplusplus -extern "C" { -#endif - -extern void sgIP_DNS_Init(void); -extern void sgIP_DNS_Timer1000ms(void); - -extern sgIP_DNS_Hostent * sgIP_DNS_gethostbyname(const char * name); -extern sgIP_DNS_Record * sgIP_DNS_GetUnusedRecord(void); -extern sgIP_DNS_Record * sgIP_DNS_FindDNSRecord(const char * name); - -#ifdef __cplusplus -}; -#endif - - -#endif diff --git a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_Hub.c b/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_Hub.c deleted file mode 100644 index e91de87ad4..0000000000 --- a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_Hub.c +++ /dev/null @@ -1,211 +0,0 @@ -// DSWifi Project - sgIP Internet Protocol Stack Implementation -// Copyright (C) 2005-2006 Stephen Stair - sgstair@akkit.org - http://www.akkit.org -/****************************************************************************** -DSWifi Lib and test materials are licenced under the MIT open source licence: -Copyright (c) 2005-2006 Stephen Stair - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -******************************************************************************/ -#include "sgIP_Hub.h" -#include "sgIP_ARP.h" - -////////////////////////////////////////////////////////////////////////// -// Global vars - -int NumHWInterfaces; -int NumProtocolInterfaces; -sgIP_Hub_Protocol ProtocolInterfaces[SGIP_HUB_MAXPROTOCOLINTERFACES]; -sgIP_Hub_HWInterface HWInterfaces[SGIP_HUB_MAXHWINTERFACES]; - - - -////////////////////////////////////////////////////////////////////////// -// Private functions - - - - - - -////////////////////////////////////////////////////////////////////////// -// Public functions - - -void sgIP_Hub_Init() { - NumHWInterfaces=0; - NumProtocolInterfaces=0; - -} - -sgIP_Hub_Protocol * sgIP_Hub_AddProtocolInterface(int protocolID, int (*ReceivePacket)(sgIP_memblock *), int (*InterfaceInit)(sgIP_Hub_Protocol *)) { - int n; - if(NumProtocolInterfaces>=SGIP_HUB_MAXPROTOCOLINTERFACES) return 0; - for(n=0;n<SGIP_HUB_MAXPROTOCOLINTERFACES;n++) { - if(!(ProtocolInterfaces[n].flags&SGIP_FLAG_PROTOCOL_IN_USE)) break; - } - if(n==SGIP_HUB_MAXPROTOCOLINTERFACES) return 0; - - ProtocolInterfaces[n].flags=SGIP_FLAG_PROTOCOL_IN_USE | SGIP_FLAG_PROTOCOL_ENABLED; - ProtocolInterfaces[n].protocol=protocolID; - ProtocolInterfaces[n].ReceivePacket=ReceivePacket; - if(InterfaceInit) InterfaceInit(ProtocolInterfaces+n); - NumProtocolInterfaces++; - return ProtocolInterfaces+n; -} - - -sgIP_Hub_HWInterface * sgIP_Hub_AddHardwareInterface(int (*TransmitFunction)(sgIP_Hub_HWInterface *, sgIP_memblock *), int (*InterfaceInit)(sgIP_Hub_HWInterface *)) { - int n; - if(NumHWInterfaces>=SGIP_HUB_MAXHWINTERFACES) return 0; - for(n=0;n<SGIP_HUB_MAXHWINTERFACES;n++) { - if(!(HWInterfaces[n].flags&SGIP_FLAG_HWINTERFACE_IN_USE)) break; - } - if(n==SGIP_HUB_MAXHWINTERFACES) return 0; - - HWInterfaces[n].flags = SGIP_FLAG_HWINTERFACE_IN_USE | SGIP_FLAG_HWINTERFACE_ENABLED; - HWInterfaces[n].TransmitFunction=TransmitFunction; - if(InterfaceInit) InterfaceInit(HWInterfaces+n); - NumHWInterfaces++; - return HWInterfaces+n; -} - -extern void sgIP_Hub_RemoveProtocolInterface(sgIP_Hub_Protocol * protocol) { - int n; - for(n=0;n<SGIP_HUB_MAXPROTOCOLINTERFACES;n++) { - if(ProtocolInterfaces+n ==protocol) break; - } - if(n==SGIP_HUB_MAXPROTOCOLINTERFACES) return; - protocol->flags=0; - NumProtocolInterfaces--; -} -extern void sgIP_Hub_RemoveHardwareInterface(sgIP_Hub_HWInterface * hw) { - int n; - for(n=0;n<SGIP_HUB_MAXHWINTERFACES;n++) { - if(HWInterfaces+n == hw) break; - } - if(n==SGIP_HUB_MAXHWINTERFACES) return; - hw->flags=0; - NumHWInterfaces--; -} - -int sgIP_Hub_ReceiveHardwarePacket(sgIP_Hub_HWInterface * hw, sgIP_memblock * packet) { - if(!hw || !packet) return 0; - if(hw->flags & SGIP_FLAG_HWINTERFACE_ENABLED) { - int n; - int protocol; - - protocol = ((unsigned short *)packet->datastart)[6]; -// SGIP_DEBUG_MESSAGE(("hub: rx packet %04X %X",protocol,packet->totallength)); - if(protocol==PROTOCOL_ETHER_ARP) { // arp - sgIP_ARP_ProcessARPFrame(hw,packet); - return 0; - } - if(protocol==PROTOCOL_ETHER_IP) { // IP, forward to the ARP system. - - } - - // hide ethernet header for higher-level protocols - sgIP_memblock_exposeheader(packet,-14); - for(n=0;n<SGIP_HUB_MAXPROTOCOLINTERFACES;n++) { - if(ProtocolInterfaces[n].flags&SGIP_FLAG_PROTOCOL_ENABLED && ProtocolInterfaces[n].protocol==protocol) { // this protocol handler - return ProtocolInterfaces[n].ReceivePacket(packet); - } - } - } - // hrmm, packet is unhandled. Ignore it for now. - sgIP_memblock_free(packet); - return 0; -} -// send packet from a protocol interface, resolve the requisite hardware interface addresses and send it. -int sgIP_Hub_SendProtocolPacket(int protocol, sgIP_memblock * packet, unsigned long dest_address, unsigned long src_address) { - if(!packet) return 0; - sgIP_Hub_HWInterface * hw; - int i; - hw=0; - // figure out what hardware interface is in use. - for(i=0;i<SGIP_HUB_MAXHWINTERFACES;i++) if(HWInterfaces[i].ipaddr==src_address) {hw=HWInterfaces+i; break;} - if(!hw) { - sgIP_memblock_free(packet); - return 0; - } - // resolve protocol address to hardware address & send packet - if( (src_address & hw->snmask) == (dest_address & hw->snmask) // on same network - || dest_address == 0xFFFFFFFF ) // or broadcast address, send directly. - { - return sgIP_ARP_SendProtocolFrame(hw,packet,protocol,dest_address); - } else { // eek, on different network. Send to gateway - return sgIP_ARP_SendProtocolFrame(hw,packet,protocol,hw->gateway); - } -} -// send packet on a hardware interface. -int sgIP_Hub_SendRawPacket(sgIP_Hub_HWInterface * hw, sgIP_memblock * packet) { - if(!hw || !packet) return 0; - if(hw->flags&SGIP_FLAG_HWINTERFACE_ENABLED) { - return hw->TransmitFunction(hw,packet); - } - sgIP_memblock_free(packet); - return 0; -} - -int sgIP_Hub_IPMaxMessageSize(unsigned long ipaddr) { - return SGIP_MTU_OVERRIDE; // hack - make this more accurate soon! -} - -unsigned long sgIP_Hub_GetCompatibleIP(unsigned long destIP) { - int n; - for(n=0;n<SGIP_HUB_MAXHWINTERFACES;n++) { - if((HWInterfaces[n].flags&SGIP_FLAG_HWINTERFACE_IN_USE)) { - if((HWInterfaces[n].ipaddr & HWInterfaces[n].snmask) == (destIP & HWInterfaces[n].snmask)) return HWInterfaces[n].ipaddr; - } - } - for(n=0;n<SGIP_HUB_MAXHWINTERFACES;n++) { - if((HWInterfaces[n].flags&SGIP_FLAG_HWINTERFACE_IN_USE)) { - return HWInterfaces[n].ipaddr; - } - } - return 0; -} - -extern sgIP_Hub_HWInterface * sgIP_Hub_GetDefaultInterface() { - int n; - for(n=0;n<SGIP_HUB_MAXHWINTERFACES;n++) { - if((HWInterfaces[n].flags&SGIP_FLAG_HWINTERFACE_IN_USE)) { - return HWInterfaces+n; - } - } - return 0; -} - - -#ifdef SGIP_LITTLEENDIAN -unsigned short htons(unsigned short num) { - return ((num<<8)&0xFF00) | (num>>8); -} -unsigned long htonl(unsigned long num) { - return (num<<24) | ((num&0xFF00)<<8) | ((num&0xFF0000)>>8) | (num>>24); -} -#else -unsigned short htons(unsigned short num) { - return num; -} -unsigned long htonl(unsigned long num) { - return num; -} -#endif - diff --git a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_Hub.h b/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_Hub.h deleted file mode 100644 index f8df3a0cea..0000000000 --- a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_Hub.h +++ /dev/null @@ -1,109 +0,0 @@ -// DSWifi Project - sgIP Internet Protocol Stack Implementation -// Copyright (C) 2005-2006 Stephen Stair - sgstair@akkit.org - http://www.akkit.org -/****************************************************************************** -DSWifi Lib and test materials are licenced under the MIT open source licence: -Copyright (c) 2005-2006 Stephen Stair - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -******************************************************************************/ -#ifndef SGIP_HUB_H -#define SGIP_HUB_H - -#include "sgIP_Config.h" -#include "sgIP_memblock.h" - - - -#define SGIP_FLAG_PROTOCOL_IN_USE 0x0001 -#define SGIP_FLAG_PROTOCOL_ENABLED 0x8000 - -#define SGIP_FLAG_HWINTERFACE_IN_USE 0x0001 -#define SGIP_FLAG_HWINTERFACE_CONNECTED 0x0002 -#define SGIP_FLAG_HWINTERFACE_USEDHCP 0x0004 -#define SGIP_FLAG_HWINTERFACE_CHANGENETWORK 0x0008 -#define SGIP_FLAG_HWINTERFACE_ENABLED 0x8000 - -#ifdef SGIP_LITTLEENDIAN -#define PROTOCOL_ETHER_ARP 0x0608 -#define PROTOCOL_ETHER_IP 0x0008 -#else -#define PROTOCOL_ETHER_ARP 0x0806 -#define PROTOCOL_ETHER_IP 0x0800 -#endif - - -// structure sgIP_Hub_Protocol: Used to record the interface between the sgIP Hub and a protocol handler -typedef struct SGIP_HUB_PROTOCOL { - unsigned short flags; - unsigned short protocol; - int (*ReceivePacket)(sgIP_memblock *); - -} sgIP_Hub_Protocol; - -typedef struct SGIP_HUB_HWINTERFACE { - unsigned short flags; - unsigned short hwaddrlen; - int MTU; - int (*TransmitFunction)(struct SGIP_HUB_HWINTERFACE *, sgIP_memblock *); - void * userdata; - unsigned long ipaddr, gateway, snmask, dns[3]; - unsigned char hwaddr[SGIP_MAXHWADDRLEN]; -} sgIP_Hub_HWInterface; - -typedef struct SGIP_HEADER_ETHERNET { - unsigned char dest_mac[6]; - unsigned char src_mac[6]; - unsigned short protocol; -} sgIP_Header_Ethernet; - -#define ntohs(num) htons(num) -#define ntohl(num) htonl(num) - - -#ifdef __cplusplus -extern "C" { -#endif - - -extern void sgIP_Hub_Init(void); - - -extern sgIP_Hub_Protocol * sgIP_Hub_AddProtocolInterface(int protocolID, int (*ReceivePacket)(sgIP_memblock *), int (*InterfaceInit)(sgIP_Hub_Protocol *)); -extern sgIP_Hub_HWInterface * sgIP_Hub_AddHardwareInterface(int (*TransmitFunction)(sgIP_Hub_HWInterface *, sgIP_memblock *), int (*InterfaceInit)(sgIP_Hub_HWInterface *)); -extern void sgIP_Hub_RemoveProtocolInterface(sgIP_Hub_Protocol * protocol); -extern void sgIP_Hub_RemoveHardwareInterface(sgIP_Hub_HWInterface * hw); - -extern int sgIP_Hub_ReceiveHardwarePacket(sgIP_Hub_HWInterface * hw, sgIP_memblock * packet); -extern int sgIP_Hub_SendProtocolPacket(int protocol, sgIP_memblock * packet, unsigned long dest_address, unsigned long src_address); -extern int sgIP_Hub_SendRawPacket(sgIP_Hub_HWInterface * hw, sgIP_memblock * packet); - -extern int sgIP_Hub_IPMaxMessageSize(unsigned long ipaddr); -unsigned long sgIP_Hub_GetCompatibleIP(unsigned long destIP); - -extern sgIP_Hub_HWInterface * sgIP_Hub_GetDefaultInterface(void); - -unsigned short htons(unsigned short num); -unsigned long htonl(unsigned long num); - -#ifdef __cplusplus -}; -#endif - - -#endif diff --git a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_ICMP.c b/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_ICMP.c deleted file mode 100644 index 9595d844d3..0000000000 --- a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_ICMP.c +++ /dev/null @@ -1,56 +0,0 @@ -// DSWifi Project - sgIP Internet Protocol Stack Implementation -// Copyright (C) 2005-2006 Stephen Stair - sgstair@akkit.org - http://www.akkit.org -/****************************************************************************** -DSWifi Lib and test materials are licenced under the MIT open source licence: -Copyright (c) 2005-2006 Stephen Stair - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -******************************************************************************/ - -#include "sgIP_ICMP.h" -#include "sgIP_IP.h" -#include "sgIP_Hub.h" - -void sgIP_ICMP_Init() { - -} - -int sgIP_ICMP_ReceivePacket(sgIP_memblock * mb, unsigned long srcip, unsigned long destip) { - if(!mb) return 0; - sgIP_Header_ICMP * icmp; - icmp = (sgIP_Header_ICMP *) mb->datastart; - if(icmp->checksum!=0 && sgIP_memblock_IPChecksum(mb,0,mb->totallength)!=0xFFFF) { - SGIP_DEBUG_MESSAGE(("ICMP receive checksum incorrect")); - sgIP_memblock_free(mb); - return 0; - } - switch(icmp->type) { - case 8: // echo request - icmp->type=0; // change to echo reply - // mod checksum - icmp->checksum=0; - icmp->checksum=~sgIP_memblock_IPChecksum(mb,0,mb->totallength); - return sgIP_IP_SendViaIP(mb,PROTOCOL_IP_ICMP,destip,srcip); - case 0: // echo reply (ignore for now) - default: // others (ignore for now) - break; - } - sgIP_memblock_free(mb); - return 0; -} diff --git a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_ICMP.h b/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_ICMP.h deleted file mode 100644 index e9513b55ba..0000000000 --- a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_ICMP.h +++ /dev/null @@ -1,52 +0,0 @@ -// DSWifi Project - sgIP Internet Protocol Stack Implementation -// Copyright (C) 2005-2006 Stephen Stair - sgstair@akkit.org - http://www.akkit.org -/****************************************************************************** -DSWifi Lib and test materials are licenced under the MIT open source licence: -Copyright (c) 2005-2006 Stephen Stair - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -******************************************************************************/ -#ifndef SGIP_ICMP_H -#define SGIP_ICMP_H - -#include "sgIP_Config.h" -#include "sgIP_memblock.h" - -typedef struct SGIP_HEADER_ICMP { - unsigned char type,code; - unsigned short checksum; - unsigned long xtra; -} sgIP_Header_ICMP; - -#ifdef __cplusplus -extern "C" { -#endif - - extern void sgIP_ICMP_Init(void); - - extern int sgIP_ICMP_ReceivePacket(sgIP_memblock * mb, unsigned long srcip, unsigned long destip); - - - -#ifdef __cplusplus -}; -#endif - - -#endif diff --git a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_IP.c b/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_IP.c deleted file mode 100644 index d145ba4d92..0000000000 --- a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_IP.c +++ /dev/null @@ -1,124 +0,0 @@ -// DSWifi Project - sgIP Internet Protocol Stack Implementation -// Copyright (C) 2005-2006 Stephen Stair - sgstair@akkit.org - http://www.akkit.org -/****************************************************************************** -DSWifi Lib and test materials are licenced under the MIT open source licence: -Copyright (c) 2005-2006 Stephen Stair - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -******************************************************************************/ - -#include "sgIP_IP.h" -#include "sgIP_TCP.h" -#include "sgIP_UDP.h" -#include "sgIP_ICMP.h" -#include "sgIP_Hub.h" - -int idnum_count; - -int sgIP_IP_ReceivePacket(sgIP_memblock * mb) { - sgIP_Header_IP * iphdr; - unsigned short * chksum_calc; - int chksum_temp; - int hdrlen; - - iphdr=(sgIP_Header_IP *)mb->datastart; - chksum_calc=(unsigned short *)mb->datastart; - // check that header is valid: - hdrlen=iphdr->version_ihl&15; - // check length... - if(mb->totallength<htons(iphdr->tot_length)) { - SGIP_DEBUG_MESSAGE(("IP: bad length!")); - SGIP_DEBUG_MESSAGE(("-%i/%i",mb->totallength,htons(iphdr->tot_length))); - sgIP_memblock_free(mb); - return 0; // bad size. - } - sgIP_memblock_trimsize(mb,htons(iphdr->tot_length)); - // check version - if((iphdr->version_ihl>>4)!=4) { - SGIP_DEBUG_MESSAGE(("IP: bad version!")); - sgIP_memblock_free(mb); - return 0; // bad version. - } - - // check checksum - chksum_temp=sgIP_memblock_IPChecksum(mb,0,hdrlen*4); - if(chksum_temp!=0xFFFF) { // bad chksum! kill packet. - SGIP_DEBUG_MESSAGE(("IP: bad checksum!")); - sgIP_memblock_free(mb); - return 0; // bad checksum. - } - if(htons(iphdr->fragment_offset)&0x3FFF) { // fragmented! oh noes! We can't deal with this! - SGIP_DEBUG_MESSAGE(("IP: fragmented!")); - sgIP_memblock_free(mb); - return 0; // fragmented. - } - - sgIP_memblock_exposeheader(mb,-hdrlen*4); - switch(iphdr->protocol) { - case PROTOCOL_IP_ICMP: // ICMP - sgIP_ICMP_ReceivePacket(mb,iphdr->src_address,iphdr->dest_address); - break; - case PROTOCOL_IP_TCP: // TCP - sgIP_TCP_ReceivePacket(mb,iphdr->src_address,iphdr->dest_address); - break; - case PROTOCOL_IP_UDP: // UDP - sgIP_UDP_ReceivePacket(mb,iphdr->src_address,iphdr->dest_address); - break; - default: - sgIP_memblock_free(mb); - } - - return 0; -} -int sgIP_IP_MaxContentsSize(unsigned long destip) { - return sgIP_Hub_IPMaxMessageSize(destip)-sgIP_IP_RequiredHeaderSize(); -} -int sgIP_IP_RequiredHeaderSize() { - return 5*4; // we'll not include zeroed options. -} -int sgIP_IP_SendViaIP(sgIP_memblock * mb, int protocol, unsigned long srcip, unsigned long destip) { - sgIP_Header_IP * iphdr; - unsigned short * chksum_calc; - int chksum_temp,i; - sgIP_memblock_exposeheader(mb,20); - iphdr=(sgIP_Header_IP *)mb->datastart; - chksum_calc=(unsigned short *)mb->datastart; - iphdr->dest_address=destip; - iphdr->fragment_offset=0; - iphdr->header_checksum=0; - iphdr->identification=idnum_count++; - iphdr->protocol=protocol; - iphdr->src_address=srcip; - iphdr->tot_length=htons(mb->totallength); - iphdr->TTL=SGIP_IP_TTL; - iphdr->type_of_service=0; - iphdr->version_ihl=0x45; - chksum_temp=0; - for(i=0;i<10;i++) chksum_temp+=chksum_calc[i]; - chksum_temp += chksum_temp>>16; - chksum_temp &= 0xFFFF; - chksum_temp = ~chksum_temp; - if(chksum_temp==0) chksum_temp=0xFFFF; - iphdr->header_checksum=chksum_temp; - return sgIP_Hub_SendProtocolPacket(htons(0x0800),mb,destip,srcip); -} -unsigned long sgIP_IP_GetLocalBindAddr(unsigned long srcip, unsigned long destip) { - if(srcip) return srcip; - return sgIP_Hub_GetCompatibleIP(destip); -} diff --git a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_IP.h b/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_IP.h deleted file mode 100644 index d6b047429d..0000000000 --- a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_IP.h +++ /dev/null @@ -1,64 +0,0 @@ -// DSWifi Project - sgIP Internet Protocol Stack Implementation -// Copyright (C) 2005-2006 Stephen Stair - sgstair@akkit.org - http://www.akkit.org -/****************************************************************************** -DSWifi Lib and test materials are licenced under the MIT open source licence: -Copyright (c) 2005-2006 Stephen Stair - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -******************************************************************************/ -#ifndef SGIP_IP_H -#define SGIP_IP_H - -#include "sgIP_memblock.h" - -#define PROTOCOL_IP_ICMP 1 -#define PROTOCOL_IP_TCP 6 -#define PROTOCOL_IP_UDP 17 - -typedef struct SGIP_HEADER_IP { - unsigned char version_ihl; // version = top 4 bits == 4, IHL = header length in 32bit increments = bottom 4 bits - unsigned char type_of_service; // [3bit prescidence][ D ][ T ][ R ][ 0 0 ] - D=low delya, T=high thoroughput, R= high reliability - unsigned short tot_length; // total length of packet including header - unsigned short identification; // value assigned by sender to aid in packet reassembly - unsigned short fragment_offset; // top 3 bits are flags [0][DF][MF] (Don't Fragment / More Fragments Exist) - offset is in 8-byte chunks. - unsigned char TTL; // time to live, measured in hops - unsigned char protocol; // protocols: ICMP=1, TCP=6, UDP=17 - unsigned short header_checksum; // checksum: - unsigned long src_address; // src address is 32bit IP address - unsigned long dest_address; // dest address is 32bit IP address - unsigned char options[4]; // optional options come here. -} sgIP_Header_IP; - - -#ifdef __cplusplus -extern "C" { -#endif - - extern int sgIP_IP_ReceivePacket(sgIP_memblock * mb); - extern int sgIP_IP_MaxContentsSize(unsigned long destip); - extern int sgIP_IP_RequiredHeaderSize(void); - extern int sgIP_IP_SendViaIP(sgIP_memblock * mb, int protocol, unsigned long srcip, unsigned long destip); - extern unsigned long sgIP_IP_GetLocalBindAddr(unsigned long srcip, unsigned long destip); - -#ifdef __cplusplus -}; -#endif - - -#endif diff --git a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_TCP.c b/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_TCP.c deleted file mode 100644 index 92e63ec6ba..0000000000 --- a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_TCP.c +++ /dev/null @@ -1,915 +0,0 @@ -// DSWifi Project - sgIP Internet Protocol Stack Implementation -// Copyright (C) 2005-2006 Stephen Stair - sgstair@akkit.org - http://www.akkit.org -/****************************************************************************** -DSWifi Lib and test materials are licenced under the MIT open source licence: -Copyright (c) 2005-2006 Stephen Stair - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -******************************************************************************/ - -#include "sgIP_TCP.h" -#include "sgIP_IP.h" -#include "sgIP_Hub.h" -#include "sys/socket.h" - -sgIP_Record_TCP * tcprecords; -int port_counter; -unsigned long lasttime; -extern unsigned long volatile sgIP_timems; -sgIP_TCP_SYNCookie synlist[SGIP_TCP_MAXSYNS]; - -int numsynlist; // number of active entries in synlist (earliest first) - -void sgIP_TCP_Init() { - tcprecords=0; - numsynlist=0; - port_counter=SGIP_TCP_FIRSTOUTGOINGPORT; - lasttime=sgIP_timems; -} - -void sgIP_TCP_Timer() { // scan through tcp records and resend anything necessary - sgIP_Record_TCP * rec; - int time,i,j; - time=sgIP_timems-lasttime; - lasttime=sgIP_timems; - for(i=0;i<numsynlist;i++) { - if(synlist[i].timenext<=time) { - j=time-synlist[i].timenext; - synlist[i].timebackoff*=2; - if(synlist[i].timebackoff>SGIP_TCP_BACKOFFMAX) synlist[i].timebackoff=SGIP_TCP_BACKOFFMAX; - if(j>synlist[i].timebackoff) synlist[i].timenext=0; else synlist[i].timenext=synlist[i].timebackoff-j; - // resend SYN - sgIP_TCP_SendSynReply(SGIP_TCP_FLAG_SYN|SGIP_TCP_FLAG_ACK,synlist[i].localseq,synlist[i].remoteseq,synlist[i].localip,synlist[i].remoteip,synlist[i].localport,synlist[i].remoteport,-1); - } else { - synlist[i].timenext-=time; - } - } - rec=tcprecords; - while(rec) { - time=sgIP_timems-rec->time_last_action; - switch(rec->tcpstate) { - case SGIP_TCP_STATE_NODATA: // newly allocated [do nothing] - case SGIP_TCP_STATE_UNUSED: // allocated & BINDed [do nothing] - case SGIP_TCP_STATE_CLOSED: // Block is unused. [do nothing] - case SGIP_TCP_STATE_LISTEN: // listening [do nothing] - case SGIP_TCP_STATE_FIN_WAIT_2: // got ACK for our FIN, haven't got FIN yet. [do nothing] - break; - case SGIP_TCP_STATE_SYN_SENT: // connect initiated [resend syn] - if(time>rec->time_backoff) { - rec->retrycount++; - if(rec->retrycount>=SGIP_TCP_MAXRETRY) { - //error - rec->errorcode=ECONNABORTED; - rec->tcpstate=SGIP_TCP_STATE_CLOSED; - break; - } - j=rec->time_backoff; - j*=2; - if(j>SGIP_TCP_BACKOFFMAX) j=SGIP_TCP_BACKOFFMAX; - sgIP_TCP_SendPacket(rec,SGIP_TCP_FLAG_SYN,0); - rec->time_backoff=j; // preserve backoff - } - break; - case SGIP_TCP_STATE_CLOSE_WAIT: // got FIN, wait for user code to close socket & send FIN [do nothing] - case SGIP_TCP_STATE_ESTABLISHED: // syns have been exchanged [check for data in buffer, send] - if(rec->want_shutdown==1 && rec->buf_tx_out==rec->buf_tx_in) { // oblige & shutdown - sgIP_TCP_SendPacket(rec,SGIP_TCP_FLAG_FIN | SGIP_TCP_FLAG_ACK,0); - if(rec->tcpstate==SGIP_TCP_STATE_CLOSE_WAIT) { - rec->tcpstate=SGIP_TCP_STATE_CLOSING; - } else { - rec->tcpstate=SGIP_TCP_STATE_FIN_WAIT_1; - } - rec->want_shutdown=2; - break; - } - j=rec->buf_tx_out-rec->buf_tx_in; - if(j<0) j+=SGIP_TCP_TRANSMITBUFFERLENGTH; - j+=(int)(rec->sequence-rec->sequence_next); - if(j>0) {// never-sent bytes - if(time>SGIP_TCP_TRANSMIT_DELAY) { // 1000 is an arbitrary constant. - j=rec->buf_tx_out-rec->buf_tx_in; - if(j<0) j+=SGIP_TCP_TRANSMITBUFFERLENGTH; - i=(int)(rec->txwindow-rec->sequence); - if(j>i) j=i; - i=sgIP_IP_MaxContentsSize(rec->destip)-20; // max tcp data size - if(j>i) j=i; - sgIP_TCP_SendPacket(rec,SGIP_TCP_FLAG_ACK,i); - break; - } - } - if(time>rec->time_backoff && rec->buf_tx_out!=rec->buf_tx_in) { // resend last packet - j=rec->buf_tx_out-rec->buf_tx_in; - if(j<0) j+=SGIP_TCP_TRANSMITBUFFERLENGTH; - i=(int)(rec->txwindow-rec->sequence); - if(j>i) j=i; - i=sgIP_IP_MaxContentsSize(rec->destip)-20; // max tcp data size - if(j>i) j=i; - j=rec->time_backoff; - j*=2; - if(j>SGIP_TCP_BACKOFFMAX) j=SGIP_TCP_BACKOFFMAX; - sgIP_TCP_SendPacket(rec,SGIP_TCP_FLAG_ACK,i); - rec->time_backoff=j; // preserve backoff - break; - } - break; - case SGIP_TCP_STATE_FIN_WAIT_1: // sent a FIN, haven't got FIN or ACK yet. [resend fin] - if(time>rec->time_backoff) { - rec->retrycount++; - if(rec->retrycount>=SGIP_TCP_MAXRETRY) { - //error - rec->errorcode=ETIMEDOUT; - rec->tcpstate=SGIP_TCP_STATE_CLOSED; - break; - } - j=rec->time_backoff; - j*=2; - if(j>SGIP_TCP_BACKOFFMAX) j=SGIP_TCP_BACKOFFMAX; - sgIP_TCP_SendPacket(rec,SGIP_TCP_FLAG_FIN,0); - rec->time_backoff=j; // preserve backoff - } - break; - case SGIP_TCP_STATE_CLOSING: // got FIN, waiting for ACK of our FIN [resend FINACK] - if(time>rec->time_backoff) { - rec->retrycount++; - if(rec->retrycount>=SGIP_TCP_MAXRETRY) { - //error - rec->errorcode=ETIMEDOUT; - rec->tcpstate=SGIP_TCP_STATE_CLOSED; - break; - } - j=rec->time_backoff; - j*=2; - if(j>SGIP_TCP_BACKOFFMAX) j=SGIP_TCP_BACKOFFMAX; - sgIP_TCP_SendPacket(rec,SGIP_TCP_FLAG_FIN | SGIP_TCP_FLAG_ACK,0); - rec->time_backoff=j; // preserve backoff - } - break; - case SGIP_TCP_STATE_LAST_ACK: // wait for ACK of our last FIN [resend FIN] - if(time>rec->time_backoff) { - rec->retrycount++; - if(rec->retrycount>=SGIP_TCP_MAXRETRY) { - //error - rec->errorcode=ETIMEDOUT; - rec->tcpstate=SGIP_TCP_STATE_CLOSED; - break; - } - j=rec->time_backoff; - j*=2; - if(j>SGIP_TCP_BACKOFFMAX) j=SGIP_TCP_BACKOFFMAX; - sgIP_TCP_SendPacket(rec,SGIP_TCP_FLAG_FIN,0); - rec->time_backoff=j; // preserve backoff - } - break; - case SGIP_TCP_STATE_TIME_WAIT: // wait to ensure remote tcp knows it's been terminated. [reset in 2MSL] - if(time>SGIP_TCP_TIMEMS_2MSL) { - rec->errorcode=ESHUTDOWN; - rec->tcpstate=SGIP_TCP_STATE_CLOSED; - } - break; - } - - - rec=rec->next; - } -} - - -unsigned long sgIP_TCP_support_seqhash(unsigned long srcip, unsigned long destip, unsigned short srcport, unsigned short destport) { - unsigned long hash; - hash=destip; - hash ^= destport * (0x02041089+sgIP_timems); - hash ^= srcport * (0x080810422+(sgIP_timems<<1)); - hash ^= srcip * (0x48841221+(sgIP_timems<<3)); - hash ^= destip * (0x04020108+(sgIP_timems<<5)); - return hash; -} -int sgIP_TCP_GetUnusedOutgoingPort() { - int myport,clear; - sgIP_Record_TCP * rec; - port_counter+=(sgIP_timems&1023); // semi-random - if(port_counter>SGIP_TCP_LASTOUTGOINGPORT) port_counter=SGIP_TCP_FIRSTOUTGOINGPORT; - while(1) { - rec = tcprecords; - myport=port_counter++; - if(port_counter>SGIP_TCP_LASTOUTGOINGPORT) port_counter=SGIP_TCP_FIRSTOUTGOINGPORT; - clear=1; - while(rec) { - if(rec->srcport==myport && rec->tcpstate!=SGIP_TCP_STATE_CLOSED && rec->tcpstate!=SGIP_TCP_STATE_NODATA) { clear=0; break; } - rec=rec->next; - } - if(clear) return myport; - } -} - -int sgIP_TCP_CalcChecksum(sgIP_memblock * mb, unsigned long srcip, unsigned long destip, int totallength) { - int checksum; - if(!mb) return 0; - if(mb->totallength&1) mb->datastart[mb->totallength]=0; - checksum=sgIP_memblock_IPChecksum(mb,0,mb->totallength); - // add in checksum of "faux header" - checksum+=(destip&0xFFFF); - checksum+=(destip>>16); - checksum+=(srcip&0xFFFF); - checksum+=(srcip>>16); - checksum+=htons(totallength); - checksum+=(6)<<8; - checksum= (checksum&0xFFFF) +(checksum>>16); - checksum= (checksum&0xFFFF) +(checksum>>16); - - return checksum; -} - - -int sgIP_TCP_ReceivePacket(sgIP_memblock * mb, unsigned long srcip, unsigned long destip) { - if(!mb) return 0; - sgIP_Header_TCP * tcp; - int delta1,delta2, delta3,datalen, shouldReply; - unsigned long tcpack,tcpseq; - tcp = (sgIP_Header_TCP *) mb->datastart; - // 01234567890123456789012345678901 - // TCPxxxxxxxx-xxxxxxxx,xxxx-xxxx - //SGIP_DEBUG_MESSAGE(("TCP%08X-%08X,%04X-%04X",srcip,destip,tcp->srcport,tcp->destport)); - // -Lxxxx,Cxxxx,Fxx,hx,Axxxxxxxx - //SGIP_DEBUG_MESSAGE(("-L%04X,C%04X,F%02X,h%X,A%08X",mb->totallength,tcp->checksum,tcp->tcpflags,tcp->dataofs_>>4,tcp->acknum)); - if(tcp->checksum!=0x0000 && sgIP_TCP_CalcChecksum(mb,srcip,destip,mb->totallength)!=0xFFFF) { // checksum is invalid! - SGIP_DEBUG_MESSAGE(("TCP receive checksum incorrect")); - sgIP_memblock_free(mb); - return 0; - } - sgIP_Record_TCP * rec; - rec=tcprecords; - // find associated block. - while(rec) { - if(rec->srcport==tcp->destport && (rec->srcip==destip || rec->srcip==0)) { - if((rec->tcpstate==SGIP_TCP_STATE_LISTEN && (tcp->tcpflags&SGIP_TCP_FLAG_SYN)) || rec->destport==tcp->srcport) break; - } - rec=rec->next; - } - if(!rec) { // could be completion of an incoming connection? - tcpack=htonl(tcp->acknum); - if(tcp->tcpflags&SGIP_TCP_FLAG_ACK) { - int i,j; - for(i=0;i<numsynlist;i++) { - if(synlist[i].localseq+1==tcpack) { // oki! this is probably legit ;) - rec=synlist[i].linked; // we have the data we need. - // remove entry from synlist - numsynlist--; - i*=3; - for(;i<numsynlist;i++) { - synlist[i]=synlist[i+1]; // assume struct copy - } - for(j=0;j<rec->maxlisten;j++) if(!rec->listendata[j]) break; // find last entry in listen queue - if(j==rec->maxlisten) { rec=0; break; } // discard this connection! we have no space in the listen queue. - - rec->listendata[j]=sgIP_TCP_AllocRecord(); - j++; - if(j!=rec->maxlisten) rec->listendata[j]=0; - - rec=rec->listendata[j-1]; - - // fill in data about the connection. - rec->tcpstate=SGIP_TCP_STATE_ESTABLISHED; - rec->time_last_action=sgIP_timems; - rec->time_backoff=SGIP_TCP_GENRETRYMS; // backoff timer - rec->srcip=destip; - rec->destip=srcip; - rec->srcport=tcp->destport; - rec->destport=tcp->srcport; - rec->sequence=htonl(tcp->acknum); - rec->ack=htonl(tcp->seqnum); - rec->sequence_next=rec->sequence; - rec->rxwindow=rec->ack+1400; // last byte in receive window - rec->txwindow=rec->sequence+htons(tcp->window); - - sgIP_memblock_free(mb); - return 0; - } - } - } - } - if(!rec) { // we don't have a clue what this one is. -#ifndef SGIP_TCP_STEALTH - // send a RST - sgIP_TCP_SendSynReply(SGIP_TCP_FLAG_RST,ntohl(tcp->acknum),0,destip,srcip,tcp->destport,tcp->srcport,0); -#endif - sgIP_memblock_free(mb); - return 0; - } - // check sequence and ACK numbers, to ensure they're in range. - tcpack=htonl(tcp->acknum); - tcpseq=htonl(tcp->seqnum); - datalen=mb->totallength-(tcp->dataofs_>>4)*4; - shouldReply=0; - if(tcp->tcpflags&SGIP_TCP_FLAG_RST) { // verify if rst is legit, and act on it. - // check seq against receive window - delta1=(int)(tcpseq-rec->ack); - delta2=(int)(rec->rxwindow-tcpseq); - if(delta1<0 || delta2<0 || rec->tcpstate==SGIP_TCP_STATE_LISTEN) { - // out of range, ignore - } else { - // in range! reset connection. - rec->errorcode=ECONNRESET; - rec->tcpstate=SGIP_TCP_STATE_CLOSED; - } - sgIP_memblock_free(mb); - return 0; - } - - if((tcp->tcpflags&SGIP_TCP_FLAG_ACK) && !(tcp->tcpflags&SGIP_TCP_FLAG_SYN)) { // doesn't work very well with SYN. - // verify ack value (checking ack sequence vs transmit window) - delta1=(int)(tcpack-rec->sequence); - delta2=(int)(rec->txwindow-tcpack); - if(delta1<0 || delta2<0) { // invalid ack range, discard packet - sgIP_memblock_free(mb); - return 0; - } - delta2=tcpack-rec->sequence; - rec->sequence=tcpack; - delta2+=rec->buf_tx_in; - if(delta2>=SGIP_TCP_TRANSMITBUFFERLENGTH) delta2-=SGIP_TCP_TRANSMITBUFFERLENGTH; - rec->buf_tx_in=delta2; - if(delta1>0) shouldReply=1; - } - rec->txwindow=rec->sequence+htons(tcp->window); - - // now, decide what to do with our nice new shiny memblock... - - // for most states, receive data - switch(rec->tcpstate) { - case SGIP_TCP_STATE_NODATA: // newly allocated - case SGIP_TCP_STATE_UNUSED: // allocated & BINDed - case SGIP_TCP_STATE_CLOSED: // Block is unused. - case SGIP_TCP_STATE_LISTEN: // listening - case SGIP_TCP_STATE_TIME_WAIT: // wait to ensure remote tcp knows it's been terminated. - case SGIP_TCP_STATE_SYN_SENT: // connect initiated - case SGIP_TCP_STATE_CLOSE_WAIT: // got FIN, wait for user code to close socket & send FIN - case SGIP_TCP_STATE_CLOSING: // got FIN, waiting for ACK of our FIN - case SGIP_TCP_STATE_LAST_ACK: // wait for ACK of our last FIN - break; - case SGIP_TCP_STATE_SYN_RECEIVED: // spawned from listen socket; or from syn sent. - case SGIP_TCP_STATE_ESTABLISHED: // syns have been exchanged - case SGIP_TCP_STATE_FIN_WAIT_1: // sent a FIN, haven't got FIN or ACK yet. - case SGIP_TCP_STATE_FIN_WAIT_2: // got ACK for our FIN, haven't got FIN yet. - if(tcp->tcpflags&SGIP_TCP_FLAG_ACK) { - // check end of incoming data against receive window - delta1=(int)(tcpseq+datalen-rec->ack); // check end of data vs start of window (>=0, end of data is equal to or after start of unreceived data) - delta2=(int)(rec->rxwindow-tcpseq-datalen); // check end of data vs end of window (>=0, end of data is equal to or before end of rx window) - delta3=(int)(rec->ack-tcpseq); // check start of data vs start of window (>=0, start of data is equal or before the next expected byte) - if(delta1<0 || delta2<0 || delta3<0) { - if(delta1>-SGIP_TCP_RECEIVEBUFFERLENGTH) { // ack it anyway, they got lost on the retard bus. - sgIP_TCP_SendPacket(rec,SGIP_TCP_FLAG_ACK,0); - } - break; // out of range, they should know better. - } - { - int datastart=(tcp->dataofs_>>4)*4; - delta1=(int)(tcpseq-rec->ack); - if(delta1<0) { // data is partly ack'd...just copy what we need. - datastart-=delta1; - datalen+=delta1; - } - // copy data into the fifo - rec->ack+=datalen; - delta1=datalen; - while(datalen>0) { // don't actually need to check the rx buffer length, if the ack check approved it, it will be in range (not overflow) by default - delta2=SGIP_TCP_RECEIVEBUFFERLENGTH-rec->buf_rx_out; // number of bytes til the end of the buffer - if(datalen<delta2) delta2=datalen; - sgIP_memblock_CopyToLinear(mb,rec->buf_rx+rec->buf_rx_out,datastart,delta2); - datalen-=delta2; - datastart+=delta2; - rec->buf_rx_out += delta2; - if(rec->buf_rx_out>=SGIP_TCP_RECEIVEBUFFERLENGTH) rec->buf_rx_out-=SGIP_TCP_RECEIVEBUFFERLENGTH; - } - if(rec->tcpstate==SGIP_TCP_STATE_FIN_WAIT_1 || rec->tcpstate==SGIP_TCP_STATE_FIN_WAIT_2) break; - if(shouldReply || delta1>=0) { // send a packet in reply, ha! - delta1=rec->buf_tx_out-rec->buf_tx_in; - if(delta1<0) delta1+=SGIP_TCP_TRANSMITBUFFERLENGTH; - delta2=(int)(rec->txwindow-rec->sequence); - if(delta1>delta2) delta1=delta2; - delta2=sgIP_IP_MaxContentsSize(rec->destip)-20; // max tcp data size - if(delta1>delta2) delta1=delta2; - if(delta1>=0) { // could be less than 0, but very odd. - sgIP_TCP_SendPacket(rec,SGIP_TCP_FLAG_ACK,delta1); - } - } - } - } - } - - // decide what to do with the others - switch(rec->tcpstate) { - case SGIP_TCP_STATE_NODATA: // newly allocated - case SGIP_TCP_STATE_UNUSED: // allocated & BINDed - case SGIP_TCP_STATE_CLOSED: // Block is unused. - break; // can't do anything in these states. - case SGIP_TCP_STATE_LISTEN: // listening - if(tcp->tcpflags&SGIP_TCP_FLAG_SYN) { // other end requesting a connection - if(numsynlist==SGIP_TCP_MAXSYNS) { - numsynlist--; - for(delta1=0;delta1<numsynlist;delta1++) { - synlist[delta1]=synlist[delta1+1]; // assume struct copy - } - } - { - unsigned long myseq,myport; - myport=tcp->destport; - myseq=sgIP_TCP_support_seqhash(srcip,destip,tcp->srcport,myport); - // send relevant synack - sgIP_TCP_SendSynReply(SGIP_TCP_FLAG_SYN|SGIP_TCP_FLAG_ACK,myseq,tcpseq+1,destip,srcip,myport,tcp->srcport,-1); - synlist[numsynlist].localseq=myseq; - synlist[numsynlist].timebackoff=SGIP_TCP_SYNRETRYMS; - synlist[numsynlist].timenext=SGIP_TCP_SYNRETRYMS; - synlist[numsynlist].linked=rec; - synlist[numsynlist].remoteseq=tcpseq+1; - synlist[numsynlist].remoteip=srcip; - synlist[numsynlist].localip=destip; - synlist[numsynlist].localport=myport; - synlist[numsynlist].remoteport=tcp->srcport; - numsynlist++; - } - } - break; - case SGIP_TCP_STATE_SYN_SENT: // connect initiated - switch(tcp->tcpflags&(SGIP_TCP_FLAG_SYN|SGIP_TCP_FLAG_ACK)) { - case SGIP_TCP_FLAG_SYN | SGIP_TCP_FLAG_ACK: // both flags set - rec->ack=tcpseq+1; - rec->sequence=tcpack; - sgIP_TCP_SendPacket(rec,SGIP_TCP_FLAG_ACK,0); - rec->tcpstate=SGIP_TCP_STATE_ESTABLISHED; - rec->retrycount=0; - break; - case SGIP_TCP_FLAG_SYN: // just got a syn... - rec->ack=tcpseq+1; - rec->sequence=tcpack; - sgIP_TCP_SendPacket(rec,SGIP_TCP_FLAG_ACK,0); - rec->tcpstate=SGIP_TCP_STATE_SYN_RECEIVED; - rec->retrycount=0; - break; - } - break; - case SGIP_TCP_STATE_SYN_RECEIVED: // spawned from listen socket; or from syn sent. - if(tcp->tcpflags&SGIP_TCP_FLAG_ACK) { - rec->tcpstate=SGIP_TCP_STATE_ESTABLISHED; - rec->retrycount=0; - } - break; - case SGIP_TCP_STATE_ESTABLISHED: // syns have been exchanged - if(tcp->tcpflags&SGIP_TCP_FLAG_FIN) { - // check sequence against next ack number - delta1=(int)(tcpseq-rec->ack); - //delta2=(int)(rec->rxwindow-tcpseq); - if(delta1<0 || delta1>0) break; // out of range, they should know better. - // this is the end... - rec->tcpstate=SGIP_TCP_STATE_CLOSE_WAIT; - rec->ack=tcpseq+datalen+1; - sgIP_TCP_SendPacket(rec,SGIP_TCP_FLAG_ACK,0); - - } - break; - case SGIP_TCP_STATE_FIN_WAIT_1: // sent a FIN, haven't got FIN or ACK yet. - switch(tcp->tcpflags&(SGIP_TCP_FLAG_FIN|SGIP_TCP_FLAG_ACK)) { - case SGIP_TCP_FLAG_FIN: - // check sequence against next ack number - delta1=(int)(tcpseq-rec->ack); - //delta2=(int)(rec->rxwindow-tcpseq); - if(delta1<0 || delta1>0) break; // out of range, they should know better. - - rec->tcpstate=SGIP_TCP_STATE_CLOSING; - rec->ack=tcpseq+datalen+1; - sgIP_TCP_SendPacket(rec,SGIP_TCP_FLAG_ACK,0); - break; - case SGIP_TCP_FLAG_ACK: // already checked ack against appropriate window - rec->tcpstate=SGIP_TCP_STATE_FIN_WAIT_2; - break; - case (SGIP_TCP_FLAG_FIN | SGIP_TCP_FLAG_ACK): // already checked ack, check sequence though - // check sequence against next ack number - delta1=(int)(tcpseq-rec->ack); - //delta2=(int)(rec->rxwindow-tcpseq); - if(delta1<0 || delta1>0) break; // out of range, they should know better. - rec->tcpstate=SGIP_TCP_STATE_TIME_WAIT; - rec->ack=tcpseq+datalen+1; - sgIP_TCP_SendPacket(rec,SGIP_TCP_FLAG_ACK,0); - break; - } - break; - case SGIP_TCP_STATE_FIN_WAIT_2: // got ACK for our FIN, haven't got FIN yet. - if(tcp->tcpflags&SGIP_TCP_FLAG_FIN) { - // check sequence against next ack number - delta1=(int)(tcpseq-rec->ack); - //delta2=(int)(rec->rxwindow-tcpseq); - if(delta1<0 || delta1>0) break; // out of range, they should know better. - - rec->tcpstate=SGIP_TCP_STATE_TIME_WAIT; - rec->ack=tcpseq+datalen+1; - sgIP_TCP_SendPacket(rec,SGIP_TCP_FLAG_ACK,0); - } - break; - case SGIP_TCP_STATE_CLOSE_WAIT: // got FIN, wait for user code to close socket & send FIN - if(tcp->tcpflags&SGIP_TCP_FLAG_FIN) { - // check sequence against next ack number - delta1=(int)(tcpseq-rec->ack); - //delta2=(int)(rec->rxwindow-tcpseq); - if(delta1<0 || delta1>0) break; // out of range, they should know better. - - sgIP_TCP_SendPacket(rec,SGIP_TCP_FLAG_ACK,0); // they still don't seem to have got our ack, we'll send it again. - } - break; - case SGIP_TCP_STATE_CLOSING: // got FIN, waiting for ACK of our FIN - switch(tcp->tcpflags&(SGIP_TCP_FLAG_FIN|SGIP_TCP_FLAG_ACK)) { - case SGIP_TCP_FLAG_FIN: - // check sequence against receive window - delta1=(int)(tcpseq-rec->ack); - delta2=(int)(rec->rxwindow-tcpseq); - if(delta1<1 || delta2<0) break; // out of range, they should know better. - - sgIP_TCP_SendPacket(rec,SGIP_TCP_FLAG_ACK,0); // resend their ack. - break; - case SGIP_TCP_FLAG_ACK: // already checked ack against appropriate window - rec->tcpstate=SGIP_TCP_STATE_TIME_WAIT; - break; - case (SGIP_TCP_FLAG_FIN | SGIP_TCP_FLAG_ACK): // already checked ack, check sequence though - // check sequence against receive window - delta1=(int)(tcpseq-rec->ack); - delta2=(int)(rec->rxwindow-tcpseq); - if(delta1<1 || delta2<0) break; // out of range, they should know better. - rec->tcpstate=SGIP_TCP_STATE_TIME_WAIT; - sgIP_TCP_SendPacket(rec,SGIP_TCP_FLAG_ACK,0); - break; - } - break; - - case SGIP_TCP_STATE_LAST_ACK: // wait for ACK of our last FIN - if(tcp->tcpflags&SGIP_TCP_FLAG_ACK) { - rec->tcpstate=SGIP_TCP_STATE_TIME_WAIT; - } - break; - case SGIP_TCP_STATE_TIME_WAIT: // wait to ensure remote tcp knows it's been terminated. - if(tcp->tcpflags&SGIP_TCP_FLAG_FIN) { - // check sequence against receive window - delta1=(int)(tcpseq-rec->ack); - delta2=(int)(rec->rxwindow-tcpseq); - if(delta1<1 || delta2<0) break; // out of range, they should know better. - - sgIP_TCP_SendPacket(rec,SGIP_TCP_FLAG_ACK,0); // send 'em a grat ACK - } - break; - } - sgIP_memblock_free(mb); - return 0; -} - -sgIP_memblock * sgIP_TCP_GenHeader(sgIP_Record_TCP * rec, int flags, int datalength) { - sgIP_memblock * mb = sgIP_memblock_alloc(datalength+20+sgIP_IP_RequiredHeaderSize()); - int windowlen; - if(!mb) return 0; - sgIP_memblock_exposeheader(mb,-sgIP_IP_RequiredHeaderSize()); // hide IP header space for later - sgIP_Header_TCP * tcp = (sgIP_Header_TCP *) mb->datastart; - tcp->srcport=rec->srcport; - tcp->destport=rec->destport; - tcp->seqnum=htonl(rec->sequence); - tcp->acknum=htonl(rec->ack); - tcp->tcpflags=flags; - tcp->urg_ptr=0; // no support for URG data atm. - tcp->checksum=0; - tcp->dataofs_=5<<4; // header length == 20 (5*32bit) - windowlen=rec->buf_rx_out-rec->buf_rx_in; - if(windowlen<0) windowlen+=SGIP_TCP_RECEIVEBUFFERLENGTH; // we now have the amount in the buffer - windowlen = SGIP_TCP_RECEIVEBUFFERLENGTH-windowlen-1; - if(windowlen<0) windowlen=0; - if(flags&SGIP_TCP_FLAG_ACK) rec->want_reack = windowlen<SGIP_TCP_REACK_THRESH; // indicate an additional ack should be sent when we have more space in the buffer. - if(windowlen>65535) windowlen=65535; - if(windowlen>1400) windowlen=1400; // don't want to deal with IP fragmentation. - rec->rxwindow=rec->ack+windowlen; // last byte in receive window - tcp->window=htons(windowlen); - return mb; -} -void sgIP_TCP_FixChecksum(unsigned long srcip, unsigned long destip, sgIP_memblock * mb) { - int checksum; - if(!mb) return; - sgIP_Header_TCP * tcp; - tcp = (sgIP_Header_TCP *) mb->datastart; - tcp->checksum=0; - checksum=sgIP_memblock_IPChecksum(mb,0,mb->totallength); - - // add in checksum of "faux header" - checksum+=(destip&0xFFFF); - checksum+=(destip>>16); - checksum+=(srcip&0xFFFF); - checksum+=(srcip>>16); - checksum+=htons(mb->totallength); - checksum+=(6)<<8; - checksum=(checksum&0xFFFF) + (checksum>>16); - checksum=(checksum&0xFFFF) + (checksum>>16); - - checksum = ~checksum; - if(checksum==0) checksum=0xFFFF; - tcp->checksum=checksum; -} - -int sgIP_TCP_SendPacket(sgIP_Record_TCP * rec, int flags, int datalength) { // data sent is taken directly from the TX fifo. - int i,j,k; - if(!rec) return 0; - SGIP_INTR_PROTECT(); - - j=rec->buf_tx_out-rec->buf_tx_in; - if(j<0) j+=SGIP_TCP_TRANSMITBUFFERLENGTH; - if(datalength>j) datalength=j; - sgIP_memblock * mb =sgIP_TCP_GenHeader(rec,flags,datalength); - if(!mb) { - SGIP_INTR_UNPROTECT(); - return 0; - } - j=20; // destination offset in memblock for data - rec->sequence_next=rec->sequence+datalength; - k=rec->buf_tx_in; - while(datalength>0) { - i=SGIP_TCP_TRANSMITBUFFERLENGTH-rec->buf_tx_in; - if(i>datalength)i=datalength; - sgIP_memblock_CopyFromLinear(mb,rec->buf_tx+k,j,i); - k+=i; - if(k>=SGIP_TCP_TRANSMITBUFFERLENGTH) k-=SGIP_TCP_TRANSMITBUFFERLENGTH; - j+=i; - datalength-=i; - } - - sgIP_TCP_FixChecksum(rec->srcip,rec->destip,mb); - sgIP_IP_SendViaIP(mb,6,rec->srcip,rec->destip); - - rec->time_last_action=sgIP_timems; // semi-generic timer. - rec->time_backoff=SGIP_TCP_GENRETRYMS; // backoff timer - SGIP_INTR_UNPROTECT(); - return 0; -} - -int sgIP_TCP_SendSynReply(int flags,unsigned long seq, unsigned long ack, unsigned long srcip, unsigned long destip, int srcport, int destport, int windowlen) { - SGIP_INTR_PROTECT(); - - sgIP_memblock * mb = sgIP_memblock_alloc(20+sgIP_IP_RequiredHeaderSize()); - if(!mb) { - SGIP_INTR_UNPROTECT(); - return 0; - } - sgIP_memblock_exposeheader(mb,-sgIP_IP_RequiredHeaderSize()); // hide IP header space for later - sgIP_Header_TCP * tcp = (sgIP_Header_TCP *) mb->datastart; - tcp->srcport=srcport; - tcp->destport=destport; - tcp->seqnum=htonl(seq); - tcp->acknum=htonl(ack); - tcp->tcpflags=flags; - tcp->urg_ptr=0; // no support for URG data atm. - tcp->checksum=0; - tcp->dataofs_=5<<4; // header length == 20 (5*32bit) - - if(windowlen<0 || windowlen>1400) windowlen=1400; // don't want to deal with IP fragmentation. - tcp->window=htons(windowlen); - - sgIP_TCP_FixChecksum(srcip,destip,mb); - sgIP_IP_SendViaIP(mb,6,srcip,destip); - - SGIP_INTR_UNPROTECT(); - return 0; -} - -sgIP_Record_TCP * sgIP_TCP_AllocRecord() { - SGIP_INTR_PROTECT(); - sgIP_Record_TCP * rec; - rec = sgIP_malloc(sizeof(sgIP_Record_TCP)); - if(rec) { - rec->buf_oob_in=0; - rec->buf_oob_out=0; - rec->buf_rx_in=0; - rec->buf_rx_out=0; - rec->buf_tx_in=0; - rec->buf_tx_out=0; - rec->tcpstate=0; - rec->next=tcprecords; - tcprecords=rec; - rec->maxlisten=0; - rec->srcip=0; - rec->retrycount=0; - rec->errorcode=0; - rec->listendata=0; - rec->want_shutdown=0; - rec->want_reack=0; - } - SGIP_INTR_UNPROTECT(); - return rec; -} -void sgIP_TCP_FreeRecord(sgIP_Record_TCP * rec) { - if(!rec) return; - SGIP_INTR_PROTECT(); - sgIP_Record_TCP * t; - int i,j; - rec->tcpstate=0; - if(tcprecords==rec) { - tcprecords=rec->next; - } else { - t=tcprecords; - while(t) { - if(t->next==rec) { - t->next=rec->next; - break; - } - t=t->next; - } - } - if(rec->listendata) { - for(i=0;i<rec->maxlisten;i++) { - if(!rec->listendata[i]) break; - sgIP_TCP_FreeRecord(rec->listendata[i]); - } - // kill any possible waiting elements in the SYN chain. - j=0; - for(i=0;i<numsynlist;i++) { - if(j!=i) { - synlist[j]=synlist[i]; - } - if(synlist[i].linked==rec) j--; - j++; - } - numsynlist=j; - sgIP_free(rec->listendata); - } - sgIP_free(rec); - - SGIP_INTR_UNPROTECT(); -} - -int sgIP_TCP_Bind(sgIP_Record_TCP * rec, int srcport, unsigned long srcip) { - if(!rec) return 0; - SGIP_INTR_PROTECT(); - if(rec->tcpstate==SGIP_TCP_STATE_NODATA) { - rec->srcip=srcip; - rec->srcport=srcport; - rec->tcpstate=SGIP_TCP_STATE_UNUSED; - } - SGIP_INTR_UNPROTECT(); - return 0; -} -int sgIP_TCP_Listen(sgIP_Record_TCP * rec, int maxlisten) { - if(!rec) return SGIP_ERROR(EINVAL); - if(rec->tcpstate!=SGIP_TCP_STATE_UNUSED) return SGIP_ERROR(EINVAL); - int err; - SGIP_INTR_PROTECT(); - if(rec->maxlisten!=0) { // we're *already* listening. - err=0; - } else { - err=0; - if(maxlisten<=0) maxlisten=1; - rec->maxlisten=maxlisten; - rec->listendata = (sgIP_Record_TCP **) sgIP_malloc(maxlisten*4); // pointers to TCP records, 0-terminated list. - if(!rec->listendata) { rec->maxlisten=0; err=0; } else {rec->tcpstate=SGIP_TCP_STATE_LISTEN; rec->listendata[0]=0;} - } - SGIP_INTR_UNPROTECT(); - return err; -} - -sgIP_Record_TCP * sgIP_TCP_Accept(sgIP_Record_TCP * rec) { - if(!rec) return (sgIP_Record_TCP *)SGIP_ERROR0(EINVAL); - if(rec->tcpstate!=SGIP_TCP_STATE_LISTEN) return (sgIP_Record_TCP *)SGIP_ERROR0(EINVAL); - int err,i; - sgIP_Record_TCP * t; - SGIP_INTR_PROTECT(); - if(!rec->listendata) err=SGIP_ERROR0(EINVAL); - else { - if(!rec->listendata[0]) { - err=SGIP_ERROR0(EWOULDBLOCK); - } else { - t=rec->listendata[0]; - for(i=1;i<rec->maxlisten;i++) { - rec->listendata[i-1]=rec->listendata[i]; - } - rec->listendata[i-1]=0; - SGIP_INTR_UNPROTECT(); - return t; - } - } - - SGIP_INTR_UNPROTECT(); - return 0; -} - -int sgIP_TCP_Close(sgIP_Record_TCP * rec) { - if(!rec) return SGIP_ERROR(EINVAL); - SGIP_INTR_PROTECT(); - if(rec->want_shutdown==0) rec->want_shutdown=1; - SGIP_INTR_UNPROTECT(); - return 0; -} -int sgIP_TCP_Connect(sgIP_Record_TCP * rec, unsigned long destip, int destport) { - if(!rec) return SGIP_ERROR(EINVAL); - SGIP_INTR_PROTECT(); - if(rec->tcpstate==SGIP_TCP_STATE_NODATA) { // need to bind a local address - rec->srcip=sgIP_IP_GetLocalBindAddr(0,destip); - rec->srcport=htons(sgIP_TCP_GetUnusedOutgoingPort()); - rec->destip=destip; - rec->destport=destport; - } else if(rec->tcpstate==SGIP_TCP_STATE_UNUSED) { // already bound to a local address. - rec->srcip=sgIP_IP_GetLocalBindAddr(rec->srcip,destip); - rec->destip=destip; - rec->destport=destport; - } else { - SGIP_INTR_UNPROTECT(); - return SGIP_ERROR(EINVAL); - } - - // send a SYN packet, and advance the state of the connection - rec->sequence=sgIP_TCP_support_seqhash(rec->srcip,rec->destip,rec->srcport,rec->destport); - sgIP_TCP_SendPacket(rec,SGIP_TCP_FLAG_SYN,0); - rec->retrycount=0; - rec->tcpstate=SGIP_TCP_STATE_SYN_SENT; - - SGIP_INTR_UNPROTECT(); - return 0; -} -int sgIP_TCP_Send(sgIP_Record_TCP * rec, const char * datatosend, int datalength, int flags) { - if(!rec || !datatosend) return SGIP_ERROR(EINVAL); - if(rec->want_shutdown) return SGIP_ERROR(ESHUTDOWN); - SGIP_INTR_PROTECT(); - int bufsize; - bufsize=rec->buf_tx_out-rec->buf_tx_in; - if(bufsize<0) bufsize+=SGIP_TCP_TRANSMITBUFFERLENGTH; - if(bufsize==0) { rec->time_last_action=sgIP_timems; rec->time_backoff=SGIP_TCP_GENRETRYMS; } // first byte sent, set up delay before sending - bufsize=SGIP_TCP_TRANSMITBUFFERLENGTH-bufsize-1; // space left in buffer - if(datalength>bufsize) datalength=bufsize; - int i,j; - j=rec->buf_tx_out; - for(i=0;i<datalength;i++) { - rec->buf_tx[j++]=datatosend[i]; - if(j==SGIP_TCP_TRANSMITBUFFERLENGTH) j=0; - } - rec->buf_tx_out = j; - // check for immediate transmit - j=rec->buf_tx_out-rec->buf_tx_in; - if(j<0) j+=SGIP_TCP_TRANSMITBUFFERLENGTH; - j+=(int)(rec->sequence-rec->sequence_next); - if(j>SGIP_TCP_TRANSMIT_IMMTHRESH && rec->tcpstate==SGIP_TCP_STATE_ESTABLISHED) { - j=(int)(rec->sequence_next-rec->sequence); - if(j<1000) { // arbitrary constant. - j=rec->buf_tx_out-rec->buf_tx_in; - if(j<0) j+=SGIP_TCP_TRANSMITBUFFERLENGTH; - i=(int)(rec->txwindow-rec->sequence); - if(j>i) j=i; - i=sgIP_IP_MaxContentsSize(rec->destip)-20; // max tcp data size - if(j>i) j=i; - sgIP_TCP_SendPacket(rec,SGIP_TCP_FLAG_ACK,i); - rec->retrycount=0; - } - } - SGIP_INTR_UNPROTECT(); - if(datalength==0) return SGIP_ERROR(EWOULDBLOCK); - return datalength; -} -int sgIP_TCP_Recv(sgIP_Record_TCP * rec, char * databuf, int buflength, int flags) { - if(!rec || !databuf) return SGIP_ERROR(EINVAL); //error - if(rec->buf_rx_in==rec->buf_rx_out) { - if(rec->tcpstate==SGIP_TCP_STATE_CLOSED || rec->tcpstate==SGIP_TCP_STATE_CLOSE_WAIT) { - if(rec->errorcode) return SGIP_ERROR(rec->errorcode); - return SGIP_ERROR0(ESHUTDOWN); - } - return SGIP_ERROR(EWOULDBLOCK); //error no data - } - SGIP_INTR_PROTECT(); - int rxlen = rec->buf_rx_out - rec->buf_rx_in; - if(rxlen<0) rxlen+=SGIP_TCP_RECEIVEBUFFERLENGTH; - if(buflength>rxlen) buflength=rxlen; - int i,j; - j=rec->buf_rx_in; - for(i=0;i<buflength;i++) { - databuf[i]=rec->buf_rx[j++]; - if(j==SGIP_TCP_RECEIVEBUFFERLENGTH) j=0; - } - - if(!(flags&MSG_PEEK)) { - rec->buf_rx_in=j; - - if(rec->want_reack) { - i=rec->buf_rx_out-rec->buf_rx_in; - if(i<0) i+=SGIP_TCP_RECEIVEBUFFERLENGTH; // we now have the amount in the buffer - i = SGIP_TCP_RECEIVEBUFFERLENGTH-i-1; - if(i<0) i=0; - if(i>SGIP_TCP_REACK_THRESH) { - rec->want_reack=0; - sgIP_TCP_SendPacket(rec,SGIP_TCP_FLAG_ACK,0); - } - } - } - SGIP_INTR_UNPROTECT(); - return buflength; -} diff --git a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_TCP.h b/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_TCP.h deleted file mode 100644 index 4e4e649b46..0000000000 --- a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_TCP.h +++ /dev/null @@ -1,134 +0,0 @@ -// DSWifi Project - sgIP Internet Protocol Stack Implementation -// Copyright (C) 2005-2006 Stephen Stair - sgstair@akkit.org - http://www.akkit.org -/****************************************************************************** -DSWifi Lib and test materials are licenced under the MIT open source licence: -Copyright (c) 2005-2006 Stephen Stair - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -******************************************************************************/ -#ifndef SGIP_TCP_H -#define SGIP_TCP_H - -#include "sgIP_Config.h" -#include "sgIP_memblock.h" - -enum SGIP_TCP_STATE { - SGIP_TCP_STATE_NODATA, // newly allocated - SGIP_TCP_STATE_UNUSED, // allocated & BINDed - SGIP_TCP_STATE_LISTEN, // listening - SGIP_TCP_STATE_SYN_SENT, // connect initiated - SGIP_TCP_STATE_SYN_RECEIVED, // spawned from listen socket; - SGIP_TCP_STATE_ESTABLISHED, // syns have been exchanged - SGIP_TCP_STATE_FIN_WAIT_1, // sent a FIN, haven't got FIN or ACK yet. - SGIP_TCP_STATE_FIN_WAIT_2, // got ACK for our FIN, haven't got FIN yet. - SGIP_TCP_STATE_CLOSE_WAIT, // got FIN, wait for user code to close socket & send FIN - SGIP_TCP_STATE_CLOSING, // got FIN, waiting for ACK of our FIN - SGIP_TCP_STATE_LAST_ACK, // wait for ACK of our last FIN - SGIP_TCP_STATE_TIME_WAIT, // wait to ensure remote tcp knows it's been terminated. - SGIP_TCP_STATE_CLOSED, // Block is unused. -}; - - -#define SGIP_TCP_FLAG_FIN 1 -#define SGIP_TCP_FLAG_SYN 2 -#define SGIP_TCP_FLAG_RST 4 -#define SGIP_TCP_FLAG_PSH 8 -#define SGIP_TCP_FLAG_ACK 16 -#define SGIP_TCP_FLAG_URG 32 - -typedef struct SGIP_HEADER_TCP { - unsigned short srcport,destport; - unsigned long seqnum; - unsigned long acknum; - unsigned char dataofs_; - unsigned char tcpflags; - unsigned short window; - unsigned short checksum; - unsigned short urg_ptr; - unsigned char options[4]; -} sgIP_Header_TCP; - - -// sgIP_Record_TCP - a TCP record, to store data for an active TCP connection. -typedef struct SGIP_RECORD_TCP { - struct SGIP_RECORD_TCP * next; // operate as a linked list - // TCP state information - int tcpstate; - unsigned long sequence; // sequence number of first byte not acknowledged by remote system - unsigned long ack; // external sequence number of next byte to receive - unsigned long sequence_next; // sequence number of first unsent byte - unsigned long rxwindow; // sequence of last byte in receive window - unsigned long txwindow; // sequence of last byte allowed to send - int time_last_action; // used for retransmission and etc. - int time_backoff; - int retrycount; - unsigned long srcip; - unsigned long destip; - unsigned short srcport,destport; - struct SGIP_RECORD_TCP ** listendata; - int maxlisten; - int errorcode; - int want_shutdown; // 0= don't want shutdown, 1= want shutdown, 2= being shutdown - int want_reack; - // TCP buffer information: - int buf_rx_in, buf_rx_out; - int buf_tx_in, buf_tx_out; - int buf_oob_in, buf_oob_out; - unsigned char buf_rx[SGIP_TCP_RECEIVEBUFFERLENGTH]; - unsigned char buf_tx[SGIP_TCP_TRANSMITBUFFERLENGTH]; - unsigned char buf_oob[SGIP_TCP_OOBBUFFERLENGTH]; -} sgIP_Record_TCP; - -typedef struct SGIP_TCP_SYNCOOKIE { - unsigned long localseq, remoteseq; - unsigned long localip, remoteip; - unsigned short localport, remoteport; - unsigned long timenext,timebackoff; - sgIP_Record_TCP * linked; // parent listening connection -} sgIP_TCP_SYNCookie; - - - -#ifdef __cplusplus -extern "C" { -#endif - - extern void sgIP_TCP_Init(void); - extern void sgIP_TCP_Timer(void); - - extern int sgIP_TCP_ReceivePacket(sgIP_memblock * mb, unsigned long srcip, unsigned long destip); - extern int sgIP_TCP_SendPacket(sgIP_Record_TCP * rec, int flags, int datalength); // data sent is taken directly from the TX fifo. - extern int sgIP_TCP_SendSynReply(int flags,unsigned long seq, unsigned long ack, unsigned long srcip, unsigned long destip, int srcport, int destport, int windowlen); - - extern sgIP_Record_TCP * sgIP_TCP_AllocRecord(void); - extern void sgIP_TCP_FreeRecord(sgIP_Record_TCP * rec); - extern int sgIP_TCP_Bind(sgIP_Record_TCP * rec, int srcport, unsigned long srcip); - extern int sgIP_TCP_Listen(sgIP_Record_TCP * rec, int maxlisten); - extern sgIP_Record_TCP * sgIP_TCP_Accept(sgIP_Record_TCP * rec); - extern int sgIP_TCP_Close(sgIP_Record_TCP * rec); - extern int sgIP_TCP_Connect(sgIP_Record_TCP * rec, unsigned long destip, int destport); - extern int sgIP_TCP_Send(sgIP_Record_TCP * rec, const char * datatosend, int datalength, int flags); - extern int sgIP_TCP_Recv(sgIP_Record_TCP * rec, char * databuf, int buflength, int flags); - -#ifdef __cplusplus -}; -#endif - - -#endif diff --git a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_UDP.c b/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_UDP.c deleted file mode 100644 index 9b4ef807cd..0000000000 --- a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_UDP.c +++ /dev/null @@ -1,245 +0,0 @@ -// DSWifi Project - sgIP Internet Protocol Stack Implementation -// Copyright (C) 2005-2006 Stephen Stair - sgstair@akkit.org - http://www.akkit.org -/****************************************************************************** -DSWifi Lib and test materials are licenced under the MIT open source licence: -Copyright (c) 2005-2006 Stephen Stair - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -******************************************************************************/ - -#include "sgIP_Hub.h" -#include "sgIP_UDP.h" -#include "sgIP_IP.h" - -sgIP_Record_UDP * udprecords; -int udpport_counter; -extern unsigned long volatile sgIP_timems; - -void sgIP_UDP_Init() { - udprecords=0; - udpport_counter=SGIP_UDP_FIRSTOUTGOINGPORT; -} - - -int sgIP_UDP_GetUnusedOutgoingPort() { - int myport,clear; - sgIP_Record_UDP * rec; - udpport_counter+=(sgIP_timems&1023); // semi-random - if(udpport_counter>SGIP_UDP_LASTOUTGOINGPORT) udpport_counter=SGIP_UDP_FIRSTOUTGOINGPORT; - while(1) { - rec = udprecords; - myport=udpport_counter++; - if(udpport_counter>SGIP_UDP_LASTOUTGOINGPORT) udpport_counter=SGIP_UDP_FIRSTOUTGOINGPORT; - clear=1; - while(rec) { - if(rec->srcport==myport) { clear=0; break; } - rec=rec->next; - } - if(clear) return myport; - } -} - -int sgIP_UDP_CalcChecksum(sgIP_memblock * mb, unsigned long srcip, unsigned long destip, int totallength) { - int checksum; - if(!mb) return 0; - if(mb->totallength&1) mb->datastart[mb->totallength]=0; - checksum=sgIP_memblock_IPChecksum(mb,0,mb->totallength); - // add in checksum of "faux header" - checksum+=(destip&0xFFFF); - checksum+=(destip>>16); - checksum+=(srcip&0xFFFF); - checksum+=(srcip>>16); - checksum+=htons(totallength); - checksum+=(17)<<8; - checksum=(checksum&0xFFFF) + (checksum>>16); - checksum=(checksum&0xFFFF) + (checksum>>16); - - checksum = (~checksum)&0xFFFF; - if(checksum==0) checksum=0xFFFF; - return checksum; -} - -int sgIP_UDP_ReceivePacket(sgIP_memblock * mb, unsigned long srcip, unsigned long destip) { - if(!mb) return 0; - int chk = sgIP_UDP_CalcChecksum(mb,srcip,destip,mb->totallength); - if(chk!=0xFFFF) { - SGIP_DEBUG_MESSAGE(("UDP receive checksum incorrect")); - sgIP_memblock_free(mb); - return 0; // checksum error - } - sgIP_Header_UDP * udp; - udp=(sgIP_Header_UDP *)mb->datastart; - sgIP_Record_UDP * rec; - sgIP_memblock *tmb; - SGIP_INTR_PROTECT(); - rec=udprecords; - - while(rec) { - if((rec->srcip==destip || rec->srcip==0) && rec->srcport==udp->destport && rec->state!=SGIP_UDP_STATE_UNUSED) break; // a match! - rec=rec->next; - } - if(!rec) { // no matching records - sgIP_memblock_free(mb); - SGIP_INTR_UNPROTECT(); - return 0; - } - // we have a record and a packet for it; add some data to the record and stuff it into the record queue. - sgIP_memblock_exposeheader(mb,4); - *((unsigned long *)mb->datastart)=srcip; // keep srcip around. - if(rec->incoming_queue==0) { - rec->incoming_queue=mb; - } else { - rec->incoming_queue_end->next=mb; - } - - tmb=mb; - while(tmb->next) tmb=tmb->next; - rec->incoming_queue_end=tmb; - // ok, data added to queue - yay! - // that means... we're done. - - SGIP_INTR_UNPROTECT(); - return 0; -} - -int sgIP_UDP_SendPacket(sgIP_Record_UDP * rec, const char * data, int datalen, unsigned long destip, int destport) { - if(!rec || !data) return SGIP_ERROR(EINVAL); - if(rec->state!=SGIP_UDP_STATE_BOUND) { - rec->srcip=0; - rec->srcport=sgIP_UDP_GetUnusedOutgoingPort(); - rec->state=SGIP_UDP_STATE_BOUND; - } - sgIP_memblock * mb = sgIP_memblock_alloc(sgIP_IP_RequiredHeaderSize()+8+datalen); - if(!mb) return SGIP_ERROR(ENOMEM); - sgIP_memblock_exposeheader(mb,-sgIP_IP_RequiredHeaderSize()); // hide IP header space for later - - SGIP_INTR_PROTECT(); - unsigned long srcip = sgIP_IP_GetLocalBindAddr(rec->srcip,destip); - sgIP_Header_UDP * udp = (sgIP_Header_UDP *) mb->datastart; - udp->srcport=rec->srcport; - udp->destport=destport; - udp->length=htons(datalen+8); - udp->checksum=0; - int i; - for(i=0;i<datalen;i++) { - mb->datastart[i+8]=data[i]; - } - udp->checksum=sgIP_UDP_CalcChecksum(mb,srcip,destip,mb->totallength); - sgIP_IP_SendViaIP(mb,17,srcip,destip); - - SGIP_INTR_UNPROTECT(); - return datalen; -} - -sgIP_Record_UDP * sgIP_UDP_AllocRecord() { - SGIP_INTR_PROTECT(); - sgIP_Record_UDP * rec; - rec = (sgIP_Record_UDP *)sgIP_malloc(sizeof(sgIP_Record_UDP)); - if(rec) { - rec->destip=0; - rec->destport=0; - rec->incoming_queue=0; - rec->incoming_queue_end=0; - rec->srcip=0; - rec->srcport=0; - rec->state=0; - rec->next=udprecords; - udprecords=rec; - } - SGIP_INTR_UNPROTECT(); - return rec; -} -void sgIP_UDP_FreeRecord(sgIP_Record_UDP * rec) { - if(!rec) return; - SGIP_INTR_PROTECT(); - sgIP_Record_UDP * t; - // incoming queue is all clumped together as a single memblock, so, time to free it all in one call :) - if(rec->incoming_queue) sgIP_memblock_free(rec->incoming_queue); // woohoo! - rec->state=0; - if(udprecords==rec) { - udprecords=rec->next; - } else { - t=udprecords; - while(t) { - if(t->next==rec) { - t->next=rec->next; - break; - } - t=t->next; - } - } - sgIP_free(rec); - - SGIP_INTR_UNPROTECT(); -} - -int sgIP_UDP_Bind(sgIP_Record_UDP * rec, int srcport, unsigned long srcip) { - if(!rec) return SGIP_ERROR(EINVAL); - SGIP_INTR_PROTECT(); - if(rec->state!=SGIP_UDP_STATE_UNUSED) { - rec->srcip=srcip; - rec->srcport=srcport; - if(rec->state==SGIP_UDP_STATE_UNBOUND) rec->state=SGIP_UDP_STATE_BOUND; - } - SGIP_INTR_UNPROTECT(); - return 0; -} - -int sgIP_UDP_RecvFrom(sgIP_Record_UDP * rec, char * destbuf, int buflength, int flags, unsigned long * sender_ip, unsigned short * sender_port) { - if(!rec || !destbuf || !sender_ip || !sender_port || buflength==0) return SGIP_ERROR(EINVAL); - SGIP_INTR_PROTECT(); - if(rec->incoming_queue==0) { - SGIP_INTR_UNPROTECT(); - return SGIP_ERROR(EWOULDBLOCK); - } - int packetlen=rec->incoming_queue->totallength-12; - if(packetlen>buflength) { - SGIP_INTR_UNPROTECT(); - return SGIP_ERROR(EMSGSIZE); - } - sgIP_memblock * mb; - *sender_ip=*((unsigned long *)rec->incoming_queue->datastart); - *sender_port=((unsigned short *)rec->incoming_queue->datastart)[2]; - int totlen,first, buf_start,i; - totlen=rec->incoming_queue->totallength; - first=12; - buf_start=0; - - while(totlen>0 && rec->incoming_queue) { - totlen-=rec->incoming_queue->thislength; - for(i=first;i<rec->incoming_queue->thislength;i++) { - destbuf[buf_start+i-first]=rec->incoming_queue->datastart[i]; - } - buf_start+=rec->incoming_queue->thislength-first; - first=0; - mb=rec->incoming_queue; - rec->incoming_queue=rec->incoming_queue->next; - mb->next=0; - sgIP_memblock_free(mb); - } - if(!(rec->incoming_queue)) rec->incoming_queue_end=0; - - SGIP_INTR_UNPROTECT(); - return buf_start; -} - -int sgIP_UDP_SendTo(sgIP_Record_UDP * rec, const char * buf, int buflength, int flags, unsigned long dest_ip, int dest_port) { - return sgIP_UDP_SendPacket(rec,buf,buflength,dest_ip,dest_port); -} - diff --git a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_UDP.h b/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_UDP.h deleted file mode 100644 index 676cd7b6d4..0000000000 --- a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_UDP.h +++ /dev/null @@ -1,81 +0,0 @@ -// DSWifi Project - sgIP Internet Protocol Stack Implementation -// Copyright (C) 2005-2006 Stephen Stair - sgstair@akkit.org - http://www.akkit.org -/****************************************************************************** -DSWifi Lib and test materials are licenced under the MIT open source licence: -Copyright (c) 2005-2006 Stephen Stair - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -******************************************************************************/ - - -#ifndef SGIP_UDP_H -#define SGIP_UDP_H - -#include "sgIP_Config.h" -#include "sgIP_memblock.h" - - -enum SGIP_UDP_STATE { - SGIP_UDP_STATE_UNBOUND, // newly allocated - SGIP_UDP_STATE_BOUND, // got a source address/port - SGIP_UDP_STATE_UNUSED, // no longer in use. -}; - - -typedef struct SGIP_HEADER_UDP { - unsigned short srcport,destport; - unsigned short length,checksum; -} sgIP_Header_UDP; - -typedef struct SGIP_RECORD_UDP { - struct SGIP_RECORD_UDP * next; - - int state; - unsigned long srcip; - unsigned long destip; - unsigned short srcport,destport; - - sgIP_memblock * incoming_queue; - sgIP_memblock * incoming_queue_end; - -} sgIP_Record_UDP; - -#ifdef __cplusplus -extern "C" { -#endif - - void sgIP_UDP_Init(void); - - int sgIP_UDP_CalcChecksum(sgIP_memblock * mb, unsigned long srcip, unsigned long destip, int totallength); - int sgIP_UDP_ReceivePacket(sgIP_memblock * mb, unsigned long srcip, unsigned long destip); - int sgIP_UDP_SendPacket(sgIP_Record_UDP * rec, const char * data, int datalen, unsigned long destip, int destport); - - sgIP_Record_UDP * sgIP_UDP_AllocRecord(void); - void sgIP_UDP_FreeRecord(sgIP_Record_UDP * rec); - - int sgIP_UDP_Bind(sgIP_Record_UDP * rec, int srcport, unsigned long srcip); - int sgIP_UDP_RecvFrom(sgIP_Record_UDP * rec, char * destbuf, int buflength, int flags, unsigned long * sender_ip, unsigned short * sender_port); - int sgIP_UDP_SendTo(sgIP_Record_UDP * rec, const char * buf, int buflength, int flags, unsigned long dest_ip, int dest_port); - -#ifdef __cplusplus -}; -#endif - - -#endif diff --git a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_memblock.c b/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_memblock.c deleted file mode 100644 index b68918033b..0000000000 --- a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_memblock.c +++ /dev/null @@ -1,295 +0,0 @@ -// DSWifi Project - sgIP Internet Protocol Stack Implementation -// Copyright (C) 2005-2006 Stephen Stair - sgstair@akkit.org - http://www.akkit.org -/****************************************************************************** -DSWifi Lib and test materials are licenced under the MIT open source licence: -Copyright (c) 2005-2006 Stephen Stair - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -******************************************************************************/ - -#include "sgIP_memblock.h" - -#include <stdlib.h> -#include <string.h> - -#ifndef SGIP_MEMBLOCK_DYNAMIC_MALLOC_ALL - -#ifndef SGIP_USEDYNAMICMEMORY -sgIP_memblock memblock_pool[SGIP_MEMBLOCK_BASENUM]; -#else -sgIP_memblock * memblock_pool; -#endif - -sgIP_memblock * memblock_poolfree; -int numused, numfree; -void * pool_link; - - -sgIP_memblock * sgIP_memblock_getunused() { - int i; - sgIP_memblock * mb; - SGIP_INTR_PROTECT(); - if(memblock_poolfree) { // we still have free memblocks! - mb=memblock_poolfree; - memblock_poolfree=mb->next; - numfree--; - numused++; - } else { // oh noes, we have no more free memblocks. - mb = 0; // eventually alloc new blocks, but for now just stop. - } - - SGIP_INTR_UNPROTECT(); - return mb; -} -#endif //SGIP_MEMBLOCK_DYNAMIC_MALLOC_ALL - -void sgIP_memblock_Init() { -#ifndef SGIP_MEMBLOCK_DYNAMIC_MALLOC_ALL - int i; -#ifdef SGIP_USEDYNAMICMEMORY - pool_link = sgIP_malloc(sizeof(sgIP_memblock)*SGIP_MEMBLOCK_BASENUM+4); - ((long *)pool_link)[0]=0; - memblock_pool = (sgIP_memblock *) (((char *)pool_link)+4); -#endif - numused=numfree=0; - memblock_poolfree=0; - for(i=0;i<SGIP_MEMBLOCK_BASENUM;i++) { - memblock_pool[i].totallength=0; - memblock_pool[i].next=memblock_poolfree; - memblock_poolfree=memblock_pool+i; - numfree++; - } -#endif //SGIP_MEMBLOCK_DYNAMIC_MALLOC_ALL -} - -#ifdef SGIP_MEMBLOCK_DYNAMIC_MALLOC_ALL - -sgIP_memblock * sgIP_memblock_allocHW(int headersize, int packetsize) { - sgIP_memblock * mb; - mb = (sgIP_memblock *) sgIP_malloc(SGIP_MEMBLOCK_HEADERSIZE+SGIP_MAXHWHEADER+packetsize); - if(!mb) return 0; - mb->totallength=headersize+packetsize; - mb->thislength=mb->totallength; - mb->datastart=mb->reserved+SGIP_MAXHWHEADER-headersize; - mb->next=0; - return mb; -} - -#else //SGIP_MEMBLOCK_DYNAMIC_MALLOC_ALL - -sgIP_memblock * sgIP_memblock_allocHW(int headersize, int packetsize) { - sgIP_memblock * mb, * tmb, *t; - int totlen; - mb = sgIP_memblock_getunused(); - if(!mb) return 0; - mb->totallength=headersize+packetsize; - mb->datastart=mb->reserved+SGIP_MAXHWHEADER-headersize; - mb->next=0; - mb->thislength=headersize+SGIP_MEMBLOCK_FIRSTINTERNALSIZE; - if(mb->thislength>=mb->totallength) { - mb->thislength = mb->totallength; -// SGIP_DEBUG_MESSAGE(("memblock_alloc: %i free, %i used",numfree,numused)); - return mb; - } else { // need more blocks - totlen=mb->thislength; - tmb=mb; - while(totlen<mb->totallength) { - t=sgIP_memblock_getunused(); - if(!t) { // we're skrewed. - sgIP_memblock_free(mb); - return 0; - } - tmb->next=t; - t->totallength=mb->totallength; - t->datastart=mb->reserved; // no header on blocks after the first. - t->next=0; - t->thislength=SGIP_MEMBLOCK_INTERNALSIZE; - if(t->thislength+totlen>=mb->totallength) { - t->thislength=mb->totallength-totlen; -// SGIP_DEBUG_MESSAGE(("memblock_alloc: %i free, %i used",numfree,numused)); - return mb; - } else { // need YET more blocks. - totlen+=t->thislength; - tmb=t; - } // the cycle contiues. - } - sgIP_memblock_free(mb); // should never get here. - } - return 0; -} -#endif //SGIP_MEMBLOCK_DYNAMIC_MALLOC_ALL - -sgIP_memblock * sgIP_memblock_alloc(int packetsize) { - return sgIP_memblock_allocHW(0,packetsize); -} - -#ifdef SGIP_MEMBLOCK_DYNAMIC_MALLOC_ALL - -void sgIP_memblock_free(sgIP_memblock * mb) { - sgIP_memblock * f; - - SGIP_INTR_PROTECT(); - while(mb) { - mb->totallength=0; - mb->thislength=0; - f=mb; - mb = mb->next; - - sgIP_free(f); - } - - SGIP_INTR_UNPROTECT(); -} - -#else //SGIP_MEMBLOCK_DYNAMIC_MALLOC_ALL - -void sgIP_memblock_free(sgIP_memblock * mb) { - sgIP_memblock * f; - - SGIP_INTR_PROTECT(); - while(mb) { - mb->totallength=0; - mb->thislength=0; - f=mb; - mb = mb->next; - - numfree++; // reinstate memblock into the pool! - numused--; - f->next=memblock_poolfree; - memblock_poolfree=f; - } -// SGIP_DEBUG_MESSAGE(("memblock_free: %i free, %i used",numfree,numused)); - - SGIP_INTR_UNPROTECT(); - -} - -#endif //SGIP_MEMBLOCK_DYNAMIC_MALLOC_ALL - -// positive to expose, negative to hide. -void sgIP_memblock_exposeheader(sgIP_memblock * mb, int change) { - if(mb) { - mb->thislength+=change; - mb->totallength+=change; - mb->datastart-=change; - while(mb->next) { - mb->next->totallength=mb->totallength; - mb=mb->next; - } - } -} -void sgIP_memblock_trimsize(sgIP_memblock * mb, int newsize) { - int lentot; - if(mb) { - mb->totallength=newsize; - lentot=0; - while(mb) { - lentot+=mb->thislength; - if(lentot>newsize) { - mb->thislength-=(lentot-newsize); - if(mb->next) sgIP_memblock_free(mb->next); - mb->next=0; - return; - } else { - mb=mb->next; - } - } - } -} - - -int sgIP_memblock_IPChecksum(sgIP_memblock * mb, int startbyte, int chksum_length) { - int chksum_temp,offset; - // check checksum - chksum_temp=0; - offset=0; - while(mb && startbyte>mb->thislength) { startbyte-=mb->thislength; mb=mb->next; } - if(!mb) return 0; - while(chksum_length) { - while(startbyte+offset+1<mb->thislength && chksum_length>1) { - chksum_temp+= ((unsigned char *)mb->datastart)[startbyte+offset] + (((unsigned char *)mb->datastart)[startbyte+offset+1]<<8); - offset+=2; - chksum_length-=2; - } - chksum_temp= (chksum_temp&0xFFFF) +(chksum_temp>>16); - if(startbyte+offset<mb->thislength && chksum_length>0) { - chksum_temp+= ((unsigned char *)mb->datastart)[startbyte+offset]; - if(chksum_length==1) break; - chksum_length--; - offset=0; - startbyte=0; - mb=mb->next; - if(!mb) break; - if(mb->thislength==0) break; - chksum_temp+= ((unsigned char *)mb->datastart)[startbyte+offset]<<8; - if(chksum_length==1) break; - offset++; - chksum_length--; - } - } - chksum_temp= (chksum_temp&0xFFFF) +(chksum_temp>>16); - chksum_temp= (chksum_temp&0xFFFF) +(chksum_temp>>16); - return chksum_temp; -} -int sgIP_memblock_CopyToLinear(sgIP_memblock * mb, void * dest_buf, int startbyte, int copy_length) { - int copylen,ofs_src, tot_copy; - ofs_src=startbyte; - while(mb && ofs_src>=mb->thislength) { ofs_src-=mb->thislength; mb=mb->next; } - if(!mb) return 0; - if(startbyte+copy_length>mb->totallength) copy_length=mb->totallength-startbyte; - if(copy_length<0) copy_length=0; - tot_copy=0; - while(copy_length>0) { - copylen=copy_length; - if(copylen>mb->thislength-ofs_src) copylen=mb->thislength-ofs_src; - memcpy(((char *)dest_buf)+tot_copy,mb->datastart+ofs_src,copylen); - copy_length-=copylen; - tot_copy+=copylen; - ofs_src=0; - mb=mb->next; - if(!mb) break; - } - return tot_copy; -} -int sgIP_memblock_CopyFromLinear(sgIP_memblock * mb, void * src_buf, int startbyte, int copy_length) { - int copylen,ofs_src, tot_copy; - ofs_src=startbyte; - while(mb && ofs_src>=mb->thislength) { ofs_src-=mb->thislength; mb=mb->next; } - if(!mb) return 0; - if(startbyte+copy_length>mb->totallength) copy_length=mb->totallength-startbyte; - if(copy_length<0) copy_length=0; - tot_copy=0; - while(copy_length>0) { - copylen=copy_length; - if(copylen>mb->thislength-ofs_src) copylen=mb->thislength-ofs_src; - memcpy(mb->datastart+ofs_src,((char *)src_buf)+tot_copy,copylen); - copy_length-=copylen; - tot_copy+=copylen; - ofs_src=0; - mb=mb->next; - if(!mb) break; - } - return tot_copy; - -} -int sgIP_memblock_CopyBlock(sgIP_memblock * mb_src, sgIP_memblock * mb_dest, int start_src, int start_dest, int copy_length) { - - return 0; -} - diff --git a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_memblock.h b/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_memblock.h deleted file mode 100644 index 85d6011364..0000000000 --- a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_memblock.h +++ /dev/null @@ -1,65 +0,0 @@ -// DSWifi Project - sgIP Internet Protocol Stack Implementation -// Copyright (C) 2005-2006 Stephen Stair - sgstair@akkit.org - http://www.akkit.org -/****************************************************************************** -DSWifi Lib and test materials are licenced under the MIT open source licence: -Copyright (c) 2005-2006 Stephen Stair - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -******************************************************************************/ - - -#ifndef SGIP_MEMBLOCK_H -#define SGIP_MEMBLOCK_H - -#include "sgIP_Config.h" - - -typedef struct SGIP_MEMBLOCK { - int totallength; - int thislength; - struct SGIP_MEMBLOCK * next; - char * datastart; - char reserved[SGIP_MEMBLOCK_DATASIZE-16]; // assume the other 4 values are 16 bytes total in length. -} sgIP_memblock; - -#define SGIP_MEMBLOCK_HEADERSIZE 16 -#define SGIP_MEMBLOCK_INTERNALSIZE (SGIP_MEMBLOCK_DATASIZE-16) -#define SGIP_MEMBLOCK_FIRSTINTERNALSIZE (SGIP_MEMBLOCK_DATASIZE-16-SGIP_MAXHWHEADER) - -#ifdef __cplusplus -extern "C" { -#endif - - extern void sgIP_memblock_Init(void); - extern sgIP_memblock * sgIP_memblock_alloc(int packetsize); - extern sgIP_memblock * sgIP_memblock_allocHW(int headersize, int packetsize); - extern void sgIP_memblock_free(sgIP_memblock * mb); - extern void sgIP_memblock_exposeheader(sgIP_memblock * mb, int change); - extern void sgIP_memblock_trimsize(sgIP_memblock * mb, int newsize); - - extern int sgIP_memblock_IPChecksum(sgIP_memblock * mb, int startbyte, int chksum_length); - extern int sgIP_memblock_CopyToLinear(sgIP_memblock * mb, void * dest_buf, int startbyte, int copy_length); - extern int sgIP_memblock_CopyFromLinear(sgIP_memblock * mb, void * src_buf, int startbyte, int copy_length); - extern int sgIP_memblock_CopyBlock(sgIP_memblock * mb_src, sgIP_memblock * mb_dest, int start_src, int start_dest, int copy_length); -#ifdef __cplusplus -}; -#endif - - -#endif diff --git a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_sockets.c b/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_sockets.c deleted file mode 100644 index 199f37a1a8..0000000000 --- a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_sockets.c +++ /dev/null @@ -1,521 +0,0 @@ -// DSWifi Project - sgIP Internet Protocol Stack Implementation -// Copyright (C) 2005-2006 Stephen Stair - sgstair@akkit.org - http://www.akkit.org -/****************************************************************************** -DSWifi Lib and test materials are licenced under the MIT open source licence: -Copyright (c) 2005-2006 Stephen Stair - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -******************************************************************************/ - -#include "sgIP_sockets.h" -#include "sgIP_TCP.h" -#include "sgIP_UDP.h" -#include "sgIP_ICMP.h" -#include "sgIP_DNS.h" - - -sgIP_socket_data socketlist[SGIP_SOCKET_MAXSOCKETS]; -extern unsigned long sgIP_timems; - - -void sgIP_sockets_Init() { - int i; - for(i=0;i<SGIP_SOCKET_MAXSOCKETS;i++) { - socketlist[i].conn_ptr=0; - socketlist[i].flags = 0; - } -} - - // spawn/kill socket for internal use ONLY. -int spawn_socket(int flags) { - int s; - SGIP_INTR_PROTECT(); - for(s=0;s<SGIP_SOCKET_MAXSOCKETS;s++) if(!(socketlist[s].flags&SGIP_SOCKET_FLAG_ACTIVE)) break; - if(s==SGIP_SOCKET_MAXSOCKETS) { - SGIP_INTR_UNPROTECT(); - return SGIP_ERROR(ENOMEM); - } - socketlist[s].flags=SGIP_SOCKET_FLAG_ACTIVE | flags; - socketlist[s].conn_ptr=0; - SGIP_INTR_UNPROTECT(); - return s+1; -} -int kill_socket(int s) { - if(s<1 || s>SGIP_SOCKET_MAXSOCKETS) return SGIP_ERROR(EINVAL); - SGIP_INTR_PROTECT(); - s--; - socketlist[s].conn_ptr=0; - socketlist[s].flags=0; - SGIP_INTR_UNPROTECT(); - return 0; -} - -int socket(int domain, int type, int protocol) { - int s; - if(domain!=AF_INET) return SGIP_ERROR(EINVAL); - if(protocol!=0) return SGIP_ERROR(EINVAL); - if(type!=SOCK_DGRAM && type!=SOCK_STREAM) return SGIP_ERROR(EINVAL); - SGIP_INTR_PROTECT(); - for(s=0;s<SGIP_SOCKET_MAXSOCKETS;s++) if(!(socketlist[s].flags&SGIP_SOCKET_FLAG_ACTIVE)) break; - if(s==SGIP_SOCKET_MAXSOCKETS) { - SGIP_INTR_UNPROTECT(); - return SGIP_ERROR(ENOMEM); - } - if(type==SOCK_STREAM) { - socketlist[s].flags=SGIP_SOCKET_FLAG_ACTIVE | SGIP_SOCKET_FLAG_TYPE_TCP; - socketlist[s].conn_ptr=sgIP_TCP_AllocRecord(); - } else if(type==SOCK_DGRAM) { - socketlist[s].flags=SGIP_SOCKET_FLAG_ACTIVE | SGIP_SOCKET_FLAG_TYPE_UDP; - socketlist[s].conn_ptr=sgIP_UDP_AllocRecord(); - } else { - SGIP_INTR_UNPROTECT(); - return SGIP_ERROR(EINVAL); - } -#ifdef SGIP_SOCKET_DEFAULT_NONBLOCK - socketlist[s].flags|=SGIP_SOCKET_FLAG_NONBLOCKING; -#endif - SGIP_INTR_UNPROTECT(); - return s+1; -} - - -int closesocket(int socket) { - if(socket<1 || socket>SGIP_SOCKET_MAXSOCKETS) return SGIP_ERROR(EINVAL); - SGIP_INTR_PROTECT(); - socket--; - if(!(socketlist[socket].flags&SGIP_SOCKET_FLAG_ACTIVE)) { SGIP_INTR_UNPROTECT(); return 0; } - if((socketlist[socket].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_TCP) { - sgIP_TCP_FreeRecord((sgIP_Record_TCP *)socketlist[socket].conn_ptr); - } else if((socketlist[socket].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_UDP) { - sgIP_UDP_FreeRecord((sgIP_Record_UDP *)socketlist[socket].conn_ptr); - } - socketlist[socket].conn_ptr=0; - socketlist[socket].flags=0; - SGIP_INTR_UNPROTECT(); - return 0; -} - -int bind(int socket, const struct sockaddr * addr, int addr_len) { - if(socket<1 || socket>SGIP_SOCKET_MAXSOCKETS) return SGIP_ERROR(EINVAL); - if(addr_len!=sizeof(struct sockaddr_in)) return SGIP_ERROR(EINVAL); - SGIP_INTR_PROTECT(); - int retval=SGIP_ERROR(EINVAL); - socket--; - if((socketlist[socket].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_TCP) { - retval=sgIP_TCP_Bind((sgIP_Record_TCP *)socketlist[socket].conn_ptr,((struct sockaddr_in *)addr)->sin_port,((struct sockaddr_in *)addr)->sin_addr.s_addr); - } else if((socketlist[socket].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_UDP) { - retval=sgIP_UDP_Bind((sgIP_Record_UDP *)socketlist[socket].conn_ptr,((struct sockaddr_in *)addr)->sin_port,((struct sockaddr_in *)addr)->sin_addr.s_addr); - } - SGIP_INTR_UNPROTECT(); - return retval; -} -int connect(int socket, const struct sockaddr * addr, int addr_len) { - if(socket<1 || socket>SGIP_SOCKET_MAXSOCKETS) return SGIP_ERROR(EINVAL); - if(addr_len!=sizeof(struct sockaddr_in)) return SGIP_ERROR(EINVAL); - SGIP_INTR_PROTECT(); - int i; - int retval=SGIP_ERROR(EINVAL); - socket--; - if((socketlist[socket].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_TCP) { - retval=sgIP_TCP_Connect((sgIP_Record_TCP *)socketlist[socket].conn_ptr,((struct sockaddr_in *)addr)->sin_addr.s_addr,((struct sockaddr_in *)addr)->sin_port); - if(retval==0) { - do { - i=((sgIP_Record_TCP *)socketlist[socket].conn_ptr)->tcpstate; - if(i==SGIP_TCP_STATE_ESTABLISHED || i==SGIP_TCP_STATE_CLOSE_WAIT) {retval=0; break;} - if(i==SGIP_TCP_STATE_CLOSED || i==SGIP_TCP_STATE_UNUSED || i==SGIP_TCP_STATE_LISTEN || i==SGIP_TCP_STATE_NODATA) - { retval=SGIP_ERROR(((sgIP_Record_TCP *)socketlist[socket].conn_ptr)->errorcode); break; } - if(socketlist[socket].flags&SGIP_SOCKET_FLAG_NONBLOCKING) break; - SGIP_INTR_UNPROTECT(); - SGIP_WAITEVENT(); - SGIP_INTR_REPROTECT(); - } while(1); - } - } - SGIP_INTR_UNPROTECT(); - return retval; -} -int send(int socket, const void * data, int sendlength, int flags) { - if(socket<1 || socket>SGIP_SOCKET_MAXSOCKETS) return -1; - SGIP_INTR_PROTECT(); - int retval=SGIP_ERROR(EINVAL); - socket--; - if((socketlist[socket].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_TCP) { - do { - retval=sgIP_TCP_Send((sgIP_Record_TCP *)socketlist[socket].conn_ptr,data,sendlength,flags); - if(retval!=-1) break; - if(errno!=EWOULDBLOCK) break; - if(socketlist[socket].flags&SGIP_SOCKET_FLAG_NONBLOCKING) break; - SGIP_INTR_UNPROTECT(); - SGIP_WAITEVENT(); - SGIP_INTR_REPROTECT(); - } while(1); - } - SGIP_INTR_UNPROTECT(); - return retval; -} -int recv(int socket, void * data, int recvlength, int flags) { - if(socket<1 || socket>SGIP_SOCKET_MAXSOCKETS) return -1; - SGIP_INTR_PROTECT(); - int retval=SGIP_ERROR(EINVAL); - socket--; - if((socketlist[socket].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_TCP) { - do { - retval=sgIP_TCP_Recv((sgIP_Record_TCP *)socketlist[socket].conn_ptr,data,recvlength,flags); - if(retval!=-1) break; - if(errno!=EWOULDBLOCK) break; - if(socketlist[socket].flags&SGIP_SOCKET_FLAG_NONBLOCKING) break; - SGIP_INTR_UNPROTECT(); - SGIP_WAITEVENT(); - SGIP_INTR_REPROTECT(); - } while(1); - } - SGIP_INTR_UNPROTECT(); - return retval; -} -int sendto(int socket, const void * data, int sendlength, int flags, const struct sockaddr * addr, int addr_len) { - if(socket<1 || socket>SGIP_SOCKET_MAXSOCKETS) return -1; - if(!addr) return -1; - SGIP_INTR_PROTECT(); - int retval=SGIP_ERROR(EINVAL); - socket--; - if((socketlist[socket].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_TCP) { - } else if((socketlist[socket].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_UDP) { - retval=sgIP_UDP_SendTo((sgIP_Record_UDP *)socketlist[socket].conn_ptr,data,sendlength,flags,((struct sockaddr_in *)addr)->sin_addr.s_addr,((struct sockaddr_in *)addr)->sin_port); - } - SGIP_INTR_UNPROTECT(); - return retval; -} -int recvfrom(int socket, void * data, int recvlength, int flags, struct sockaddr * addr, int * addr_len) { - if(socket<1 || socket>SGIP_SOCKET_MAXSOCKETS) return -1; - if(!addr) return -1; - SGIP_INTR_PROTECT(); - int retval=SGIP_ERROR(EINVAL); - socket--; - if((socketlist[socket].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_TCP) { - } else if((socketlist[socket].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_UDP) { - do { - retval=sgIP_UDP_RecvFrom((sgIP_Record_UDP *)socketlist[socket].conn_ptr,data,recvlength,flags,&(((struct sockaddr_in *)addr)->sin_addr.s_addr),&(((struct sockaddr_in *)addr)->sin_port)); - if(retval!=-1) break; - if(errno!=EWOULDBLOCK) break; - if(socketlist[socket].flags&SGIP_SOCKET_FLAG_NONBLOCKING) break; - SGIP_INTR_UNPROTECT(); // give interrupts a chance to occur. - SGIP_WAITEVENT(); // don't just try again immediately - SGIP_INTR_REPROTECT(); - } while(1); - *addr_len = sizeof(struct sockaddr_in); - } - SGIP_INTR_UNPROTECT(); - return retval; -} -int listen(int socket, int max_connections) { - if(socket<1 || socket>SGIP_SOCKET_MAXSOCKETS) return SGIP_ERROR(EINVAL); - SGIP_INTR_PROTECT(); - int retval=SGIP_ERROR(EINVAL); - socket--; - if((socketlist[socket].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_TCP) { - retval=sgIP_TCP_Listen((sgIP_Record_TCP *)socketlist[socket].conn_ptr,max_connections); - } - SGIP_INTR_UNPROTECT(); - return retval; -} -int accept(int socket, struct sockaddr * addr, int * addr_len) { - if(socket<1 || socket>SGIP_SOCKET_MAXSOCKETS || !addr || !addr_len) return SGIP_ERROR(EINVAL); - SGIP_INTR_PROTECT(); - sgIP_Record_TCP * ret; - int retval,s; - retval=SGIP_ERROR0(EINVAL); - ret=0; - socket--; - if((socketlist[socket].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_TCP) { - s=spawn_socket((socketlist[socket].flags&SGIP_SOCKET_FLAG_NONBLOCKING) | SGIP_SOCKET_FLAG_TYPE_TCP); - if(s>0) { - do { - ret=sgIP_TCP_Accept((sgIP_Record_TCP *)socketlist[socket].conn_ptr); - if(ret!=0) break; - if(errno!=EWOULDBLOCK) break; - if(socketlist[socket].flags&SGIP_SOCKET_FLAG_NONBLOCKING) break; - SGIP_INTR_UNPROTECT(); // give interrupts a chance to occur. - SGIP_WAITEVENT(); // don't just try again immediately - SGIP_INTR_REPROTECT(); - } while(1); - } - if(ret==0) { - kill_socket(s); - retval=-1; - } else { - *addr_len=sizeof(struct sockaddr_in); - ((struct sockaddr_in *)addr)->sin_family=AF_INET; - ((struct sockaddr_in *)addr)->sin_port=ret->destport; - ((struct sockaddr_in *)addr)->sin_addr.s_addr=ret->destip; - socketlist[s-1].conn_ptr=ret; - retval=s; - } - } - SGIP_INTR_UNPROTECT(); - return retval; -} -int shutdown(int socket, int shutdown_type) { - if(socket<1 || socket>SGIP_SOCKET_MAXSOCKETS) return SGIP_ERROR(EINVAL); - SGIP_INTR_PROTECT(); - int retval=SGIP_ERROR(EINVAL); - socket--; - if((socketlist[socket].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_TCP) { - retval=sgIP_TCP_Close((sgIP_Record_TCP *)socketlist[socket].conn_ptr); - } - SGIP_INTR_UNPROTECT(); - return retval; -} - -int ioctl(int socket, long cmd, void * arg) { - if(socket<1 || socket>SGIP_SOCKET_MAXSOCKETS) return SGIP_ERROR(EBADF); - socket--; - int retval,i; - retval=0; - SGIP_INTR_PROTECT(); - switch(cmd) { - case FIONBIO: - if(!arg){ - retval=SGIP_ERROR(EINVAL); - } else { - socketlist[socket].flags &= ~SGIP_SOCKET_FLAG_NONBLOCKING; - if(*((unsigned long *)arg)) socketlist[socket].flags |= SGIP_SOCKET_FLAG_NONBLOCKING; - } - break; - case FIONREAD: - if(!arg) { - retval=SGIP_ERROR(EINVAL); - } else { - if((socketlist[socket].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_TCP) { - i=((sgIP_Record_TCP *)socketlist[socket].conn_ptr)->buf_rx_out-((sgIP_Record_TCP *)socketlist[socket].conn_ptr)->buf_rx_in; - if(i<0) i+=SGIP_TCP_RECEIVEBUFFERLENGTH; - *((int *)arg)=i; - } else { - retval=SGIP_ERROR(EINVAL); - } - } - } - SGIP_INTR_UNPROTECT(); - return retval; -} - -int setsockopt(int socket, int level, int option_name, const void * data, int data_len) { - return 0; -} -int getsockopt(int socket, int level, int option_name, void * data, int * data_len) { - return 0; -} - -int getpeername(int socket, struct sockaddr *addr, int * addr_len) { - if(socket<1 || socket>SGIP_SOCKET_MAXSOCKETS) return SGIP_ERROR(EBADF); - if(!addr || !addr_len) return SGIP_ERROR(EFAULT); - if(*addr_len<sizeof(struct sockaddr_in)) return SGIP_ERROR(EFAULT); - socket--; - SGIP_INTR_PROTECT(); - if((socketlist[socket].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_TCP) { - { - struct sockaddr_in * sain = (struct sockaddr_in *)addr; - sgIP_Record_TCP * rec = (sgIP_Record_TCP *)socketlist[socket].conn_ptr; - if(rec->tcpstate!=SGIP_TCP_STATE_ESTABLISHED) { - SGIP_INTR_UNPROTECT(); - return SGIP_ERROR(ENOTCONN); - } else { - sain->sin_addr.s_addr=rec->destip; - sain->sin_family=AF_INET; - sain->sin_port=rec->destport; - *addr_len=sizeof(struct sockaddr_in); - } - } - } else { - SGIP_INTR_UNPROTECT(); - return SGIP_ERROR(EOPNOTSUPP); - } - SGIP_INTR_UNPROTECT(); - return 0; -} -int getsockname(int socket, struct sockaddr *addr, int * addr_len) { - if(socket<1 || socket>SGIP_SOCKET_MAXSOCKETS) return SGIP_ERROR(EBADF); - if(!addr || !addr_len) return SGIP_ERROR(EFAULT); - if(*addr_len<sizeof(struct sockaddr_in)) return SGIP_ERROR(EFAULT); - socket--; - SGIP_INTR_PROTECT(); - if((socketlist[socket].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_TCP) { - { - struct sockaddr_in * sain = (struct sockaddr_in *)addr; - sgIP_Record_TCP * rec = (sgIP_Record_TCP *)socketlist[socket].conn_ptr; - if(rec->tcpstate==SGIP_TCP_STATE_UNUSED || rec->tcpstate==SGIP_TCP_STATE_CLOSED) { - SGIP_INTR_UNPROTECT(); - return SGIP_ERROR(EINVAL); - } else { - sain->sin_addr.s_addr=rec->srcip; - sain->sin_family=AF_INET; - sain->sin_port=rec->srcport; - *addr_len=sizeof(struct sockaddr_in); - } - } - } else if((socketlist[socket].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_UDP) { - { - struct sockaddr_in * sain = (struct sockaddr_in *)addr; - sgIP_Record_UDP * rec = (sgIP_Record_UDP *)socketlist[socket].conn_ptr; - if(rec->state==SGIP_UDP_STATE_UNUSED) { - SGIP_INTR_UNPROTECT(); - return SGIP_ERROR(EINVAL); - } else { - sain->sin_addr.s_addr=rec->srcip; - sain->sin_family=AF_INET; - sain->sin_port=rec->srcport; - *addr_len=sizeof(struct sockaddr_in); - } - } - } else { - SGIP_INTR_UNPROTECT(); - return SGIP_ERROR(EOPNOTSUPP); - } - SGIP_INTR_UNPROTECT(); - return 0; -} - - -struct hostent * gethostbyname(const char * name) { - return (struct hostent *)sgIP_DNS_gethostbyname(name); -}; - - -extern int select(int nfds, fd_set *__restrict readfds, fd_set *__restrict writefds, - fd_set *__restrict errorfds, struct timeval *__restrict timeout) { - // 31 days = 2678400 seconds - unsigned long timeout_ms, lasttime, temp; - sgIP_Record_TCP * rec; - sgIP_Record_UDP * urec; - lasttime=sgIP_timems; - if(!timeout) timeout_ms=2678400000UL; - else { - if(timeout->tv_sec>=2678400) { - timeout_ms=2678400000UL; - } else { - timeout_ms=timeout->tv_sec*1000 + (timeout->tv_usec/1000); - } - } - SGIP_INTR_PROTECT(); - nfds=SGIP_SOCKET_MAXSOCKETS; - - int i,j,retval; - while(timeout_ms>0) { // check all fd sets - // readfds - if(readfds) { - for(i=0;i<nfds;i++) { - if(FD_ISSET(i+1,readfds)) { - if((socketlist[i].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_TCP) { - rec = (sgIP_Record_TCP *)socketlist[i].conn_ptr; - if(rec->buf_rx_in!=rec->buf_rx_out) { timeout_ms=0; break; } - } else if((socketlist[i].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_UDP) { - urec = (sgIP_Record_UDP *)socketlist[i].conn_ptr; - if(urec->incoming_queue) { timeout_ms=0; break; } - } - } - } - if(timeout_ms==0) break; - } - if(writefds) { - // writefds - for(i=0;i<nfds;i++) { - if(FD_ISSET(i+1,writefds)) { - if((socketlist[i].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_TCP) { - rec = (sgIP_Record_TCP *)socketlist[i].conn_ptr; - j=rec->buf_tx_in-1; - if(j<0) j=SGIP_TCP_TRANSMITBUFFERLENGTH-1; - if(rec->buf_tx_in!=j) { timeout_ms=0; break; } - } - } - } - if(timeout_ms==0) break; - } - // errorfds - // ignore errorfds for now. - - temp=sgIP_timems-lasttime; - if(timeout_ms<temp) timeout_ms=0; else timeout_ms -= temp; - lasttime+=temp; - SGIP_INTR_UNPROTECT(); // give interrupts a chance to occur. - SGIP_WAITEVENT(); // don't just try again immediately - SGIP_INTR_REPROTECT(); - } - // markup fd sets and return - // readfds - retval=0; - if(readfds) { - for(i=0;i<nfds;i++) { - if(FD_ISSET(i+1,readfds)) { - if((socketlist[i].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_TCP) { - rec = (sgIP_Record_TCP *)socketlist[i].conn_ptr; - if(rec->buf_rx_in==rec->buf_rx_out) { FD_CLR(i+1,readfds);} else retval++; - } else if((socketlist[i].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_UDP) { - urec = (sgIP_Record_UDP *)socketlist[i].conn_ptr; - if(!urec->incoming_queue) { FD_CLR(i+1,readfds);} else retval++; - } - } - } - } - - // writefds - if(writefds) { - for(i=0;i<nfds;i++) { - if(FD_ISSET(i+1,writefds)) { - if((socketlist[i].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_TCP) { - rec = (sgIP_Record_TCP *)socketlist[i].conn_ptr; - j=rec->buf_tx_in-1; - if(j<0) j=SGIP_TCP_TRANSMITBUFFERLENGTH-1; - if(rec->buf_tx_in==j) { FD_CLR(i+1,writefds); } else retval++; - } - } - } - } - - if(errorfds) { FD_ZERO(errorfds); } - - SGIP_INTR_UNPROTECT(); - return retval; -} - - -/* -extern void FD_CLR(int fd, fd_set * fdset) { - if(fd<1 || fd>FD_SETSIZE || !fdset) return; - fd--; - fdset->fdbits[fd>>5] &= ~(1<<(fd&31)); -} -extern int FD_ISSET(int fd, fd_set * fdset) { - if(fd<1 || fd>FD_SETSIZE || !fdset) return 0; - fd--; - return (fdset->fdbits[fd>>5] & 1<<(fd&31))?1:0; -} -extern void FD_SET(int fd, fd_set * fdset) { - if(fd<1 || fd>FD_SETSIZE || !fdset) return; - fd--; - fdset->fdbits[fd>>5] |= 1<<(fd&31); -} -extern void FD_ZERO(fd_set * fdset) { - int i; - if(!fdset) return; - for(i=0;i<(FD_SETSIZE+31)/32;i++) { - fdset->fdbits[i]=0; - } -} -*/ - - diff --git a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_sockets.h b/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_sockets.h deleted file mode 100644 index a48e2dc467..0000000000 --- a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_sockets.h +++ /dev/null @@ -1,83 +0,0 @@ -// DSWifi Project - sgIP Internet Protocol Stack Implementation -// Copyright (C) 2005-2006 Stephen Stair - sgstair@akkit.org - http://www.akkit.org -/****************************************************************************** -DSWifi Lib and test materials are licenced under the MIT open source licence: -Copyright (c) 2005-2006 Stephen Stair - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -******************************************************************************/ - -#ifndef SGIP_SOCKETS_H -#define SGIP_SOCKETS_H - -#include "sgIP_Config.h" -#include "sys/socket.h" -#include "netinet/in.h" -#include "netdb.h" - -#define SGIP_SOCKET_FLAG_ACTIVE 0x8000 -#define SGIP_SOCKET_FLAG_NONBLOCKING 0x4000 -#define SGIP_SOCKET_FLAG_TYPEMASK 0x0001 -#define SGIP_SOCKET_FLAG_TYPE_TCP 0x0001 -#define SGIP_SOCKET_FLAG_TYPE_UDP 0x0000 - -typedef struct SGIP_SOCKET_DATA { - unsigned int flags; - void * conn_ptr; -} sgIP_socket_data; - -#ifdef __cplusplus -extern "C" { -#endif - - extern void sgIP_sockets_Init(); - - // sys/socket.h - extern int socket(int domain, int type, int protocol); - extern int bind(int socket, const struct sockaddr * addr, int addr_len); - extern int connect(int socket, const struct sockaddr * addr, int addr_len); - extern int send(int socket, const void * data, int sendlength, int flags); - extern int recv(int socket, void * data, int recvlength, int flags); - extern int sendto(int socket, const void * data, int sendlength, int flags, const struct sockaddr * addr, int addr_len); - extern int recvfrom(int socket, void * data, int recvlength, int flags, struct sockaddr * addr, int * addr_len); - extern int listen(int socket, int max_connections); - extern int accept(int socket, struct sockaddr * addr, int * addr_len); - extern int shutdown(int socket, int shutdown_type); - extern int closesocket(int socket); - - extern int ioctl(int socket, long cmd, void * arg); - - extern int setsockopt(int socket, int level, int option_name, const void * data, int data_len); - extern int getsockopt(int socket, int level, int option_name, void * data, int * data_len); - - extern int getpeername(int socket, struct sockaddr *addr, int * addr_len); - extern int getsockname(int socket, struct sockaddr *addr, int * addr_len); - - // sys/time.h (actually intersects partly with libnds, so I'm letting libnds handle fd_set for the time being) - extern int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *timeout); - - // arpa/inet.h - extern unsigned long inet_addr(const char *cp); - -#ifdef __cplusplus -}; -#endif - - -#endif diff --git a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/wifi_arm9.c b/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/wifi_arm9.c deleted file mode 100644 index 970c788e7e..0000000000 --- a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/wifi_arm9.c +++ /dev/null @@ -1,996 +0,0 @@ -// DS Wifi interface code -// Copyright (C) 2005-2006 Stephen Stair - sgstair@akkit.org - http://www.akkit.org -// wifi_arm9.c - arm9 wifi support code -/****************************************************************************** -DSWifi Lib and test materials are licenced under the MIT open source licence: -Copyright (c) 2005-2006 Stephen Stair - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -******************************************************************************/ - -#include <unistd.h> - -#include <nds.h> -#include "dsregs.h" - -#include "wifi_arm9.h" -#include <stdarg.h> -#include <stdlib.h> -#include <sys/socket.h> - - - - - - - - - -#ifdef WIFI_USE_TCP_SGIP - -#include "sgIP.h" - - -sgIP_Hub_HWInterface * wifi_hw; - - -int sgIP_DisableInterrupts() { - int a; - a=REG_IME; - REG_IME=0; - return a; -} -void sgIP_RestoreInterrupts(int old_ime) { - REG_IME=old_ime; -} - -void sgIP_IntrWaitEvent() { - // __asm__ ( ".ARM\n swi 0x060000\n" ); - int i,j; - j=0; - for(i=0;i<20000;i++) { - j+=i; - } -} - -void * sgIP_malloc(int size) __attribute__((weak)); -void sgIP_free(void * ptr) __attribute__((weak)); - - - -////////////////////////////////////////////////////////////////////////// -// wifi heap allocator system - -#define WHEAP_RECORD_FLAG_INUSE 0 -#define WHEAP_RECORD_FLAG_UNUSED 1 -#define WHEAP_RECORD_FLAG_FREED 2 - -typedef struct WHEAP_RECORD { - struct WHEAP_RECORD * next; - unsigned short flags, unused; - int size; -} wHeapRecord; - -#ifdef SGIP_DEBUG -#define WHEAP_FILL_START 0xAA -#define WHEAP_FILL_END 0xBB -#define WHEAP_PAD_START 4 -#define WHEAP_PAD_END 4 -#define WHEAP_DO_PAD -#else -#define WHEAP_PAD_START 0 -#define WHEAP_PAD_END 0 -#undef WHEAP_DO_PAD -#endif -#define WHEAP_RECORD_SIZE (sizeof(wHeapRecord)) -#define WHEAP_PAD_SIZE ((WHEAP_PAD_START)+(WHEAP_PAD_END)) -#define WHEAP_SIZE_CUTOFF ((WHEAP_RECORD_SIZE)+64) - - -int wHeapsize; -wHeapRecord * wHeapStart; // start of heap -wHeapRecord * wHeapFirst; // first free block -void wHeapAllocInit(int size) { - wHeapStart=(wHeapRecord *)malloc(size); - wHeapFirst=wHeapStart; - wHeapStart->flags=WHEAP_RECORD_FLAG_UNUSED; - wHeapStart->next=0; - wHeapStart->size=size-sizeof(wHeapRecord); -} - - -void * wHeapAlloc(int size) { - wHeapRecord * rec = wHeapFirst; - void * voidptr; - int n; - size=(size+3)&(~3); - if(size==0) size=4; - size+=WHEAP_PAD_SIZE; - if(!rec) { SGIP_DEBUG_MESSAGE(("wHeapAlloc: heap full!")); return 0; } // should not happen given normal use. - while(rec->size<size) { - if(!rec->next) { SGIP_DEBUG_MESSAGE(("wHeapAlloc: heap too full!")); return 0; } // cannot alloc - if(rec->next->flags!=WHEAP_RECORD_FLAG_INUSE) { // try to merge with next one - rec->size+=rec->next->size+WHEAP_RECORD_SIZE; - rec->next=rec->next->next; - } else { // skip ahead to more friendly waters - rec=rec->next; - while(rec->next) { - if(rec->flags!=WHEAP_RECORD_FLAG_INUSE) break; - rec=rec->next; - } - if(rec->flags==WHEAP_RECORD_FLAG_INUSE) { SGIP_DEBUG_MESSAGE(("wHeapAlloc: heap too full!")); return 0; } // no empty slots :( - } - } - rec->flags=WHEAP_RECORD_FLAG_INUSE; - n=rec->size-size; - voidptr = ((char *)rec)+WHEAP_RECORD_SIZE+WHEAP_PAD_START; - if(n<WHEAP_SIZE_CUTOFF) { // pad to include unused portion - rec->unused=n; - } else { // chop block into 2 - wHeapRecord * rec2; - rec2=(wHeapRecord *)(((char *)rec)+WHEAP_RECORD_SIZE+size); - rec2->flags=WHEAP_RECORD_FLAG_UNUSED; - rec2->size=rec->size-size-WHEAP_RECORD_SIZE; - rec->size=size; - rec2->next=rec->next; - rec->next=rec2; - rec->unused=0; - } - if(rec==wHeapFirst) { - while(wHeapFirst->next && wHeapFirst->flags==WHEAP_RECORD_FLAG_INUSE) wHeapFirst=wHeapFirst->next; - if(wHeapFirst->flags==WHEAP_RECORD_FLAG_INUSE) wHeapFirst=0; - } -#ifdef WHEAP_DO_PAD - { - int i; - for(i=0;i<WHEAP_PAD_START;i++) { - (((unsigned char *)rec)+WHEAP_RECORD_SIZE)[i]=WHEAP_FILL_START; - } - for(i=0;i<WHEAP_PAD_END;i++) { - (((unsigned char *)rec)+WHEAP_RECORD_SIZE+size-WHEAP_PAD_END)[i]=WHEAP_FILL_END; - } - } -#endif - return voidptr; -} - -void wHeapFree(void * data) { - wHeapRecord * rec = (wHeapRecord *)(((char *)data)-WHEAP_RECORD_SIZE-WHEAP_PAD_START); -#ifdef WHEAP_DO_PAD - { - int size=rec->size-rec->unused; - int i; - for(i=0;i<WHEAP_PAD_START;i++) { - if((((unsigned char *)rec)+WHEAP_RECORD_SIZE)[i]!=WHEAP_FILL_START) break; - } - if(i!=WHEAP_PAD_START) { // note heap error - SGIP_DEBUG_MESSAGE(("wHeapFree: Corruption found before allocated data! 0x%X",data)); - } - for(i=0;i<WHEAP_PAD_END;i++) { - if((((unsigned char *)rec)+WHEAP_RECORD_SIZE+size-WHEAP_PAD_END)[i]!=WHEAP_FILL_END) break; - } - if(i!=WHEAP_PAD_END) { // note heap error - SGIP_DEBUG_MESSAGE(("wHeapFree: Corruption found after allocated data! 0x%x",data)); - } - } -#endif - if(rec->flags!=WHEAP_RECORD_FLAG_INUSE) { // note heap error - SGIP_DEBUG_MESSAGE(("wHeapFree: Data already freed! 0x%X",data)); - } - rec->flags=WHEAP_RECORD_FLAG_FREED; - if(rec<wHeapFirst || !wHeapFirst) wHeapFirst=rec; // reposition the "starting" pointer. -} - - -////////////////////////////////////////////////////////////////////////// - - - - - -void * sgIP_malloc(int size) { return wHeapAlloc(size); } -void sgIP_free(void * ptr) { wHeapFree(ptr); } - - -#endif - - - - - -void ethhdr_print(char f, void * d) { - char buffer[33]; - int i; - int t,c; - buffer[0]=f; - buffer[1]=':'; - buffer[14]=' '; - buffer[27]=' '; - buffer[32]=0; - for(i=0;i<6;i++) { - t=((u8 *)d)[i]; - c=t&15; - if(c>9) c+='A'-10; else c+='0'; - buffer[3+i*2]=c; - c=(t>>4)&15; - if(c>9) c+='A'-10; else c+='0'; - buffer[2+i*2]=c; - - t=((u8 *)d)[i+6]; - c=t&15; - if(c>9) c+='A'-10; else c+='0'; - buffer[16+i*2]=c; - c=(t>>4)&15; - if(c>9) c+='A'-10; else c+='0'; - buffer[15+i*2]=c; - } - for(i=0;i<2;i++) { - t=((u8 *)d)[i+12]; - c=t&15; - if(c>9) c+='A'-10; else c+='0'; - buffer[29+i*2]=c; - c=(t>>4)&15; - if(c>9) c+='A'-10; else c+='0'; - buffer[28+i*2]=c; - } - SGIP_DEBUG_MESSAGE((buffer)); -} - - - - -Wifi_MainStruct Wifi_Data_Struct; - -volatile Wifi_MainStruct * WifiData = 0; - -WifiPacketHandler packethandler = 0; -WifiSyncHandler synchandler = 0; - -void erasemem(void * mem, int length) { - int i; - char * m = (char *)mem; - for(i=0;i<length;i++) - m[i]=0; -} - -void Wifi_CopyMacAddr(volatile void * dest, volatile void * src) { - ((u16 *)dest)[0]=((u16 *)src)[0]; - ((u16 *)dest)[1]=((u16 *)src)[1]; - ((u16 *)dest)[2]=((u16 *)src)[2]; -} - -int Wifi_CmpMacAddr(volatile void * mac1,volatile void * mac2) { - return (((u16 *)mac1)[0]==((u16 *)mac2)[0]) && (((u16 *)mac1)[1]==((u16 *)mac2)[1]) && (((u16 *)mac1)[2]==((u16 *)mac2)[2]); -} - - - -u32 Wifi_TxBufferWordsAvailable(void) { - s32 size=WifiData->txbufIn-WifiData->txbufOut-1; - if(size<0) size += WIFI_TXBUFFER_SIZE/2; - return size; -} -void Wifi_TxBufferWrite(s32 start, s32 len, u16 * data) { - int writelen; - while(len>0) { - writelen=len; - if(writelen>(WIFI_TXBUFFER_SIZE/2)-start) writelen=(WIFI_TXBUFFER_SIZE/2)-start; - len-=writelen; - while(writelen) { - WifiData->txbufData[start++]=*(data++); - writelen--; - } - start=0; - } -} - -int Wifi_RxRawReadPacket(s32 packetID, s32 readlength, u16 * data) { - int readlen,read_data; - readlength= (readlength+1)/2; - read_data=0; - while(readlength>0) { - readlen=readlength; - if(readlen>(WIFI_RXBUFFER_SIZE/2)-packetID) readlen=(WIFI_RXBUFFER_SIZE/2)-packetID; - readlength-=readlen; - read_data+=readlen; - while(readlen>0) { - *(data++) = WifiData->rxbufData[packetID++]; - readlen--; - } - packetID=0; - } - return read_data; -} - -u16 Wifi_RxReadOffset(s32 base, s32 offset) { - base+=offset; - if(base>=(WIFI_RXBUFFER_SIZE/2)) base -= (WIFI_RXBUFFER_SIZE/2); - return WifiData->rxbufData[base]; -} - -// datalen = size of packet from beginning of 802.11 header to end, but not including CRC. -int Wifi_RawTxFrame(u16 datalen, u16 rate, u16 * data) { - Wifi_TxHeader txh; - int sizeneeded; - int base; - sizeneeded=((datalen+12+4+3)/4)*2; - if(sizeneeded>Wifi_TxBufferWordsAvailable()) {WifiData->stats[WSTAT_TXQUEUEDREJECTED]++; return -1; } - txh.tx_rate=rate; - txh.tx_length=datalen+4; - base = WifiData->txbufOut; - Wifi_TxBufferWrite(base,6,(u16 *)&txh); - base += 6; - if(base>=(WIFI_TXBUFFER_SIZE/2)) base -= WIFI_TXBUFFER_SIZE/2; - Wifi_TxBufferWrite(base,((datalen+3)/4)*2,data); - base += ((datalen+3)/4)*2; - if(base>=(WIFI_TXBUFFER_SIZE/2)) base -= WIFI_TXBUFFER_SIZE/2; - WifiData->txbufOut=base; - WifiData->stats[WSTAT_TXQUEUEDPACKETS]++; - WifiData->stats[WSTAT_TXQUEUEDBYTES]+=sizeneeded; - if(synchandler) synchandler(); - return 0; -} - - -void Wifi_RawSetPacketHandler(WifiPacketHandler wphfunc) { - packethandler=wphfunc; -} -void Wifi_SetSyncHandler(WifiSyncHandler wshfunc) { - synchandler=wshfunc; -} - -void Wifi_DisableWifi(void) { - WifiData->reqMode=WIFIMODE_DISABLED; - WifiData->reqReqFlags &= ~WFLAG_REQ_APCONNECT; -} -void Wifi_EnableWifi(void) { - WifiData->reqMode=WIFIMODE_NORMAL; - WifiData->reqReqFlags &= ~WFLAG_REQ_APCONNECT; -} -void Wifi_SetPromiscuousMode(int enable) { - if(enable) WifiData->reqReqFlags |= WFLAG_REQ_PROMISC; - else WifiData->reqReqFlags &= ~WFLAG_REQ_PROMISC; -} - -void Wifi_ScanMode(void) { - WifiData->reqMode=WIFIMODE_SCAN; - WifiData->reqReqFlags &= ~WFLAG_REQ_APCONNECT; -} -void Wifi_SetChannel(int channel) { - if(channel<1 || channel>13) return; - if(WifiData->reqMode==WIFIMODE_NORMAL || WifiData->reqMode==WIFIMODE_SCAN) { - WifiData->reqChannel=channel; - } -} - - -int Wifi_GetNumAP(void) { - int i,j; - j=0; - for(i=0;i<WIFI_MAX_AP;i++) if(WifiData->aplist[i].flags&WFLAG_APDATA_ACTIVE) j++; - return j; -} - -int Wifi_GetAPData(int apnum, Wifi_AccessPoint * apdata) { - int i,j; - if(!apdata) return WIFI_RETURN_PARAMERROR; - j=0; - for(i=0;i<WIFI_MAX_AP;i++){ - if(WifiData->aplist[i].flags&WFLAG_APDATA_ACTIVE) { - if(j==apnum) { - while(Spinlock_Acquire(WifiData->aplist[i])!=SPINLOCK_OK); - { - // additionally calculate average RSSI here - WifiData->aplist[i].rssi=0; - for(j=0;j<8;j++) { - WifiData->aplist[i].rssi+=WifiData->aplist[i].rssi_past[j]; - } - WifiData->aplist[i].rssi = WifiData->aplist[i].rssi >> 3; - *apdata = WifiData->aplist[i]; // yay for struct copy! - Spinlock_Release(WifiData->aplist[i]); - return WIFI_RETURN_OK; - } - } - j++; - } - } - return WIFI_RETURN_ERROR; -} - -int Wifi_FindMatchingAP(int numaps, Wifi_AccessPoint * apdata, Wifi_AccessPoint * match_dest) { - int ap_match,i,j,n; - Wifi_AccessPoint ap; - u16 macaddrzero[3] = {0,0,0}; // check for empty mac addr - ap_match=-1; - for(i=0;i<Wifi_GetNumAP();i++){ - Wifi_GetAPData(i,&ap); - for(j=0;j<numaps;j++) { - if(apdata[j].ssid_len>32 || ((signed char)apdata[j].ssid_len)<0) continue; - if(apdata[j].ssid_len>0) { // compare SSIDs - if(apdata[j].ssid_len!=ap.ssid_len) continue; - for(n=0;n<apdata[j].ssid_len;n++) { - if(apdata[j].ssid[n]!=ap.ssid[n]) break; - } - if(n!=apdata[j].ssid_len) continue; - } - if(!Wifi_CmpMacAddr(apdata[j].macaddr,macaddrzero)) { // compare mac addr - if(!Wifi_CmpMacAddr(apdata[j].macaddr,ap.macaddr)) continue; - } - if(apdata[j].channel!=0) { // compare channels - if(apdata[j].channel!=ap.channel) continue; - } - if(j<ap_match || ap_match==-1) { - ap_match=j; - if(match_dest) *match_dest = ap; - } - if(ap_match==0) return ap_match; - } - } - return ap_match; -} - -int wifi_connect_state = 0; // -1==error, 0==searching, 1==associating, 2==dhcp'ing, 3==done, 4=searching wfc data -Wifi_AccessPoint wifi_connect_point; -int Wifi_ConnectAP(Wifi_AccessPoint * apdata, int wepmode, int wepkeyid, u8 * wepkey) { - int i; - Wifi_AccessPoint ap; - wifi_connect_state=-1; - if(!apdata) return -1; - if(((signed char)apdata->ssid_len)<0 || apdata->ssid_len>32) return -1; - - Wifi_DisconnectAP(); - - wifi_connect_state=0; - WifiData->wepmode9=wepmode; // copy data - WifiData->wepkeyid9=wepkeyid; - for(i=0;i<20;i++) { - WifiData->wepkey9[i]=wepkey[i]; - } - - - i=Wifi_FindMatchingAP(1,apdata,&ap); - if(i==0) { - Wifi_CopyMacAddr(WifiData->bssid9, ap.bssid); - Wifi_CopyMacAddr(WifiData->apmac9, ap.bssid); - WifiData->ssid9[0]=ap.ssid_len; - for(i=0;i<32;i++) { - WifiData->ssid9[i+1]=ap.ssid[i]; - } - WifiData->apchannel9=ap.channel; - for(i=0;i<16;i++) WifiData->baserates9[i]=ap.base_rates[i]; - WifiData->reqMode=WIFIMODE_NORMAL; - WifiData->reqReqFlags |= WFLAG_REQ_APCONNECT | WFLAG_REQ_APCOPYVALUES; - wifi_connect_state=1; - } else { - WifiData->reqMode=WIFIMODE_SCAN; - wifi_connect_point = *apdata; - } - return 0; -} -void Wifi_AutoConnect(void) { - if(!(WifiData->wfc_enable[0]&0x80)) { - wifi_connect_state=ASSOCSTATUS_CANNOTCONNECT; - } else { - wifi_connect_state=4; - WifiData->reqMode=WIFIMODE_SCAN; - } -} - -static -void sgIP_DNS_Record_Localhost(void) -{ - sgIP_DNS_Record *rec; - const unsigned char * resdata_c = (unsigned char *)&(wifi_hw->ipaddr); - rec = sgIP_DNS_GetUnusedRecord(); - rec->flags=SGIP_DNS_FLAG_ACTIVE | SGIP_DNS_FLAG_BUSY; - - rec->addrlen = 4; - rec->numalias = 1; - gethostname(rec->aliases[0], 256); - gethostname(rec->name, 256); - rec->numaddr = 1; - rec->addrdata[0] = resdata_c[0]; - rec->addrdata[1] = resdata_c[1]; - rec->addrdata[2] = resdata_c[2]; - rec->addrdata[3] = resdata_c[3]; - rec->addrclass = AF_INET; - rec->TTL = 0; - - rec->flags=SGIP_DNS_FLAG_ACTIVE | SGIP_DNS_FLAG_BUSY|SGIP_DNS_FLAG_RESOLVED; -} - -int Wifi_AssocStatus(void) { - switch(wifi_connect_state) { - case -1: // error - return ASSOCSTATUS_CANNOTCONNECT; - case 0: // searching - { - int i; - Wifi_AccessPoint ap; - i=Wifi_FindMatchingAP(1,&wifi_connect_point,&ap); - if(i==0) { - Wifi_CopyMacAddr(WifiData->bssid9, ap.bssid); - Wifi_CopyMacAddr(WifiData->apmac9, ap.bssid); - WifiData->ssid9[0]=ap.ssid_len; - for(i=0;i<32;i++) { - WifiData->ssid9[i+1]=ap.ssid[i]; - } - WifiData->apchannel9=ap.channel; - for(i=0;i<16;i++) WifiData->baserates9[i]=ap.base_rates[i]; - WifiData->reqMode=WIFIMODE_NORMAL; - WifiData->reqReqFlags |= WFLAG_REQ_APCONNECT | WFLAG_REQ_APCOPYVALUES; - wifi_connect_state=1; - } - } - return ASSOCSTATUS_SEARCHING; - case 1: // associating - switch(WifiData->curMode) { - case WIFIMODE_DISABLED: - case WIFIMODE_NORMAL: - case WIFIMODE_DISASSOCIATE: - return ASSOCSTATUS_DISCONNECTED; - case WIFIMODE_SCAN: - if(WifiData->reqReqFlags&WFLAG_REQ_APCONNECT) return ASSOCSTATUS_AUTHENTICATING; - return ASSOCSTATUS_DISCONNECTED; - case WIFIMODE_ASSOCIATE: - switch(WifiData->authlevel) { - case WIFI_AUTHLEVEL_DISCONNECTED: - return ASSOCSTATUS_AUTHENTICATING; - case WIFI_AUTHLEVEL_AUTHENTICATED: - case WIFI_AUTHLEVEL_DEASSOCIATED: - return ASSOCSTATUS_ASSOCIATING; - case WIFI_AUTHLEVEL_ASSOCIATED: -#ifdef WIFI_USE_TCP_SGIP - if(wifi_hw) { - if(!(wifi_hw->ipaddr)) { - sgIP_DHCP_Start(wifi_hw,wifi_hw->dns[0]==0); - wifi_connect_state=2; - return ASSOCSTATUS_ACQUIRINGDHCP; - } - } - sgIP_ARP_SendGratARP(wifi_hw); -#endif - wifi_connect_state=3; - WifiData->flags9|=WFLAG_ARM9_NETREADY; - return ASSOCSTATUS_ASSOCIATED; - } - break; - case WIFIMODE_ASSOCIATED: -#ifdef WIFI_USE_TCP_SGIP - if(wifi_hw) { - if(!(wifi_hw->ipaddr)) { - sgIP_DHCP_Start(wifi_hw,wifi_hw->dns[0]==0); - wifi_connect_state=2; - return ASSOCSTATUS_ACQUIRINGDHCP; - } - } - sgIP_ARP_SendGratARP(wifi_hw); -#endif - wifi_connect_state=3; - WifiData->flags9|=WFLAG_ARM9_NETREADY; - return ASSOCSTATUS_ASSOCIATED; - case WIFIMODE_CANNOTASSOCIATE: - return ASSOCSTATUS_CANNOTCONNECT; - } - return ASSOCSTATUS_DISCONNECTED; - case 2: // dhcp'ing -#ifdef WIFI_USE_TCP_SGIP - { - int i; - i=sgIP_DHCP_Update(); - if(i!=SGIP_DHCP_STATUS_WORKING) { - switch(i) { - case SGIP_DHCP_STATUS_SUCCESS: - wifi_connect_state=3; - WifiData->flags9|=WFLAG_ARM9_NETREADY; - sgIP_ARP_SendGratARP(wifi_hw); - sgIP_DNS_Record_Localhost(); - return ASSOCSTATUS_ASSOCIATED; - default: - case SGIP_DHCP_STATUS_IDLE: - case SGIP_DHCP_STATUS_FAILED: - Wifi_DisconnectAP(); - wifi_connect_state=-1; - return ASSOCSTATUS_CANNOTCONNECT; - - } - } - } -#else - // should never get here (dhcp state) without sgIP! - Wifi_DisconnectAP(); - wifi_connect_state=-1; - return ASSOCSTATUS_CANNOTCONNECT; -#endif - return ASSOCSTATUS_ACQUIRINGDHCP; - case 3: // connected! - return ASSOCSTATUS_ASSOCIATED; - case 4: // search nintendo WFC data for a suitable AP - { - int n,i; - for(n=0;n<3;n++) if(!(WifiData->wfc_enable[n]&0x80)) break; - Wifi_AccessPoint ap; - n=Wifi_FindMatchingAP(n,WifiData->wfc_ap,&ap); - if(n!=-1) { -#ifdef WIFI_USE_TCP_SGIP - Wifi_SetIP(WifiData->wfc_config[n][0],WifiData->wfc_config[n][1],WifiData->wfc_config[n][2],WifiData->wfc_config[n][3],WifiData->wfc_config[n][4]); -#endif - WifiData->wepmode9=WifiData->wfc_enable[n]&0x03; // copy data - WifiData->wepkeyid9=(WifiData->wfc_enable[n]>>4)&7; - for(i=0;i<16;i++) { - WifiData->wepkey9[i]=WifiData->wfc_wepkey[n][i]; - } - - Wifi_CopyMacAddr(WifiData->bssid9, ap.bssid); - Wifi_CopyMacAddr(WifiData->apmac9, ap.bssid); - WifiData->ssid9[0]=ap.ssid_len; - for(i=0;i<32;i++) { - WifiData->ssid9[i+1]=ap.ssid[i]; - } - WifiData->apchannel9=ap.channel; - for(i=0;i<16;i++) WifiData->baserates9[i]=ap.base_rates[i]; - WifiData->reqMode=WIFIMODE_NORMAL; - WifiData->reqReqFlags |= WFLAG_REQ_APCONNECT | WFLAG_REQ_APCOPYVALUES; - wifi_connect_state=1; - return ASSOCSTATUS_SEARCHING; - - } - - } - return ASSOCSTATUS_SEARCHING; - } - return ASSOCSTATUS_CANNOTCONNECT; -} - - -int Wifi_DisconnectAP() { - WifiData->reqMode=WIFIMODE_NORMAL; - WifiData->reqReqFlags &= ~WFLAG_REQ_APCONNECT; - WifiData->flags9&=~WFLAG_ARM9_NETREADY; - - wifi_connect_state=-1; - return 0; -} - - -#ifdef WIFI_USE_TCP_SGIP - - - -int Wifi_TransmitFunction(sgIP_Hub_HWInterface * hw, sgIP_memblock * mb) { - // convert ethernet frame into wireless frame and output. - // ethernet header: 6byte dest, 6byte src, 2byte protocol_id - // assumes individual pbuf len is >=14 bytes, it's pretty likely ;) - also hopes pbuf len is a multiple of 2 :| - int base,framelen, hdrlen, writelen; - int copytotal, copyexpect; - u16 framehdr[6+12+2]; - sgIP_memblock * t; - framelen=mb->totallength-14+8 + (WifiData->wepmode7?4:0); - - if(!(WifiData->flags9&WFLAG_ARM9_NETUP)) { - SGIP_DEBUG_MESSAGE(("Transmit:err_netdown")); - sgIP_memblock_free(mb); - return 0; //? - } - if(framelen+40>Wifi_TxBufferWordsAvailable()*2) { // error, can't send this much! - SGIP_DEBUG_MESSAGE(("Transmit:err_space")); - sgIP_memblock_free(mb); - return 0; //? - } - - ethhdr_print('T',mb->datastart); - framehdr[0]=0; - framehdr[1]=0; - framehdr[2]=0; - framehdr[3]=0; - framehdr[4]=0; // rate, will be filled in by the arm7. - hdrlen=18; - framehdr[7]=0; - - if(WifiData->curReqFlags&WFLAG_REQ_APADHOC) { // adhoc mode - framehdr[6]=0x0008; - Wifi_CopyMacAddr(framehdr+14,WifiData->bssid7); - Wifi_CopyMacAddr(framehdr+11,WifiData->MacAddr); - Wifi_CopyMacAddr(framehdr+8,((u8 *)mb->datastart)); - } else { - framehdr[6]=0x0108; - Wifi_CopyMacAddr(framehdr+8,WifiData->bssid7); - Wifi_CopyMacAddr(framehdr+11,WifiData->MacAddr); - Wifi_CopyMacAddr(framehdr+14,((u8 *)mb->datastart)); - } - if(WifiData->wepmode7) { framehdr[6] |=0x4000; hdrlen=20; } - framehdr[17] = 0; - framehdr[18] = 0; // wep IV, will be filled in if needed on the arm7 side. - framehdr[19] = 0; - - framehdr[5]=framelen+hdrlen*2-12+4; - copyexpect= ((framelen+hdrlen*2-12+4) +12 -4 +1)/2; - copytotal=0; - - WifiData->stats[WSTAT_TXQUEUEDPACKETS]++; - WifiData->stats[WSTAT_TXQUEUEDBYTES]+=framelen+hdrlen*2; - - base = WifiData->txbufOut; - Wifi_TxBufferWrite(base,hdrlen,framehdr); - base += hdrlen; - copytotal+=hdrlen; - if(base>=(WIFI_TXBUFFER_SIZE/2)) base -= WIFI_TXBUFFER_SIZE/2; - - // add LLC header - framehdr[0]=0xAAAA; - framehdr[1]=0x0003; - framehdr[2]=0x0000; - framehdr[3]=((u16 *)mb->datastart)[6]; // frame type - - Wifi_TxBufferWrite(base,4,framehdr); - base += 4; - copytotal+=4; - if(base>=(WIFI_TXBUFFER_SIZE/2)) base -= WIFI_TXBUFFER_SIZE/2; - - t=mb; - writelen=(mb->thislength-14); - if(writelen) { - Wifi_TxBufferWrite(base,(writelen+1)/2,((u16 *)mb->datastart)+7); - base+=(writelen+1)/2; - copytotal+=(writelen+1)/2; - if(base>=(WIFI_TXBUFFER_SIZE/2)) base -= WIFI_TXBUFFER_SIZE/2; - } - while(mb->next) { - mb=mb->next; - writelen=mb->thislength; - Wifi_TxBufferWrite(base,(writelen+1)/2,((u16 *)mb->datastart)); - base+=(writelen+1)/2; - copytotal+=(writelen+1)/2; - if(base>=(WIFI_TXBUFFER_SIZE/2)) base -= WIFI_TXBUFFER_SIZE/2; - } - if(WifiData->wepmode7) { // add required extra bytes - base+=2; - copytotal+=2; - if(base>=(WIFI_TXBUFFER_SIZE/2)) base -= WIFI_TXBUFFER_SIZE/2; - } - WifiData->txbufOut=base; // update fifo out pos, done sending packet. - - sgIP_memblock_free(t); // free packet, as we're the last stop on this chain. - - if(copytotal!=copyexpect) { - SGIP_DEBUG_MESSAGE(("Tx exp:%i que:%i",copyexpect,copytotal)); - } - if(synchandler) synchandler(); - return 0; -} - -int Wifi_Interface_Init(sgIP_Hub_HWInterface * hw) { - hw->MTU=2300; - hw->ipaddr=(192)|(168<<8)|(1<<16)|(151<<24); - hw->snmask=0x00FFFFFF; - hw->gateway=(192)|(168<<8)|(1<<16)|(1<<24); - hw->dns[0]=(192)|(168<<8)|(1<<16)|(1<<24); - hw->hwaddrlen=6; - Wifi_CopyMacAddr(hw->hwaddr,WifiData->MacAddr); - hw->userdata=0; - return 0; -} - -void Wifi_Timer(int num_ms) { - Wifi_Update(); - sgIP_Timer(num_ms); -} - -#endif - -unsigned long Wifi_Init(int initflags) { - erasemem(&Wifi_Data_Struct,sizeof(Wifi_Data_Struct)); - DC_FlushAll(); - WifiData = (Wifi_MainStruct *) (((u32)&Wifi_Data_Struct)| 0x00400000); // should prevent the cache from eating us alive. - -#ifdef WIFI_USE_TCP_SGIP - switch(initflags & WIFIINIT_OPTION_HEAPMASK) { - case WIFIINIT_OPTION_USEHEAP_128: - wHeapAllocInit(128*1024); - break; - case WIFIINIT_OPTION_USEHEAP_64: - wHeapAllocInit(64*1024); - break; - case WIFIINIT_OPTION_USEHEAP_256: - wHeapAllocInit(256*1024); - break; - case WIFIINIT_OPTION_USEHEAP_512: - wHeapAllocInit(512*1024); - break; - case WIFIINIT_OPTION_USECUSTOMALLOC: - break; - } - sgIP_Init(); - -#endif - - WifiData->flags9 = WFLAG_ARM9_ACTIVE | (initflags & WFLAG_ARM9_INITFLAGMASK) ; - return (u32) &Wifi_Data_Struct; -} - -int Wifi_CheckInit(void) { - if(!WifiData) return 0; - return ((WifiData->flags7 & WFLAG_ARM7_ACTIVE) && (WifiData->flags9 & WFLAG_ARM9_ARM7READY)); -} - - -void Wifi_Update(void) { - int cnt; - int base, base2, len, fulllen; - if(!WifiData) return; - -#ifdef WIFI_USE_TCP_SGIP - - if(!(WifiData->flags9&WFLAG_ARM9_ARM7READY)) { - if(WifiData->flags7 & WFLAG_ARM7_ACTIVE) { - WifiData->flags9 |=WFLAG_ARM9_ARM7READY; - // add network interface. - wifi_hw = sgIP_Hub_AddHardwareInterface(&Wifi_TransmitFunction,&Wifi_Interface_Init); - sgIP_timems=WifiData->random; //hacky! but it should work just fine :) - } - } - if(WifiData->authlevel!=WIFI_AUTHLEVEL_ASSOCIATED && WifiData->flags9&WFLAG_ARM9_NETUP) { - WifiData->flags9 &= ~(WFLAG_ARM9_NETUP); - } else if(WifiData->authlevel==WIFI_AUTHLEVEL_ASSOCIATED && !(WifiData->flags9&WFLAG_ARM9_NETUP)) { - WifiData->flags9 |= (WFLAG_ARM9_NETUP); - } - -#endif - - // check for received packets, forward to whatever wants them. - cnt=0; - while(WifiData->rxbufIn!=WifiData->rxbufOut) { - base = WifiData->rxbufIn; - len=Wifi_RxReadOffset(base,4); - fulllen=((len+3)&(~3))+12; -#ifdef WIFI_USE_TCP_SGIP - // Do lwIP interfacing for rx here - if((Wifi_RxReadOffset(base,6)&0x01CF)==0x0008) // if it is a non-null data packet coming from the AP (toDS==0) - { - u16 framehdr[6+12+2+4]; - sgIP_memblock * mb; - int hdrlen; - base2=base; - Wifi_RxRawReadPacket(base,22*2,framehdr); - - // ethhdr_print('!',framehdr+8); - if((framehdr[8]==((u16 *)WifiData->MacAddr)[0] && framehdr[9]==((u16 *)WifiData->MacAddr)[1] && framehdr[10]==((u16 *)WifiData->MacAddr)[2]) || - (framehdr[8]==0xFFFF && framehdr[9]==0xFFFF && framehdr[10]==0xFFFF)) { - // destination matches our mac address, or the broadcast address. - //if(framehdr[6]&0x4000) { // wep enabled (when receiving WEP packets, the IV is stripped for us! how nice :| - // base2+=24; hdrlen=28; // base2+=[wifi hdr 12byte]+[802 header hdrlen]+[slip hdr 8byte] - //} else { - base2+=22; hdrlen=24; - //} - // SGIP_DEBUG_MESSAGE(("%04X %04X %04X %04X %04X",Wifi_RxReadOffset(base2-8,0),Wifi_RxReadOffset(base2-7,0),Wifi_RxReadOffset(base2-6,0),Wifi_RxReadOffset(base2-5,0),Wifi_RxReadOffset(base2-4,0))); - // check for LLC/SLIP header... - if(Wifi_RxReadOffset(base2-4,0)==0xAAAA && Wifi_RxReadOffset(base2-4,1)==0x0003 && Wifi_RxReadOffset(base2-4,2)==0) { - mb = sgIP_memblock_allocHW(14,len-8-hdrlen); - if(mb) { - if(base2>=(WIFI_RXBUFFER_SIZE/2)) base2-=(WIFI_RXBUFFER_SIZE/2); - Wifi_RxRawReadPacket(base2,(len-8-hdrlen)&(~1),((u16 *)mb->datastart)+7); - if(len&1) ((u8 *)mb->datastart)[len+14-1-8-hdrlen]=Wifi_RxReadOffset(base2,((len-8-hdrlen)/2))&255; - Wifi_CopyMacAddr(mb->datastart,framehdr+8); // copy dest - if(Wifi_RxReadOffset(base,6)&0x0200) { // from DS set? - Wifi_CopyMacAddr(((u8 *)mb->datastart)+6,framehdr+14); // copy src from adrs3 - } else { - Wifi_CopyMacAddr(((u8 *)mb->datastart)+6,framehdr+11); // copy src from adrs2 - } - ((u16 *)mb->datastart)[6]=framehdr[(hdrlen/2)+6+3]; // assume LLC exists and is 8 bytes. - - ethhdr_print('R',mb->datastart); - - // Done generating recieved data packet... now distribute it. - sgIP_Hub_ReceiveHardwarePacket(wifi_hw,mb); - - } - } - } - } - -#endif - - // check if we have a handler - if(packethandler) { - base2=base+6; - if(base2>=(WIFI_RXBUFFER_SIZE/2)) base2-=(WIFI_RXBUFFER_SIZE/2); - (*packethandler)(base2,len); - } - - base+=fulllen/2; - if(base>=(WIFI_RXBUFFER_SIZE/2)) base-=(WIFI_RXBUFFER_SIZE/2); - WifiData->rxbufIn=base; - - if(cnt++>80) break; - } -} - - -////////////////////////////////////////////////////////////////////////// -// Ip addr get/set functions -#ifdef WIFI_USE_TCP_SGIP - -u32 Wifi_GetIP(void) { - if(wifi_hw) return wifi_hw->ipaddr; - return 0; -} - -unsigned long Wifi_GetIPInfo(unsigned long * pGateway,unsigned long * pSnmask,unsigned long * pDns1,unsigned long * pDns2) { - if(wifi_hw) { - if(pGateway) *pGateway=wifi_hw->gateway; - if(pSnmask) *pSnmask=wifi_hw->snmask; - if(pDns1) *pDns1=wifi_hw->dns[0]; - if(pDns2) *pDns2=wifi_hw->dns[1]; - return wifi_hw->ipaddr; - } - return 0; -} - - -void Wifi_SetIP(u32 IPaddr, u32 gateway, u32 subnetmask, u32 dns1, u32 dns2) { - if(wifi_hw) { - SGIP_DEBUG_MESSAGE(("SetIP%08X %08X %08X",IPaddr,gateway,subnetmask)); - wifi_hw->ipaddr=IPaddr; - wifi_hw->gateway=gateway; - wifi_hw->snmask=subnetmask; - wifi_hw->dns[0]=dns1; - wifi_hw->dns[1]=dns2; - // reset arp cache... - sgIP_ARP_FlushInterface(wifi_hw); - } -} - -void Wifi_SetDHCP(void) { - - -} - -#endif - - -int Wifi_GetData(int datatype, int bufferlen, unsigned char * buffer) { - int i; - if(datatype<0 || datatype>=MAX_WIFIGETDATA) return -1; - switch(datatype) { - case WIFIGETDATA_MACADDRESS: - if(bufferlen<6 || !buffer) return -1; - for(i=0;i<6;i++) { - buffer[i]=WifiData->MacAddr[i]; - } - return 6; - case WIFIGETDATA_NUMWFCAPS: - for(i=0;i<3;i++) if(!(WifiData->wfc_enable[i]&0x80)) break; - return i; - } - return -1; -} - -u32 Wifi_GetStats(int statnum) { - if(statnum<0 || statnum>=NUM_WIFI_STATS) return 0; - return WifiData->stats[statnum]; -} - - -////////////////////////////////////////////////////////////////////////// -// sync functions - -void Wifi_Sync(void) { - Wifi_Update(); -} - diff --git a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/wifi_arm9.h b/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/wifi_arm9.h deleted file mode 100644 index 3b354636cd..0000000000 --- a/c/src/lib/libbsp/arm/nds/dswifi/arm9/source/wifi_arm9.h +++ /dev/null @@ -1,122 +0,0 @@ -// DS Wifi interface code -// Copyright (C) 2005-2006 Stephen Stair - sgstair@akkit.org - http://www.akkit.org -// wifi_arm9.c - arm9 wifi support header -/****************************************************************************** -DSWifi Lib and test materials are licenced under the MIT open source licence: -Copyright (c) 2005-2006 Stephen Stair - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -******************************************************************************/ - - -#ifndef WIFI_ARM9_H -#define WIFI_ARM9_H - -#include "wifi_shared.h" - - - -// default option is to use 128k heap -#define WIFIINIT_OPTION_USEHEAP_128 0x0000 -#define WIFIINIT_OPTION_USEHEAP_64 0x1000 -#define WIFIINIT_OPTION_USEHEAP_256 0x2000 -#define WIFIINIT_OPTION_USEHEAP_512 0x3000 -#define WIFIINIT_OPTION_USECUSTOMALLOC 0x4000 -#define WIFIINIT_OPTION_HEAPMASK 0xF000 - -#ifdef WIFI_USE_TCP_SGIP - -#ifdef __cplusplus -extern "C" { -#endif - - -#ifdef __cplusplus -}; -#endif - - -#endif - -extern volatile Wifi_MainStruct * WifiData; - -enum WIFIGETDATA { - WIFIGETDATA_MACADDRESS, // MACADDRESS: returns data in the buffer, requires at least 6 bytes - WIFIGETDATA_NUMWFCAPS, // NUM WFC APS: returns number between 0 and 3, doesn't use buffer. - - MAX_WIFIGETDATA -}; - -// Wifi Packet Handler function: (int packetID, int packetlength) - packetID is only valid while the called function is executing. -// call Wifi_RxRawReadPacket while in the packet handler function, to retreive the data to a local buffer. -typedef void (*WifiPacketHandler)(int, int); - -// Wifi Sync Handler function: Callback function that is called when the arm7 needs to be told to synchronize with new fifo data. -// If this callback is used (see Wifi_SetSyncHandler()), it should send a message via the fifo to the arm7, which will call Wifi_Sync() on arm7. -typedef void (*WifiSyncHandler)(void); - - -#ifdef __cplusplus -extern "C" { -#endif - -extern void Wifi_CopyMacAddr(volatile void * dest, volatile void * src); -extern int Wifi_CmpMacAddr(volatile void * mac1, volatile void * mac2); - -extern unsigned long Wifi_Init(int initflags); -extern int Wifi_CheckInit(void); - -extern int Wifi_RawTxFrame(u16 datalen, u16 rate, u16 * data); -extern void Wifi_SetSyncHandler(WifiSyncHandler wshfunc); -extern void Wifi_RawSetPacketHandler(WifiPacketHandler wphfunc); -extern int Wifi_RxRawReadPacket(s32 packetID, s32 readlength, u16 * data); - -extern void Wifi_DisableWifi(void); -extern void Wifi_EnableWifi(void); -extern void Wifi_SetPromiscuousMode(int enable); -extern void Wifi_ScanMode(void); -extern void Wifi_SetChannel(int channel); - -extern int Wifi_GetNumAP(void); -extern int Wifi_GetAPData(int apnum, Wifi_AccessPoint * apdata); -extern int Wifi_FindMatchingAP(int numaps, Wifi_AccessPoint * apdata, Wifi_AccessPoint * match_dest); -extern int Wifi_ConnectAP(Wifi_AccessPoint * apdata, int wepmode, int wepkeyid, u8 * wepkey); -extern void Wifi_AutoConnect(void); - -extern int Wifi_AssocStatus(void); -extern int Wifi_DisconnectAP(void); -extern int Wifi_GetData(int datatype, int bufferlen, unsigned char * buffer); - - -extern void Wifi_Update(void); -extern void Wifi_Sync(void); - -#ifdef WIFI_USE_TCP_SGIP -extern void Wifi_Timer(int num_ms); -extern void Wifi_SetIP(u32 IPaddr, u32 gateway, u32 subnetmask, u32 dns1, u32 dns2); -extern u32 Wifi_GetIP(void); - -#endif - -#ifdef __cplusplus -}; -#endif - - -#endif |