diff --git a/src/sys/include/net/net.h b/src/sys/include/net/net.h index d354296..697c916 100644 --- a/src/sys/include/net/net.h +++ b/src/sys/include/net/net.h @@ -26,7 +26,7 @@ #include -void netInit(); +int netInit(); #endif diff --git a/src/sys/include/ubixos/exec.h b/src/sys/include/ubixos/exec.h index c16393f..008a5a0 100644 --- a/src/sys/include/ubixos/exec.h +++ b/src/sys/include/ubixos/exec.h @@ -27,7 +27,7 @@ #include #include -uInt32 execThread(void (* tproc)(void),int stack,char *arg,char *descr); +uInt32 execThread(void (* tproc)(void),int stack,char *arg); void execFile(char *file,int argc,char **argv,int console); #endif diff --git a/src/sys/init/main.c b/src/sys/init/main.c index d1f251c..38db238 100644 --- a/src/sys/init/main.c +++ b/src/sys/init/main.c @@ -74,59 +74,83 @@ } loadGDT = { (8 * sizeof(union descriptorTableUnion) - 1), ubixGDT }; +/***************************************************************************************** + Desc: This is the entry point into the os where all of the kernels sub systems are + started up. + + Notes: + +*****************************************************************************************/ int main(int argc,char **argv) { - // Clear the screen so we have a nice pretty starting place for the os to spew its info - clearScreen(); - //smpInit(); - // Initialize the kernels vital systems - // This initialization is for the systems memory and memory map for the os to allocate with + clearScreen(); /* Do A Clear Screen Just To Make The TEXT Buffer Nice And Empty */ + //smpInit(); /* Initialize SMP */ + + /* Initialize Virtual Memory Manager */ if (vmmInit() != 0x0) { kpanic("Error: Initializing VMM Subsystem.\n"); } - // This initialization is for the systems vital information + + /* Initialize System Vital Sub System */ if (initVitals() != 0x0) { kpanic("Error: Initializing vitals\n"); } - // This initialization is for the VFS(Virtual file system) layer + + /* Initialize VFS(Virtual File System) Layer */ if (vfsInit() != 0x0) { kpanic("Error: Initializing VFS\n"); } - if (devFSEnable() != 0x0) { - kpanic("Error: Enabling devFS\n"); - } - // This initialization is for the systems PICs for our IRQ handling + + /* Initialize The Systems 8259 Controller/IRQ Handling */ if (init8259() != 0x0) { kpanic("Error: Initializing 8259\n"); } - // This initialization is for the systems IDT + + /* Initialize The IDT Subsystem */ if (idtInit() != 0x0) { kpanic("Error: Initializing IDT\n"); } - // This initialization is for the operating systems scheduler + + /* Initialize The Kernel Scheduler */ if (schedInit() != 0x0) { kpanic("Error: Initializing: Scheduler\n"); } - // This initialization is for the systems timer + + /* Initialize The Systems Timer */ if (pitInit(1000) != 0x0) { kpanic("Error: Initializing PIT\n"); } - // This initialization is for the keyboard + + /* Initialize The Systems Keyboard */ if (keyboardInit() != 0x0) { kpanic("Error: Initializing Keyboard\n"); } + + /* Initialize PCI Sub System */ /* if (pciInit() != 0x0) { kpanic("Error: Initializing PCI\n"); } */ + + /* Sart Time */ if (timeInit() != 0x0) { kpanic("Error: Initializing TIME\n"); } + + /* Initialize Networking Subsystem */ + if (netInit() != 0x0) { + kpanic("Error: Initializing Networking Subsystem\n"); + } + + /* Initialize The NE2000 NIC Device */ if (ne2kInit(0x240) != 0x0) { kpanic("Error: Initializing NE2000\n"); } - //netInit(); + + if (devFSEnable() != 0x0) { + kpanic("Error: Enabling devFS\n"); + } enableUbixFS(); fdcInit(); initHardDisk(); @@ -139,14 +163,13 @@ if (mount(0x1,0x1,0x0,0x0,"hd","rw") != 0x0) { kprintf("Problem Mounting HD Mount Point\n"); } - execThread(idleTask,(uInt32)(kmalloc(0x2000,sysID)+0x2000),0x0,"Idle Thread"); - execFile("init@sys",0x0,0x0,0x0); + execThread(idleTask,(uInt32)(kmalloc(0x2000,sysID)+0x2000),0x0); + //execFile("init@sys",0x0,0x0,0x0); + execFile("shell@sys",0x0,0x0,0x0); kprintf("Free Pages: [%i]\n",freePages); kprintf("MemoryMap: [0x%X]\n",vmmMemoryMap); kprintf("Starting Os\n"); - //execFile("shell@sys",0x0,0x0,0x0); kprintf("argc: %i\n",argc); - while (1); irqEnable(0x0); sched(); return(0x0); @@ -197,6 +220,9 @@ /*** $Log$ + Revision 1.21 2004/05/18 10:45:41 reddawg + Bug Fix + Revision 1.20 2004/05/10 02:23:24 reddawg Minor Changes To Source Code To Prepare It For Open Source Release diff --git a/src/sys/kernel/exec.c b/src/sys/kernel/exec.c index 3de0519..317c200 100644 --- a/src/sys/kernel/exec.c +++ b/src/sys/kernel/exec.c @@ -34,11 +34,10 @@ #include #include -uInt32 execThread(void (* tproc)(void),int stack,char *arg,char *descr) { +uInt32 execThread(void (* tproc)(void),int stack,char *arg) { kTask_t * newProcess; /* Find A New Thread */ newProcess = schedNewTask(); - /* newProcess->oInfo.terminal = findConsole(0x0); */ /* Set All The Correct Thread Attributes */ newProcess->tss.back_link = 0x0; @@ -48,7 +47,7 @@ newProcess->tss.ss1 = 0x0; newProcess->tss.esp2 = 0x0; newProcess->tss.ss2 = 0x0; - newProcess->tss.cr3 = (unsigned int)kernelPageDirectory; + newProcess->tss.cr3 = (unsigned int)vmmCopyVirtualSpace(kernelPageDirectory); newProcess->tss.eip = (unsigned int)tproc; newProcess->tss.eflags = 0x206; newProcess->tss.esp = stack; @@ -401,6 +400,9 @@ /*** $Log$ + Revision 1.4 2004/05/15 02:30:28 reddawg + Lots of changes + Revision 1.3 2004/05/02 03:19:51 reddawg Added Spinlock Provision For SMP diff --git a/src/sys/kernel/syscall.c b/src/sys/kernel/syscall.c index 760abf4..72680ef 100644 --- a/src/sys/kernel/syscall.c +++ b/src/sys/kernel/syscall.c @@ -155,17 +155,18 @@ void sysStartSDE() { int i = 0x0; - execThread(sdeThread,(uInt32)(kmalloc(0x2000,sysID)+0x2000),0x0,"SDE Main Thread"); + execThread(sdeThread,(uInt32)(kmalloc(0x2000,sysID)+0x2000),0x0); for (i=0;i<500;i++) { - // asm("hlt"); schedYield(); } - //execThread(sdeTestThread,(uInt32)(kmalloc(0x2000,sysID)+0x2000),"SDE Test"); return; } /*** $Log$ + Revision 1.4 2004/05/15 02:30:28 reddawg + Lots of changes + END ***/ diff --git a/src/sys/kernel/ubthread.c b/src/sys/kernel/ubthread.c index 1228330..02d12dc 100644 --- a/src/sys/kernel/ubthread.c +++ b/src/sys/kernel/ubthread.c @@ -72,7 +72,7 @@ } int ubthread_create(kTask_t **thread,const uInt32 *attr,void *start_routine, void *arg) { - *thread = (void *)execThread((void *)start_routine,(uInt32)(kmalloc(0x4000,sysID)+0x4000),arg,"TCP/IP Thread"); + *thread = (void *)execThread((void *)start_routine,(uInt32)(kmalloc(0x2000,sysID)+0x2000),arg); return(0x0); } @@ -128,6 +128,9 @@ /*** $Log$ + Revision 1.2 2004/05/15 02:30:28 reddawg + Lots of changes + END ***/ diff --git a/src/sys/net/core/icmp.c b/src/sys/net/core/icmp.c index 754ccc6..d2b6657 100644 --- a/src/sys/net/core/icmp.c +++ b/src/sys/net/core/icmp.c @@ -1,102 +1,99 @@ /* - * Copyright (c) 2001, Swedish Institute of Computer Science. - * All rights reserved. + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. - * + * * Author: Adam Dunkels * - * $Id$ */ /* Some ICMP messages should be passed to the transport protocols. This is not implemented. */ -#include - -#include "net/debug.h" +#include "net/opt.h" #include "net/ipv4/icmp.h" #include "net/ipv4/inet.h" -#include "net/ipv4/ip.h" +#include "net/ip.h" #include "net/def.h" #include "net/stats.h" -/*-----------------------------------------------------------------------------------*/ +#include "net/snmp.h" + void icmp_input(struct pbuf *p, struct netif *inp) { unsigned char type; + unsigned char code; struct icmp_echo_hdr *iecho; struct ip_hdr *iphdr; struct ip_addr tmpaddr; - uInt16 hlen; - -#ifdef ICMP_STATS - ++stats.icmp.recv; -#endif /* ICMP_STATS */ + u16_t hlen; - + ICMP_STATS_INC(icmp.recv); + snmp_inc_icmpinmsgs(); + + iphdr = p->payload; - hlen = IPH_HL(iphdr) * 4/sizeof(uInt8); - pbuf_header(p, -hlen); + hlen = IPH_HL(iphdr) * 4; + if (pbuf_header(p, -((s16_t)hlen)) || (p->tot_len < sizeof(u16_t)*2)) { + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: short ICMP (%u bytes) received\n", p->tot_len)); + pbuf_free(p); + ICMP_STATS_INC(icmp.lenerr); + snmp_inc_icmpinerrors(); + return; + } - type = *((uInt8 *)p->payload); - - switch(type) { + type = *((u8_t *)p->payload); + code = *(((u8_t *)p->payload)+1); + switch (type) { case ICMP_ECHO: - if(ip_addr_isbroadcast(&iphdr->dest, &inp->netmask) || - ip_addr_ismulticast(&iphdr->dest)) { - DEBUGF(ICMP_DEBUG, ("Smurf.\n")); -#ifdef ICMP_STATS - ++stats.icmp.err; -#endif /* ICMP_STATS */ + /* broadcast or multicast destination address? */ + if (ip_addr_isbroadcast(&iphdr->dest, inp) || ip_addr_ismulticast(&iphdr->dest)) { + LWIP_DEBUGF(ICMP_DEBUG, ("Smurf.\n")); + ICMP_STATS_INC(icmp.err); pbuf_free(p); return; } - DEBUGF(ICMP_DEBUG, ("icmp_input: ping\n")); - DEBUGF(DEMO_DEBUG, ("Pong!\n")); - if(p->tot_len < sizeof(struct icmp_echo_hdr)) { - DEBUGF(ICMP_DEBUG, ("icmp_input: bad ICMP echo received\n")); + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ping\n")); + if (p->tot_len < sizeof(struct icmp_echo_hdr)) { + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: bad ICMP echo received\n")); pbuf_free(p); -#ifdef ICMP_STATS - ++stats.icmp.lenerr; -#endif /* ICMP_STATS */ + ICMP_STATS_INC(icmp.lenerr); + snmp_inc_icmpinerrors(); - return; + return; } - iecho = p->payload; - if(inet_chksum_pbuf(p) != 0) { - DEBUGF(ICMP_DEBUG, ("icmp_input: checksum failed for received ICMP echo\n")); + iecho = p->payload; + if (inet_chksum_pbuf(p) != 0) { + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: checksum failed for received ICMP echo\n")); pbuf_free(p); -#ifdef ICMP_STATS - ++stats.icmp.chkerr; -#endif /* ICMP_STATS */ + ICMP_STATS_INC(icmp.chkerr); + snmp_inc_icmpinerrors(); return; } tmpaddr.addr = iphdr->src.addr; @@ -104,59 +101,62 @@ iphdr->dest.addr = tmpaddr.addr; ICMPH_TYPE_SET(iecho, ICMP_ER); /* adjust the checksum */ - if(iecho->chksum >= htons(0xffff - (ICMP_ECHO << 8))) { + if (iecho->chksum >= htons(0xffff - (ICMP_ECHO << 8))) { iecho->chksum += htons(ICMP_ECHO << 8) + 1; } else { iecho->chksum += htons(ICMP_ECHO << 8); } -#ifdef ICMP_STATS - ++stats.icmp.xmit; -#endif /* ICMP_STATS */ + ICMP_STATS_INC(icmp.xmit); + /* increase number of messages attempted to send */ + snmp_inc_icmpoutmsgs(); + /* increase number of echo replies attempted to send */ + snmp_inc_icmpoutechoreps(); pbuf_header(p, hlen); ip_output_if(p, &(iphdr->src), IP_HDRINCL, - IPH_TTL(iphdr), IP_PROTO_ICMP, inp); - break; + IPH_TTL(iphdr), 0, IP_PROTO_ICMP, inp); + break; default: - DEBUGF(ICMP_DEBUG, ("icmp_input: ICMP type not supported.\n")); -#ifdef ICMP_STATS - ++stats.icmp.proterr; - ++stats.icmp.drop; -#endif /* ICMP_STATS */ + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ICMP type %d code %d not supported.\n", (int)type, (int)code)); + ICMP_STATS_INC(icmp.proterr); + ICMP_STATS_INC(icmp.drop); } pbuf_free(p); } -/*-----------------------------------------------------------------------------------*/ + void icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t) { struct pbuf *q; struct ip_hdr *iphdr; struct icmp_dur_hdr *idur; - - q = pbuf_alloc(PBUF_TRANSPORT, 8 + IP_HLEN + 8, PBUF_RAM); + + q = pbuf_alloc(PBUF_IP, 8 + IP_HLEN + 8, PBUF_RAM); /* ICMP header + IP header + 8 bytes of data */ iphdr = p->payload; - + idur = q->payload; ICMPH_TYPE_SET(idur, ICMP_DUR); ICMPH_CODE_SET(idur, t); - bcopy(p->payload, (char *)q->payload + 8, IP_HLEN + 8); - + memcpy((char *)q->payload + 8, p->payload, IP_HLEN + 8); + /* calculate checksum */ idur->chksum = 0; idur->chksum = inet_chksum(idur, q->len); -#ifdef ICMP_STATS - ++stats.icmp.xmit; -#endif /* ICMP_STATS */ + ICMP_STATS_INC(icmp.xmit); + /* increase number of messages attempted to send */ + snmp_inc_icmpoutmsgs(); + /* increase number of destination unreachable messages attempted to send */ + snmp_inc_icmpoutdestunreachs(); ip_output(q, NULL, &(iphdr->src), - ICMP_TTL, IP_PROTO_ICMP); + ICMP_TTL, 0, IP_PROTO_ICMP); pbuf_free(q); } -/*-----------------------------------------------------------------------------------*/ + +#if IP_FORWARD void icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t) { @@ -164,35 +164,36 @@ struct ip_hdr *iphdr; struct icmp_te_hdr *tehdr; - q = pbuf_alloc(PBUF_TRANSPORT, 8 + IP_HLEN + 8, PBUF_RAM); + q = pbuf_alloc(PBUF_IP, 8 + IP_HLEN + 8, PBUF_RAM); iphdr = p->payload; -#if ICMP_DEBUG - DEBUGF(ICMP_DEBUG, ("icmp_time_exceeded from ")); - ip_addr_debug_print(&(iphdr->src)); - DEBUGF(ICMP_DEBUG, (" to ")); - ip_addr_debug_print(&(iphdr->dest)); - DEBUGF(ICMP_DEBUG, ("\n")); -#endif /* ICMP_DEBNUG */ + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_time_exceeded from ")); + ip_addr_debug_print(ICMP_DEBUG, &(iphdr->src)); + LWIP_DEBUGF(ICMP_DEBUG, (" to ")); + ip_addr_debug_print(ICMP_DEBUG, &(iphdr->dest)); + LWIP_DEBUGF(ICMP_DEBUG, ("\n")); tehdr = q->payload; ICMPH_TYPE_SET(tehdr, ICMP_TE); ICMPH_CODE_SET(tehdr, t); /* copy fields from original packet */ - bcopy((char *)p->payload, (char *)q->payload + 8, IP_HLEN + 8); - + memcpy((char *)q->payload + 8, (char *)p->payload, IP_HLEN + 8); + /* calculate checksum */ tehdr->chksum = 0; tehdr->chksum = inet_chksum(tehdr, q->len); -#ifdef ICMP_STATS - ++stats.icmp.xmit; -#endif /* ICMP_STATS */ + ICMP_STATS_INC(icmp.xmit); + /* increase number of messages attempted to send */ + snmp_inc_icmpoutmsgs(); + /* increase number of destination unreachable messages attempted to send */ + snmp_inc_icmpouttimeexcds(); ip_output(q, NULL, &(iphdr->src), - ICMP_TTL, IP_PROTO_ICMP); + ICMP_TTL, 0, IP_PROTO_ICMP); pbuf_free(q); } +#endif /* IP_FORWARD */ diff --git a/src/sys/net/net/init.c b/src/sys/net/net/init.c index bcff581..27c08a8 100644 --- a/src/sys/net/net/init.c +++ b/src/sys/net/net/init.c @@ -1,3 +1,32 @@ +/***************************************************************************************** + Copyright (c) 2004 The UbixOS Project + All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are +permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of +conditions, the following disclaimer and the list of authors. Redistributions in binary +form must reproduce the above copyright notice, this list of conditions, the following +disclaimer and the list of authors in the documentation and/or other materials provided +with the distribution. Neither the name of the UbixOS Project nor the names of its +contributors may be used to endorse or promote products derived from this software +without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + $Id$ + +*****************************************************************************************/ + #include #include @@ -25,7 +54,7 @@ sys_thread_new((void *)(netMainThread), NULL); - return(0); + return(0x0); } @@ -48,7 +77,7 @@ IP4_ADDR(&ipaddr, 10,4,0,69); IP4_ADDR(&netmask, 255,255,255,0); - netif_set_default(netif_add(&ipaddr, &netmask, &gw, ethernetif_init, tcpip_input)); +// netif_set_default(netif_add(&ipaddr, &netmask, &gw, ethernetif_init, tcpip_input)); IP4_ADDR(&gw, 127,0,0,1); IP4_ADDR(&ipaddr, 127,0,0,1); @@ -63,7 +92,7 @@ _current->state = DEAD; - while (1); + schedYield(); }