summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/arm/nds/dswifi/arm9
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/arm/nds/dswifi/arm9')
-rw-r--r--c/src/lib/libbsp/arm/nds/dswifi/arm9/makefile150
-rw-r--r--c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP.c63
-rw-r--r--c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP.h56
-rw-r--r--c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_ARP.c304
-rw-r--r--c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_ARP.h80
-rw-r--r--c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_Config.h274
-rw-r--r--c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_DHCP.c375
-rw-r--r--c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_DHCP.h86
-rw-r--r--c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_DNS.c492
-rw-r--r--c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_DNS.h69
-rw-r--r--c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_Hub.c211
-rw-r--r--c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_Hub.h109
-rw-r--r--c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_ICMP.c56
-rw-r--r--c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_ICMP.h52
-rw-r--r--c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_IP.c124
-rw-r--r--c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_IP.h64
-rw-r--r--c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_TCP.c915
-rw-r--r--c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_TCP.h134
-rw-r--r--c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_UDP.c245
-rw-r--r--c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_UDP.h81
-rw-r--r--c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_memblock.c295
-rw-r--r--c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_memblock.h65
-rw-r--r--c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_sockets.c521
-rw-r--r--c/src/lib/libbsp/arm/nds/dswifi/arm9/source/sgIP_sockets.h83
-rw-r--r--c/src/lib/libbsp/arm/nds/dswifi/arm9/source/wifi_arm9.c996
-rw-r--r--c/src/lib/libbsp/arm/nds/dswifi/arm9/source/wifi_arm9.h122
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