diff options
author | Linus Torvalds <torvalds@klaava.Helsinki.FI> | 1992-09-29 21:11:21 +0000 |
---|---|---|
committer | Nicolas Pitre <nico@cam.org> | 2007-08-19 14:19:07 -0400 |
commit | 1112c60428a179b8d33db59b0b946057b2b50dfb (patch) | |
tree | 804571ee0053e82beca788cfe63d33d7a039c03a | |
parent | 6969da2918ad2edd45dcf9e65ea2db837179ce9c (diff) | |
download | archive-1112c60428a179b8d33db59b0b946057b2b50dfb.tar.gz |
Finally: 0.98v0.98
Sorry for being late - I can't even show any great new features in 0.98,
but at least it's out now, and available at the normal place (ie at
nic.funet.fi, pub/OS/Linux/testing/Linus). So far there is only a
full-source version available, although I'll probably make it available
as a patch too tomorrow or so (but the patch won't contain the tcp/ip
stuff).
0.98 is essentially the same as 0.97.pl6 - the changes are mostly:
- tcp/ip (0.8.1) is in. It's not compiled into the standard bootimage,
and you'd better be on the tcpip mailing-list to use it, but it's
there. I've been unable to test it further than just watch it
compile...
- extfs patch to correct the problem with big directories with holes.
- mouse patches (ie improved detection-routines)
- minor scsi patches (ultrastor driver change)
- swiss keyboard
- some serial driver patches
- the 32mb patches are in, so if you aren't using a DMA-SCSI driver,
and have more than 16MB physical memory, you can get it recognized.
- edited hd.c
- corrected core-dumping routines
I didn't get my mm patches working yet, so they'll have to wait. The
above are almost 100% by others - I have edited some of the patches, but
there is nothing major new by me. Most of it is minor bug-fixes, and
the only thing that might be a bit of a problem are the hd.c changes:
but I hope they'll solve more problems than they cause. Knock wood.
At nic.funet.fi you can currently find (a) the full sources (b) a
bootimage (US keyboard, floppy root, no tcp/ip) and (c) the protocols.h
file needed for compiling the tcp/ip directory (which should go into
/usr/include/netinet/). I hope people try it out, and that there are no
new problems with this release.
Linus
72 files changed, 11980 insertions, 1640 deletions
@@ -4,14 +4,14 @@ # default of FLOPPY is used by 'build'. # -ROOT_DEV = /dev/hdb1 +ROOT_DEV =# /dev/hdb1 # # uncomment this if you want kernel profiling: the profile_shift is the # granularity of the profiling (5 = 32-byte granularity) # -#PROFILING = -DPROFILE_SHIFT=2 +PROFILING =# -DPROFILE_SHIFT=2 # # uncomment the correct keyboard: @@ -30,9 +30,9 @@ ROOT_DEV = /dev/hdb1 # 0x08 - tilde (~) # 0x10 - dieresis (umlaut) -KEYBOARD = -DKBD_FINNISH -DKBDFLAGS=0 +# KEYBOARD = -DKBD_FINNISH -DKBDFLAGS=0 # KEYBOARD = -DKBD_FINNISH_LATIN1 -DKBDFLAGS=0x9F -# KEYBOARD = -DKBD_US -DKBDFLAGS=0 +KEYBOARD = -DKBD_US -DKBDFLAGS=0 # KEYBOARD = -DKBD_GR -DKBDFLAGS=0 # KEYBOARD = -DKBD_GR_LATIN1 -DKBDFLAGS=0x9F # KEYBOARD = -DKBD_FR -DKBDFLAGS=0 @@ -43,6 +43,8 @@ KEYBOARD = -DKBD_FINNISH -DKBDFLAGS=0 # KEYBOARD = -DKBD_DVORAK -DKBDFLAGS=0 # KEYBOARD = -DKBD_SG -DKBDFLAGS=0 # KEYBOARD = -DKBD_SG_LATIN1 -DKBDFLAGS=0x9F +# KEYBOARD = -DKBD_SF -DKBDFLAGS=0 +# KEYBOARD = -DKBD_SF_LATIN1 -DKBDFLAGS=0x9F # KEYBOARD = -DKDB_NO # @@ -52,10 +54,23 @@ KEYBOARD = -DKBD_FINNISH -DKBDFLAGS=0 MATH_EMULATION = -DKERNEL_MATH_EMULATION # +# Maximum memory used by the kernel. This is normally 16MB - some of the +# SCSI drivers may have problems with anything else due to DMA limits. The +# drivers should check, but they don't. The ONLY valid values for +# MAX_MEGABYTES are 16 and 32 - anything else needs kernel diffs. +# +# EVEN IF YOU HAVE > 16MB, YOU SHOULD EDIT THIS ONLY IF YOU ARE 100% +# SURE YOU AREN'T USING ANY DEVICE THAT DOES UNCHECKED DMA!! THE +# FLOPPY DRIVER IS OK, BUT OTHERS MIGHT HAVE PROBLEMS. +# + +MAX_MEGABYTES = 16 + +# # standard CFLAGS # -CFLAGS =-Wall -O6 -fomit-frame-pointer +CFLAGS =-Wall -O6 -fomit-frame-pointer -DMAX_MEGABYTES=$(MAX_MEGABYTES) # # if you want the ram-disk device, define this to be the @@ -73,14 +88,14 @@ LD86 =ld86 -0 # Set it to -DSVGA_MODE=NORMAL_VGA if you just want the EGA/VGA mode. # The number is the same as you would ordinarily press at bootup. # -#SVGA_MODE= -DSVGA_MODE=1 +SVGA_MODE= -DSVGA_MODE=1 AS =as LD =ld HOSTCC =gcc -static -CC =gcc -nostdinc -I$(KERNELHDRS) $(PROFILING) +CC =gcc -DKERNEL MAKE =make -CPP =$(CC) -E +CPP =$(CC) -E -DMAX_MEGABYTES=$(MAX_MEGABYTES) AR =ar ARCHIVES =kernel/kernel.o mm/mm.o fs/fs.o net/net.o @@ -112,7 +127,7 @@ linuxsubdirs: dummy Version: @./makever.sh - @echo \#define UTS_RELEASE \"0.97.pl6-`cat .version`\" > tools/version.h + @echo \#define UTS_RELEASE \"0.98-`cat .version`\" > tools/version.h @echo \#define UTS_VERSION \"`date +%D`\" >> tools/version.h @echo \#define LINUX_COMPILE_TIME \"`date +%T`\" >> tools/version.h @echo \#define LINUX_COMPILE_BY \"`whoami`\" >> tools/version.h @@ -134,6 +149,9 @@ tools/build: tools/build.c boot/head.o: boot/head.s +boot/head.s: boot/head.S + $(CPP) -traditional boot/head.S -o boot/head.s + tools/version.o: tools/version.c tools/version.h init/main.o: init/main.c @@ -173,7 +191,7 @@ kernel: dummy clean: rm -f Image System.map tmp_make core boot/bootsect boot/setup \ - boot/bootsect.s boot/setup.s init/main.s + boot/bootsect.s boot/setup.s boot/head.s init/main.s rm -f init/*.o tools/system tools/build boot/*.o tools/*.o for i in $(SUBDIRS); do (cd $$i && $(MAKE) clean); done @@ -190,14 +208,14 @@ depend dep: dummy: ### Dependencies: -init/main.o : init/main.c /usr/src/linux/include/stdarg.h /usr/src/linux/include/time.h \ - /usr/src/linux/include/asm/system.h /usr/src/linux/include/asm/io.h /usr/src/linux/include/linux/types.h \ - /usr/src/linux/include/linux/fcntl.h /usr/src/linux/include/linux/config.h /usr/src/linux/include/linux/config_rel.h \ - /usr/src/linux/include/linux/config_ver.h /usr/src/linux/include/linux/config.dist.h \ - /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h \ - /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/tty.h /usr/src/linux/include/linux/termios.h /usr/src/linux/include/linux/unistd.h +init/main.o : init/main.c /usr/lib/gcc-lib/i386-linux/2.2.2d/include/stdarg.h /usr/include/asm/system.h \ + /usr/include/asm/io.h /usr/include/linux/mktime.h /usr/include/linux/types.h \ + /usr/include/linux/fcntl.h /usr/include/linux/config.h /usr/include/linux/config.dist.h \ + /usr/include/linux/sched.h /usr/include/linux/head.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h \ + /usr/include/linux/kernel.h /usr/include/linux/signal.h /usr/include/linux/time.h \ + /usr/include/linux/param.h /usr/include/linux/resource.h /usr/include/linux/vm86.h \ + /usr/include/linux/tty.h /usr/include/linux/termios.h /usr/include/linux/unistd.h @@ -72,10 +72,24 @@ want to include these in the kernel, do the following: - remove the corresponding lines in the initialization of file_systems in fs/super.c. -5. To configure more ptys do this: - - change NR_PTYS in include/linux/tty.h to the number you want - - create the new files in /dev - - recompile the kernel +5. The TCP/IP code is in the standard sources as of version 0.98, but +it is not compiled into the normal binary. To get TCP/IP working, you +have to: + + - edit 'net/Makefile', defining the SUBDIRS and SOCK_FLAGS + variables correctly (currently commented out). Likewise, you + have to edit the rule for linking net.o in the Makefile (again + removing a '#' to make tcp/tcpip.o active) + - make sure you have the /usr/include/netinet/protocols.h header + file. If you don't have it, you should be able to find it at + the same place you got the kernel, or with a newer compiler + version. + - remove all object (*.o) files in the net/ subdirectory, making + sure that they are recompiled with the correct Makefile + definitions. + - Additionally, you obviously need the tcp/ip programs to make any + use of the kernel feature. If you haven't joined the TCP/IP + mailing list, do so. * Running make @@ -105,7 +119,8 @@ copy. This requires dd. "make dep" updates all dependencies. This requires sed. It modifies the makefiles directly (the end of them, starting at the ###Dependencies --line at the end). +-line at the end). "make dep" is required after patching, or the kernel +may not compile cleanly. "make clean" will remove all object files and other files created by the compilation. This requires basename. @@ -120,4 +135,4 @@ The tee part is so that you can check what is going on while the compilation runs. If you have GNU emacs and use M-x compile you don't need this, of course. - Lars Wirzeniu + Lars Wirzenius diff --git a/boot/head.s b/boot/head.S index 2444502..e55b467 100644 --- a/boot/head.s +++ b/boot/head.S @@ -4,6 +4,10 @@ * Copyright (C) 1991, 1992 Linus Torvalds */ +#if (MAX_MEGABYTES != 16) && (MAX_MEGABYTES != 32) +#error "MAX_MEGABYTES must be 16 or 32" +#endif + /* * head.s contains the 32-bit startup code. * @@ -114,6 +118,8 @@ rp_sidt: * I put the kernel page tables right after the page directory, * using 4 of them to span 16 Mb of physical memory. People with * more than 16MB will have to expand this. + * When MAX_MEGABYTES == 32, this is set up for a maximum of 32 MB + * (ref: 17Apr92) (redone for 0.97 kernel changes, 1Aug92, ref) */ .org 0x1000 pg0: @@ -128,6 +134,20 @@ pg2: pg3: .org 0x5000 +#if MAX_MEGABYTES == 32 +pg4: + +.org 0x6000 +pg5: + +.org 0x7000 +pg6: + +.org 0x8000 +pg7: + +.org 0x9000 +#endif /* * empty_bad_page is a bogus page that will be used when out of memory, * so that a process isn't accidentally killed due to a page fault when @@ -136,7 +156,11 @@ pg3: .globl _empty_bad_page _empty_bad_page: +#if MAX_MEGABYTES == 32 +.org 0xa000 +#else .org 0x6000 +#endif /* * empty_bad_page_table is similar to the above, but is used when the * system needs a bogus page-table @@ -144,7 +168,11 @@ _empty_bad_page: .globl _empty_bad_page_table _empty_bad_page_table: +#if MAX_MEGABYTES == 32 +.org 0xb000 +#else .org 0x7000 +#endif /* * tmp_floppy_area is used by the floppy-driver when DMA cannot * reach to a buffer-block. It needs to be aligned, so that it isn't @@ -232,10 +260,17 @@ ignore_int: * I've tried to show which constants to change by having * some kind of marker at them (search for "16Mb"), but I * won't guarantee that's all :-( ) + * + * (ref: added support for up to 32mb, 17Apr92) -- Rik Faith + * (ref: update, 25Sept92) -- croutons@crunchy.uucp */ .align 2 setup_paging: +#if MAXMEGABYTES == 32 + movl $1024*9,%ecx /* 9 pages - swapper_pg_dir+8 page tables */ +#else movl $1024*5,%ecx /* 5 pages - swapper_pg_dir+4 page tables */ +#endif xorl %eax,%eax xorl %edi,%edi /* swapper_pg_dir is at 0x000 */ cld;rep;stosl @@ -246,8 +281,18 @@ setup_paging: movl $pg1+7,_swapper_pg_dir+3076 /* --------- " " --------- */ movl $pg2+7,_swapper_pg_dir+3080 /* --------- " " --------- */ movl $pg3+7,_swapper_pg_dir+3084 /* --------- " " --------- */ +#if MAX_MEGABYTES == 32 + movl $pg4+7,_swapper_pg_dir+3088 /* --------- " " --------- */ + movl $pg5+7,_swapper_pg_dir+3092 /* --------- " " --------- */ + movl $pg6+7,_swapper_pg_dir+3096 /* --------- " " --------- */ + movl $pg7+7,_swapper_pg_dir+3100 /* --------- " " --------- */ + + movl $pg7+4092,%edi + movl $0x1fff007,%eax /* 32Mb - 4096 + 7 (r/w user,p) */ +#else movl $pg3+4092,%edi - movl $0xfff007,%eax /* 16Mb - 4096 + 7 (r/w user,p) */ + movl $0x0fff007,%eax /* 16Mb - 4096 + 7 (r/w user,p) */ +#endif std 1: stosl /* fill pages backwards - more efficient :-) */ subl $0x1000,%eax @@ -282,10 +327,14 @@ gdt_descr: .word 256*8-1 .long 0xc0000000+_gdt +/* + * This gdt setup gives the kernel a 1GB address space at virtual + * address 0xC0000000 - space enough for expansion, I hope. + */ .align 4 _gdt: .quad 0x0000000000000000 /* NULL descriptor */ - .quad 0xc0c09a0000000fff /* 16Mb at 0xC0000000 */ - .quad 0xc0c0920000000fff /* 16Mb */ + .quad 0xc0c39a000000ffff /* 1GB at 0xC0000000 */ + .quad 0xc0c392000000ffff /* 1GB */ .quad 0x0000000000000000 /* TEMPORARY - don't use */ .fill 252,8,0 /* space for LDT's and TSS's etc */ diff --git a/fs/Makefile b/fs/Makefile index 2491aec..e768b45 100644 --- a/fs/Makefile +++ b/fs/Makefile @@ -42,132 +42,148 @@ depend dep: dummy: ### Dependencies: -block_dev.o : block_dev.c /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/asm/segment.h /usr/src/linux/include/asm/system.h -buffer.o : buffer.c /usr/src/linux/include/stdarg.h /usr/src/linux/include/linux/config.h \ - /usr/src/linux/include/linux/config_rel.h /usr/src/linux/include/linux/config_ver.h \ - /usr/src/linux/include/linux/config.dist.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/string.h /usr/src/linux/include/asm/system.h /usr/src/linux/include/asm/io.h -exec.o : exec.c /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/a.out.h /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/string.h \ - /usr/src/linux/include/linux/stat.h /usr/src/linux/include/linux/fcntl.h /usr/src/linux/include/linux/ptrace.h \ - /usr/src/linux/include/linux/user.h /usr/src/linux/include/asm/segment.h -fcntl.o : fcntl.c /usr/src/linux/include/asm/segment.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/stat.h /usr/src/linux/include/linux/fcntl.h \ - /usr/src/linux/include/linux/string.h -fifo.o : fifo.c /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/fcntl.h -file_table.o : file_table.c /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/string.h -inode.o : inode.c /usr/src/linux/include/linux/stat.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/string.h /usr/src/linux/include/asm/system.h -ioctl.o : ioctl.c /usr/src/linux/include/asm/segment.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/string.h /usr/src/linux/include/linux/stat.h -namei.o : namei.c /usr/src/linux/include/const.h /usr/src/linux/include/asm/segment.h \ - /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/string.h /usr/src/linux/include/linux/fcntl.h /usr/src/linux/include/linux/stat.h -open.o : open.c /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/types.h \ - /usr/src/linux/include/linux/utime.h /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/fcntl.h \ - /usr/src/linux/include/linux/stat.h /usr/src/linux/include/linux/string.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/asm/segment.h -pipe.o : pipe.c /usr/src/linux/include/asm/segment.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/fcntl.h /usr/src/linux/include/linux/termios.h -read_write.o : read_write.c /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/errno.h \ - /usr/src/linux/include/linux/stat.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/signal.h /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h \ - /usr/src/linux/include/linux/resource.h /usr/src/linux/include/linux/minix_fs.h \ - /usr/src/linux/include/asm/segment.h -select.o : select.c /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/time.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/signal.h /usr/src/linux/include/linux/param.h \ - /usr/src/linux/include/linux/resource.h /usr/src/linux/include/linux/string.h \ - /usr/src/linux/include/linux/stat.h /usr/src/linux/include/linux/errno.h /usr/src/linux/include/asm/segment.h \ - /usr/src/linux/include/asm/system.h /usr/src/linux/include/const.h -stat.o : stat.c /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/stat.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h \ - /usr/src/linux/include/linux/signal.h /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h \ - /usr/src/linux/include/linux/resource.h /usr/src/linux/include/asm/segment.h -super.o : super.c /usr/src/linux/include/linux/config.h /usr/src/linux/include/linux/config_rel.h \ - /usr/src/linux/include/linux/config_ver.h /usr/src/linux/include/linux/config.dist.h \ - /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h \ - /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h \ - /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/minix_fs.h /usr/src/linux/include/linux/ext_fs.h \ - /usr/src/linux/include/linux/msdos_fs.h /usr/src/linux/include/linux/stat.h \ - /usr/src/linux/include/linux/errno.h /usr/src/linux/include/asm/system.h /usr/src/linux/include/asm/segment.h +block_dev.o : block_dev.c /usr/include/linux/errno.h /usr/include/linux/sched.h \ + /usr/include/linux/head.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/types.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h \ + /usr/include/linux/kernel.h /usr/include/linux/signal.h /usr/include/linux/time.h \ + /usr/include/linux/param.h /usr/include/linux/resource.h /usr/include/linux/vm86.h \ + /usr/include/asm/segment.h /usr/include/asm/system.h +buffer.o : buffer.c /usr/lib/gcc-lib/i386-linux/2.2.2d/include/stdarg.h /usr/include/linux/config.h \ + /usr/include/linux/config.dist.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/string.h \ + /usr/include/asm/system.h /usr/include/asm/io.h +exec.o : exec.c /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/a.out.h /usr/include/linux/errno.h \ + /usr/include/linux/string.h /usr/include/linux/stat.h /usr/include/linux/fcntl.h \ + /usr/include/linux/ptrace.h /usr/include/linux/user.h /usr/include/asm/segment.h +fcntl.o : fcntl.c /usr/include/asm/segment.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/errno.h \ + /usr/include/linux/stat.h /usr/include/linux/fcntl.h /usr/include/linux/string.h +fifo.o : fifo.c /usr/include/linux/sched.h /usr/include/linux/head.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/types.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/errno.h /usr/include/linux/fcntl.h +file_table.o : file_table.c /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/types.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/string.h +inode.o : inode.c /usr/include/linux/stat.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/string.h \ + /usr/include/asm/system.h +ioctl.o : ioctl.c /usr/include/asm/segment.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/errno.h \ + /usr/include/linux/string.h /usr/include/linux/stat.h /usr/include/linux/termios.h +locks.o : locks.c /usr/include/asm/segment.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/errno.h \ + /usr/include/linux/stat.h /usr/include/linux/fcntl.h +namei.o : namei.c /usr/include/asm/segment.h /usr/include/linux/errno.h /usr/include/linux/sched.h \ + /usr/include/linux/head.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/types.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h \ + /usr/include/linux/kernel.h /usr/include/linux/signal.h /usr/include/linux/time.h \ + /usr/include/linux/param.h /usr/include/linux/resource.h /usr/include/linux/vm86.h \ + /usr/include/linux/string.h /usr/include/linux/fcntl.h /usr/include/linux/stat.h +open.o : open.c /usr/include/linux/vfs.h /usr/include/linux/types.h /usr/include/linux/utime.h \ + /usr/include/linux/errno.h /usr/include/linux/fcntl.h /usr/include/linux/stat.h \ + /usr/include/linux/string.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/dirent.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h \ + /usr/include/linux/kernel.h /usr/include/linux/signal.h /usr/include/linux/time.h \ + /usr/include/linux/param.h /usr/include/linux/resource.h /usr/include/linux/vm86.h \ + /usr/include/linux/tty.h /usr/include/linux/termios.h /usr/include/asm/system.h \ + /usr/include/asm/segment.h +pipe.o : pipe.c /usr/include/asm/segment.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/errno.h \ + /usr/include/linux/fcntl.h /usr/include/linux/termios.h +read_write.o : read_write.c /usr/include/linux/types.h /usr/include/linux/errno.h \ + /usr/include/linux/stat.h /usr/include/linux/kernel.h /usr/include/linux/sched.h \ + /usr/include/linux/head.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/minix_fs.h /usr/include/asm/segment.h +select.o : select.c /usr/include/linux/types.h /usr/include/linux/time.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/kernel.h \ + /usr/include/linux/sched.h /usr/include/linux/head.h /usr/include/linux/mm.h \ + /usr/include/linux/signal.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/string.h /usr/include/linux/stat.h \ + /usr/include/linux/errno.h /usr/include/asm/segment.h /usr/include/asm/system.h +stat.o : stat.c /usr/include/linux/errno.h /usr/include/linux/stat.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/types.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/sched.h /usr/include/linux/head.h /usr/include/linux/mm.h \ + /usr/include/linux/kernel.h /usr/include/linux/signal.h /usr/include/linux/time.h \ + /usr/include/linux/param.h /usr/include/linux/resource.h /usr/include/linux/vm86.h \ + /usr/include/asm/segment.h +super.o : super.c /usr/include/linux/config.h /usr/include/linux/config.dist.h \ + /usr/include/linux/sched.h /usr/include/linux/head.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/types.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/minix_fs.h /usr/include/linux/proc_fs.h \ + /usr/include/linux/ext_fs.h /usr/include/linux/msdos_fs.h /usr/include/linux/stat.h \ + /usr/include/linux/errno.h /usr/include/asm/system.h /usr/include/asm/segment.h diff --git a/fs/buffer.c b/fs/buffer.c index 62517da..06ac604 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -28,7 +28,7 @@ #include <asm/system.h> #include <asm/io.h> -#ifdef CONFIG_BLK_DEV_SR +#if defined(CONFIG_BLK_DEV_SR) && defined(CONFIG_SCSI) extern int check_cdrom_media_change(int, int); #endif @@ -133,7 +133,7 @@ void check_disk_change(int dev) brelse(bh); break; -#ifdef CONFIG_BLK_DEV_SR +#if defined(CONFIG_BLK_DEV_SR) && defined(CONFIG_SCSI) case 11: /* CDROM */ i = check_cdrom_media_change(dev, 0); if (i) printk("Flushing buffers and inodes for CDROM\n"); @@ -101,13 +101,16 @@ int core_dump(long signr, struct pt_regs * regs) if (!file.f_op->write) goto close_coredump; has_dumped = 1; -/* write and seek example: from kernel space */ - __asm__("mov %0,%%fs"::"r" ((unsigned short) 0x10)); +/* changed the size calculations - should hopefully work better. lbt */ dump.magic = CMAGIC; - dump.u_tsize = current->end_code / PAGE_SIZE; - dump.u_dsize = (current->brk - current->end_code) / PAGE_SIZE; - dump.u_ssize =((current->start_stack +(PAGE_SIZE-1)) / PAGE_SIZE) - - (regs->esp/ PAGE_SIZE); + dump.start_code = 0; + dump.start_stack = regs->esp & ~(PAGE_SIZE - 1); + dump.u_tsize = ((unsigned long) current->end_code) >> 12; + dump.u_dsize = ((unsigned long) (current->brk + (PAGE_SIZE-1))) >> 12; + dump.u_dsize -= dump.u_tsize; + dump.u_ssize = 0; + if (dump.start_stack < TASK_SIZE) + dump.u_ssize = ((unsigned long) (TASK_SIZE - dump.start_stack)) >> 12; /* If the size of the dump file exceeds the rlimit, then see what would happen if we wrote the stack, but not the data area. */ if ((dump.u_dsize+dump.u_ssize+1) * PAGE_SIZE/1024 > @@ -121,8 +124,6 @@ int core_dump(long signr, struct pt_regs * regs) dump.u_ar0 = (struct pt_regs *)(((int)(&dump.regs)) -((int)(&dump))); dump.signal = signr; dump.regs = *regs; - dump.start_code = 0; - dump.start_stack = regs->esp & ~(PAGE_SIZE - 1); /* Flag indicating the math stuff is valid. */ if (dump.u_fpvalid = current->used_math) { if (last_task_used_math == current) @@ -130,6 +131,7 @@ int core_dump(long signr, struct pt_regs * regs) else memcpy(&dump.i387,¤t->tss.i387,sizeof(dump.i387)); }; + __asm__("mov %0,%%fs"::"r" ((unsigned short) 0x10)); DUMP_WRITE(&dump,sizeof(dump)); DUMP_SEEK(sizeof(dump)); /* Dump the task struct. Not be used by gdb, but could be useful */ @@ -140,14 +142,14 @@ int core_dump(long signr, struct pt_regs * regs) __asm__("mov %0,%%fs"::"r" ((unsigned short) 0x17)); /* Dump the data area */ if (dump.u_dsize != 0) { - dump_start = current->end_code; - dump_size = current->brk - current->end_code; + dump_start = dump.u_tsize << 12; + dump_size = dump.u_dsize << 12; DUMP_WRITE(dump_start,dump_size); }; /* Now prepare to dump the stack area */ if (dump.u_ssize != 0) { - dump_start = regs->esp & ~(PAGE_SIZE - 1); - dump_size = dump.u_ssize * PAGE_SIZE; + dump_start = dump.start_stack; + dump_size = dump.u_ssize << 12; DUMP_WRITE(dump_start,dump_size); }; close_coredump: diff --git a/fs/ext/Makefile b/fs/ext/Makefile index d5e994f..04dc41c 100644 --- a/fs/ext/Makefile +++ b/fs/ext/Makefile @@ -26,103 +26,98 @@ clean: dep: sed '/\#\#\# Dependencies/q' < Makefile > tmp_make - for i in *.c;do $(CPP) -M $$i;done >> tmp_make + $(CPP) -M *.c >> tmp_make cp tmp_make Makefile ### Dependencies: -bitmap.o : bitmap.c /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/ext_fs.h /usr/src/linux/include/linux/string.h -blkdev.o : blkdev.c /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/ext_fs.h /usr/src/linux/include/linux/tty.h /usr/src/linux/include/linux/termios.h \ - /usr/src/linux/include/asm/system.h /usr/src/linux/include/linux/stat.h /usr/src/linux/include/linux/fcntl.h \ - /usr/src/linux/include/linux/errno.h -chrdev.o : chrdev.c /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/ext_fs.h /usr/src/linux/include/linux/tty.h /usr/src/linux/include/linux/termios.h \ - /usr/src/linux/include/asm/system.h /usr/src/linux/include/linux/stat.h /usr/src/linux/include/linux/fcntl.h \ - /usr/src/linux/include/linux/errno.h -dir.o : dir.c /usr/src/linux/include/asm/segment.h /usr/src/linux/include/linux/errno.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/ext_fs.h \ - /usr/src/linux/include/linux/stat.h -fifo.o : fifo.c /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/ext_fs.h -file.o : file.c /usr/src/linux/include/asm/segment.h /usr/src/linux/include/asm/system.h \ - /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h \ - /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h \ - /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/ext_fs.h /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/fcntl.h \ - /usr/src/linux/include/linux/stat.h -freelists.o : freelists.c /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/ext_fs.h /usr/src/linux/include/linux/string.h -inode.o : inode.c /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/ext_fs.h /usr/src/linux/include/linux/string.h \ - /usr/src/linux/include/linux/stat.h /usr/src/linux/include/asm/system.h /usr/src/linux/include/asm/segment.h -namei.o : namei.c /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/ext_fs.h /usr/src/linux/include/linux/string.h \ - /usr/src/linux/include/linux/stat.h /usr/src/linux/include/linux/fcntl.h /usr/src/linux/include/linux/errno.h \ - /usr/src/linux/include/asm/segment.h /usr/src/linux/include/const.h -symlink.o : symlink.c /usr/src/linux/include/asm/segment.h /usr/src/linux/include/linux/errno.h \ - /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h \ - /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h \ - /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/ext_fs.h /usr/src/linux/include/linux/stat.h -truncate.o : truncate.c /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/ext_fs.h /usr/src/linux/include/linux/tty.h /usr/src/linux/include/linux/termios.h \ - /usr/src/linux/include/asm/system.h /usr/src/linux/include/linux/stat.h /usr/src/linux/include/linux/fcntl.h \ - /usr/src/linux/include/linux/errno.h +blkdev.o : blkdev.c /usr/include/linux/sched.h /usr/include/linux/head.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/types.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/ext_fs.h /usr/include/linux/tty.h \ + /usr/include/linux/termios.h /usr/include/asm/system.h /usr/include/linux/stat.h \ + /usr/include/linux/fcntl.h /usr/include/linux/errno.h +chrdev.o : chrdev.c /usr/include/linux/sched.h /usr/include/linux/head.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/types.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/ext_fs.h /usr/include/linux/tty.h \ + /usr/include/linux/termios.h /usr/include/asm/system.h /usr/include/linux/stat.h \ + /usr/include/linux/fcntl.h /usr/include/linux/errno.h +dir.o : dir.c /usr/include/asm/segment.h /usr/include/linux/errno.h /usr/include/linux/kernel.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/ext_fs.h /usr/include/linux/stat.h +fifo.o : fifo.c /usr/include/linux/sched.h /usr/include/linux/head.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/types.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/ext_fs.h +file.o : file.c /usr/include/asm/segment.h /usr/include/asm/system.h /usr/include/linux/sched.h \ + /usr/include/linux/head.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/types.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h \ + /usr/include/linux/kernel.h /usr/include/linux/signal.h /usr/include/linux/time.h \ + /usr/include/linux/param.h /usr/include/linux/resource.h /usr/include/linux/vm86.h \ + /usr/include/linux/ext_fs.h /usr/include/linux/errno.h /usr/include/linux/fcntl.h \ + /usr/include/linux/stat.h +freelists.o : freelists.c /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/ext_fs.h \ + /usr/include/linux/string.h +inode.o : inode.c /usr/include/linux/sched.h /usr/include/linux/head.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/types.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/ext_fs.h /usr/include/linux/string.h \ + /usr/include/linux/stat.h /usr/include/asm/system.h /usr/include/asm/segment.h +namei.o : namei.c /usr/include/linux/sched.h /usr/include/linux/head.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/types.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/ext_fs.h /usr/include/linux/string.h \ + /usr/include/linux/stat.h /usr/include/linux/fcntl.h /usr/include/linux/errno.h \ + /usr/include/asm/segment.h +symlink.o : symlink.c /usr/include/asm/segment.h /usr/include/linux/errno.h \ + /usr/include/linux/sched.h /usr/include/linux/head.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/types.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/ext_fs.h /usr/include/linux/stat.h +truncate.o : truncate.c /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/ext_fs.h \ + /usr/include/linux/tty.h /usr/include/linux/termios.h /usr/include/asm/system.h \ + /usr/include/linux/stat.h /usr/include/linux/fcntl.h /usr/include/linux/errno.h diff --git a/fs/ext/bitmap.c b/fs/ext/bitmap.c deleted file mode 100644 index ee68e68..0000000 --- a/fs/ext/bitmap.c +++ /dev/null @@ -1,242 +0,0 @@ -/* - * linux/fs/ext/bitmap.c - * - * Copyright (C) 1992 Remy Card (card@masi.ibp.fr) - * - * from - * - * linux/fs/minix/bitmap.c - * - * Copyright (C) 1991, 1992 Linus Torvalds - */ - -/* bitmap.c contains the code that handles the inode and block bitmaps */ - - -#include <linux/sched.h> -#include <linux/ext_fs.h> -#include <linux/kernel.h> -#include <linux/string.h> - -#ifdef EXTFS_BITMAP - -#define clear_block(addr) \ -__asm__("cld\n\t" \ - "rep\n\t" \ - "stosl" \ - ::"a" (0),"c" (BLOCK_SIZE/4),"D" ((long) (addr)):"cx","di") - -#define set_bit(nr,addr) ({\ -char res; \ -__asm__ __volatile__("btsl %1,%2\n\tsetb %0": \ -"=q" (res):"r" (nr),"m" (*(addr))); \ -res;}) - -#define clear_bit(nr,addr) ({\ -char res; \ -__asm__ __volatile__("btrl %1,%2\n\tsetnb %0": \ -"=q" (res):"r" (nr),"m" (*(addr))); \ -res;}) - -#define find_first_zero(addr) ({ \ -int __res; \ -__asm__("cld\n" \ - "1:\tlodsl\n\t" \ - "notl %%eax\n\t" \ - "bsfl %%eax,%%edx\n\t" \ - "jne 2f\n\t" \ - "addl $32,%%ecx\n\t" \ - "cmpl $8192,%%ecx\n\t" \ - "jl 1b\n\t" \ - "xorl %%edx,%%edx\n" \ - "2:\taddl %%edx,%%ecx" \ - :"=c" (__res):"0" (0),"S" (addr):"ax","dx","si"); \ -__res;}) - -static int nibblemap[] = { 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4 }; - -static unsigned long count_used(struct buffer_head *map[], unsigned numblocks, - unsigned numbits) -{ - unsigned i, j, end, sum = 0; - struct buffer_head *bh; - - for (i=0; (i<numblocks) && numbits; i++) { - if (!(bh=map[i])) - return(0); - if (numbits >= (8*BLOCK_SIZE)) { - end = BLOCK_SIZE; - numbits -= 8*BLOCK_SIZE; - } else { - int tmp; - end = numbits >> 3; - numbits &= 0x7; - tmp = bh->b_data[end] & ((1<<numbits)-1); - sum += nibblemap[tmp&0xf] + nibblemap[(tmp>>4)&0xf]; - numbits = 0; - } - for (j=0; j<end; j++) - sum += nibblemap[bh->b_data[j] & 0xf] - + nibblemap[(bh->b_data[j]>>4)&0xf]; - } - return(sum); -} - -int ext_free_block(int dev, int block) -{ - struct super_block * sb; - struct buffer_head * bh; - unsigned int bit,zone; - - if (!(sb = get_super(dev))) - panic("trying to free block on nonexistent device"); - if (block < sb->s_firstdatazone || block >= sb->s_nzones) - panic("trying to free block not in datazone"); - bh = get_hash_table(dev,block); - if (bh) { - if (bh->b_count > 1) { - brelse(bh); - return 0; - } - bh->b_dirt=0; - bh->b_uptodate=0; - if (bh->b_count) - brelse(bh); - } - zone = block - sb->s_firstdatazone + 1; - bit = zone & 8191; - zone >>= 13; - bh = sb->s_zmap[zone]; - if (clear_bit(bit,bh->b_data)) - printk("free_block (%04x:%d): bit already cleared\n",dev,block); - bh->b_dirt = 1; - return 1; -} - -int ext_new_block(int dev) -{ - struct buffer_head * bh; - struct super_block * sb; - int i,j; - - if (!(sb = get_super(dev))) - panic("trying to get new block from nonexistant device"); - j = 8192; - for (i=0 ; i<8 ; i++) - if (bh=sb->s_zmap[i]) - if ((j=find_first_zero(bh->b_data))<8192) - break; - if (i>=8 || !bh || j>=8192) - return 0; - if (set_bit(j,bh->b_data)) - panic("new_block: bit already set"); - bh->b_dirt = 1; - j += i*8192 + sb->s_firstdatazone-1; - if (j >= sb->s_nzones) - return 0; - if (!(bh=getblk(dev,j))) - panic("new_block: cannot get block"); - if (bh->b_count != 1) - panic("new block: count is != 1"); - clear_block(bh->b_data); - bh->b_uptodate = 1; - bh->b_dirt = 1; - brelse(bh); -#ifdef EXTFS_DEBUG -printk("ext_new_block: allocating block %d\n", j); -#endif - return j; -} - -unsigned long ext_count_free_blocks(struct super_block *sb) -{ - return (sb->s_nzones - count_used(sb->s_zmap,sb->s_zmap_blocks,sb->s_nzones)) - << sb->s_log_zone_size; -} - -void ext_free_inode(struct inode * inode) -{ - struct buffer_head * bh; - - if (!inode) - return; - if (!inode->i_dev) { - memset(inode,0,sizeof(*inode)); - return; - } - if (inode->i_count>1) { - printk("free_inode: inode has count=%d\n",inode->i_count); - return; - } - if (inode->i_nlink) { - printk("free_inode: inode has nlink=%d\n",inode->i_nlink); - return; - } - if (!inode->i_sb) { - printk("free_inode: inode on nonexistent device\n"); - return; - } - if (inode->i_ino < 1 || inode->i_ino > inode->i_sb->s_ninodes) { - printk("free_inode: inode 0 or nonexistent inode\n"); - return; - } - if (!(bh=inode->i_sb->s_imap[inode->i_ino>>13])) { - printk("free_inode: nonexistent imap in superblock\n"); - return; - } - if (clear_bit(inode->i_ino&8191,bh->b_data)) - printk("free_inode: bit already cleared.\n\r"); - bh->b_dirt = 1; - memset(inode,0,sizeof(*inode)); -} - -struct inode * ext_new_inode(int dev) -{ - struct inode * inode; - struct buffer_head * bh; - int i,j; - - if (!(inode=get_empty_inode())) - return NULL; - if (!(inode->i_sb = get_super(dev))) { - printk("new_inode: unknown device\n"); - iput(inode); - return NULL; - } - inode->i_flags = inode->i_sb->s_flags; - j = 8192; - for (i=0 ; i<8 ; i++) - if (bh=inode->i_sb->s_imap[i]) - if ((j=find_first_zero(bh->b_data))<8192) - break; - if (!bh || j >= 8192 || j+i*8192 > inode->i_sb->s_ninodes) { - iput(inode); - return NULL; - } - if (set_bit(j,bh->b_data)) { /* shouldn't happen */ - printk("new_inode: bit already set"); - iput(inode); - return NULL; - } - bh->b_dirt = 1; - inode->i_count = 1; - inode->i_nlink = 1; - inode->i_dev = dev; - inode->i_uid = current->euid; - inode->i_gid = current->egid; - inode->i_dirt = 1; - inode->i_ino = j + i*8192; - inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; - inode->i_op = NULL; -#ifdef EXTFS_DEBUG - printk("ext_new_inode : allocating inode %d\n", inode->i_ino); -#endif - return inode; -} - -unsigned long ext_count_free_inodes(struct super_block *sb) -{ - return sb->s_ninodes - count_used(sb->s_imap,sb->s_imap_blocks,sb->s_ninodes); -} - -#endif diff --git a/fs/ext/dir.c b/fs/ext/dir.c index 9de7af7..1412e29 100644 --- a/fs/ext/dir.c +++ b/fs/ext/dir.c @@ -15,6 +15,7 @@ #include <asm/segment.h> #include <linux/errno.h> +#include <linux/kernel.h> #include <linux/fs.h> #include <linux/ext_fs.h> #include <linux/stat.h> @@ -73,6 +74,13 @@ static int ext_readdir(struct inode * inode, struct file * filp, while (offset < 1024 && filp->f_pos < inode->i_size) { offset += de->rec_len; filp->f_pos += de->rec_len; + if (de->rec_len < 8 || de->rec_len % 4 != 0 || + de->rec_len < de->name_len + 8) { + printk ("ext_readdir: bad directory entry\n"); + printk ("dev=%d, dir=%d, offset=%d, rec_len=%d, name_len=%d\n", + inode->i_dev, inode->i_ino, offset, de->rec_len, de->name_len); + return 0; + } if (de->inode) { for (i = 0; i < de->name_len; i++) if (c = de->name[i]) diff --git a/fs/ext/namei.c b/fs/ext/namei.c index c5a1d61..8354e4c 100644 --- a/fs/ext/namei.c +++ b/fs/ext/namei.c @@ -122,6 +122,14 @@ static struct buffer_head * ext_find_entry(struct inode * dir, if (prev_dir) *prev_dir = NULL; } + if (de->rec_len < 8 || de->rec_len % 4 != 0 || + de->rec_len < de->name_len + 8) { + printk ("ext_find_entry: bad dir entry\n"); + printk ("dev=%d, dir=%d, offset=%d, rec_len=%d, name_len=%d\n", + dir->i_dev, dir->i_ino, offset, de->rec_len, de->name_len); + brelse (bh); + return NULL; + } if (ext_match(namelen,name,de)) { *res_dir = de; if (next_dir) @@ -253,6 +261,14 @@ printk ("ext_add_entry : creating next block\n"); dir->i_dirt = 1; dir->i_ctime = CURRENT_TIME; } + if (de->rec_len < 8 || de->rec_len % 4 != 0 || + de->rec_len < de->name_len + 8) { + printk ("ext_addr_entry: bad dir entry\n"); + printk ("dev=%d, dir=%d, offset=%d, rec_len=%d, name_len=%d\n", + dir->i_dev, dir->i_ino, offset, de->rec_len, de->name_len); + brelse (bh); + return NULL; + } if (!de->inode && de->rec_len >= rec_len) { if (de->rec_len > rec_len && de->rec_len - rec_len >= EXT_DIR_MIN_SIZE) { @@ -471,6 +487,14 @@ static int empty_dir(struct inode * inode) } de = (struct ext_dir_entry *) bh->b_data; } + if (de->rec_len < 8 || de->rec_len %4 != 0 || + de->rec_len < de->name_len + 8) { + printk ("empty_dir: bad dir entry\n"); + printk ("dev=%d, dir=%d, offset=%d, rec_len=%d, name_len=%d\n", + inode->i_dev, inode->i_ino, offset, de->rec_len, de->name_len); + brelse (bh); + return 1; + } if (de->inode) { brelse(bh); return 0; diff --git a/fs/minix/Makefile b/fs/minix/Makefile index f834539..3df9f7c 100644 --- a/fs/minix/Makefile +++ b/fs/minix/Makefile @@ -26,92 +26,97 @@ clean: dep: sed '/\#\#\# Dependencies/q' < Makefile > tmp_make - for i in *.c;do $(CPP) -M $$i;done >> tmp_make + $(CPP) -M *.c >> tmp_make cp tmp_make Makefile ### Dependencies: -bitmap.o : bitmap.c /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/minix_fs.h /usr/src/linux/include/linux/string.h -blkdev.o : blkdev.c /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/minix_fs.h /usr/src/linux/include/linux/tty.h /usr/src/linux/include/linux/termios.h \ - /usr/src/linux/include/asm/system.h /usr/src/linux/include/linux/stat.h /usr/src/linux/include/linux/fcntl.h -chrdev.o : chrdev.c /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/minix_fs.h /usr/src/linux/include/linux/tty.h /usr/src/linux/include/linux/termios.h \ - /usr/src/linux/include/asm/system.h /usr/src/linux/include/linux/stat.h /usr/src/linux/include/linux/fcntl.h -dir.o : dir.c /usr/src/linux/include/asm/segment.h /usr/src/linux/include/linux/errno.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/minix_fs.h \ - /usr/src/linux/include/linux/stat.h -fifo.o : fifo.c /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/minix_fs.h -file.o : file.c /usr/src/linux/include/asm/segment.h /usr/src/linux/include/asm/system.h \ - /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h \ - /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h \ - /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/minix_fs.h /usr/src/linux/include/linux/errno.h \ - /usr/src/linux/include/linux/fcntl.h /usr/src/linux/include/linux/stat.h -inode.o : inode.c /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/minix_fs.h /usr/src/linux/include/linux/string.h \ - /usr/src/linux/include/linux/stat.h /usr/src/linux/include/asm/system.h /usr/src/linux/include/asm/segment.h -namei.o : namei.c /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/minix_fs.h /usr/src/linux/include/linux/string.h \ - /usr/src/linux/include/linux/stat.h /usr/src/linux/include/linux/fcntl.h /usr/src/linux/include/linux/errno.h \ - /usr/src/linux/include/asm/segment.h /usr/src/linux/include/const.h -symlink.o : symlink.c /usr/src/linux/include/asm/segment.h /usr/src/linux/include/linux/errno.h \ - /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h \ - /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h \ - /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/minix_fs.h /usr/src/linux/include/linux/stat.h -truncate.o : truncate.c /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/minix_fs.h /usr/src/linux/include/linux/tty.h /usr/src/linux/include/linux/termios.h \ - /usr/src/linux/include/asm/system.h /usr/src/linux/include/linux/stat.h /usr/src/linux/include/linux/fcntl.h +bitmap.o : bitmap.c /usr/include/linux/sched.h /usr/include/linux/head.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/types.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/minix_fs.h /usr/include/linux/string.h +blkdev.o : blkdev.c /usr/include/linux/errno.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/minix_fs.h \ + /usr/include/linux/tty.h /usr/include/linux/termios.h /usr/include/asm/system.h \ + /usr/include/linux/stat.h /usr/include/linux/fcntl.h +chrdev.o : chrdev.c /usr/include/linux/errno.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/minix_fs.h \ + /usr/include/linux/tty.h /usr/include/linux/termios.h /usr/include/asm/system.h \ + /usr/include/linux/stat.h /usr/include/linux/fcntl.h +dir.o : dir.c /usr/include/asm/segment.h /usr/include/linux/errno.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/types.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/minix_fs.h /usr/include/linux/stat.h +fifo.o : fifo.c /usr/include/linux/sched.h /usr/include/linux/head.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/types.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/minix_fs.h +file.o : file.c /usr/include/asm/segment.h /usr/include/asm/system.h /usr/include/linux/sched.h \ + /usr/include/linux/head.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/types.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h \ + /usr/include/linux/kernel.h /usr/include/linux/signal.h /usr/include/linux/time.h \ + /usr/include/linux/param.h /usr/include/linux/resource.h /usr/include/linux/vm86.h \ + /usr/include/linux/minix_fs.h /usr/include/linux/errno.h /usr/include/linux/fcntl.h \ + /usr/include/linux/stat.h +inode.o : inode.c /usr/include/linux/sched.h /usr/include/linux/head.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/types.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/minix_fs.h /usr/include/linux/string.h \ + /usr/include/linux/stat.h /usr/include/asm/system.h /usr/include/asm/segment.h +namei.o : namei.c /usr/include/linux/sched.h /usr/include/linux/head.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/types.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/minix_fs.h /usr/include/linux/string.h \ + /usr/include/linux/stat.h /usr/include/linux/fcntl.h /usr/include/linux/errno.h \ + /usr/include/asm/segment.h +symlink.o : symlink.c /usr/include/asm/segment.h /usr/include/linux/errno.h \ + /usr/include/linux/sched.h /usr/include/linux/head.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/types.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/minix_fs.h /usr/include/linux/stat.h +truncate.o : truncate.c /usr/include/linux/errno.h /usr/include/linux/sched.h \ + /usr/include/linux/head.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/types.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h \ + /usr/include/linux/kernel.h /usr/include/linux/signal.h /usr/include/linux/time.h \ + /usr/include/linux/param.h /usr/include/linux/resource.h /usr/include/linux/vm86.h \ + /usr/include/linux/minix_fs.h /usr/include/linux/tty.h /usr/include/linux/termios.h \ + /usr/include/asm/system.h /usr/include/linux/stat.h /usr/include/linux/fcntl.h diff --git a/fs/msdos/Makefile b/fs/msdos/Makefile index 0d172a2..e73202a 100644 --- a/fs/msdos/Makefile +++ b/fs/msdos/Makefile @@ -25,56 +25,59 @@ clean: dep: sed '/\#\#\# Dependencies/q' < Makefile > tmp_make - for i in *.c;do $(CPP) -M $$i;done >> tmp_make + $(CPP) -M *.c >> tmp_make cp tmp_make Makefile ### Dependencies: -dir.o : dir.c /usr/src/linux/include/asm/segment.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/msdos_fs.h /usr/src/linux/include/linux/errno.h \ - /usr/src/linux/include/linux/stat.h -fat.o : fat.c /usr/src/linux/include/linux/msdos_fs.h /usr/src/linux/include/linux/fs.h \ - /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h \ - /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/stat.h -file.o : file.c /usr/src/linux/include/asm/segment.h /usr/src/linux/include/asm/system.h \ - /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h \ - /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h \ - /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/msdos_fs.h /usr/src/linux/include/linux/errno.h \ - /usr/src/linux/include/linux/fcntl.h /usr/src/linux/include/linux/stat.h -inode.o : inode.c /usr/src/linux/include/linux/msdos_fs.h /usr/src/linux/include/linux/fs.h \ - /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h \ - /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/signal.h /usr/src/linux/include/linux/time.h \ - /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/string.h /usr/src/linux/include/linux/stat.h \ - /usr/src/linux/include/asm/segment.h -misc.o : misc.c /usr/src/linux/include/linux/msdos_fs.h /usr/src/linux/include/linux/fs.h \ - /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h \ - /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/string.h /usr/src/linux/include/linux/stat.h -namei.o : namei.c /usr/src/linux/include/asm/segment.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/msdos_fs.h /usr/src/linux/include/linux/errno.h \ - /usr/src/linux/include/linux/string.h /usr/src/linux/include/linux/stat.h +dir.o : dir.c /usr/include/asm/segment.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/msdos_fs.h \ + /usr/include/linux/errno.h /usr/include/linux/stat.h +fat.o : fat.c /usr/include/linux/msdos_fs.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/types.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/kernel.h \ + /usr/include/linux/errno.h /usr/include/linux/stat.h +file.o : file.c /usr/include/asm/segment.h /usr/include/asm/system.h /usr/include/linux/sched.h \ + /usr/include/linux/head.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/types.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h \ + /usr/include/linux/kernel.h /usr/include/linux/signal.h /usr/include/linux/time.h \ + /usr/include/linux/param.h /usr/include/linux/resource.h /usr/include/linux/vm86.h \ + /usr/include/linux/msdos_fs.h /usr/include/linux/errno.h /usr/include/linux/fcntl.h \ + /usr/include/linux/stat.h +inode.o : inode.c /usr/include/linux/msdos_fs.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/types.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/kernel.h \ + /usr/include/linux/sched.h /usr/include/linux/head.h /usr/include/linux/mm.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/errno.h \ + /usr/include/linux/string.h /usr/include/linux/stat.h /usr/include/asm/segment.h +misc.o : misc.c /usr/include/linux/msdos_fs.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/types.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/sched.h \ + /usr/include/linux/head.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/errno.h \ + /usr/include/linux/string.h /usr/include/linux/stat.h +namei.o : namei.c /usr/include/asm/segment.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/msdos_fs.h \ + /usr/include/linux/errno.h /usr/include/linux/string.h /usr/include/linux/stat.h diff --git a/fs/proc/Makefile b/fs/proc/Makefile index 02e06c8..aafb266 100644 --- a/fs/proc/Makefile +++ b/fs/proc/Makefile @@ -25,68 +25,61 @@ clean: dep: sed '/\#\#\# Dependencies/q' < Makefile > tmp_make - for i in *.c;do $(CPP) -M $$i;done >> tmp_make + $(CPP) -M *.c >> tmp_make cp tmp_make Makefile ### Dependencies: -base.o : base.c /usr/src/linux/include/asm/segment.h /usr/src/linux/include/linux/errno.h \ - /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h \ - /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h \ - /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_i.h \ - /usr/src/linux/include/linux/ext_fs_i.h /usr/src/linux/include/linux/msdos_fs_i.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/vm86.h /usr/src/linux/include/linux/proc_fs.h /usr/src/linux/include/linux/stat.h -fd.o : fd.c /usr/src/linux/include/asm/segment.h /usr/src/linux/include/linux/errno.h \ - /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h \ - /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h \ - /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_i.h \ - /usr/src/linux/include/linux/ext_fs_i.h /usr/src/linux/include/linux/msdos_fs_i.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/vm86.h /usr/src/linux/include/linux/proc_fs.h /usr/src/linux/include/linux/stat.h -inode.o : inode.c /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_i.h /usr/src/linux/include/linux/ext_fs_i.h \ - /usr/src/linux/include/linux/msdos_fs_i.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/vm86.h /usr/src/linux/include/linux/proc_fs.h /usr/src/linux/include/linux/string.h \ - /usr/src/linux/include/linux/stat.h /usr/src/linux/include/asm/system.h /usr/src/linux/include/asm/segment.h -link.o : link.c /usr/src/linux/include/asm/segment.h /usr/src/linux/include/linux/errno.h \ - /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h \ - /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h \ - /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_i.h \ - /usr/src/linux/include/linux/ext_fs_i.h /usr/src/linux/include/linux/msdos_fs_i.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/vm86.h /usr/src/linux/include/linux/minix_fs.h \ - /usr/src/linux/include/linux/stat.h -mem.o : mem.c /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/errno.h \ - /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h \ - /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_i.h \ - /usr/src/linux/include/linux/ext_fs_i.h /usr/src/linux/include/linux/msdos_fs_i.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/vm86.h /usr/src/linux/include/asm/segment.h /usr/src/linux/include/asm/io.h -root.o : root.c /usr/src/linux/include/asm/segment.h /usr/src/linux/include/linux/errno.h \ - /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h \ - /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h \ - /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_i.h \ - /usr/src/linux/include/linux/ext_fs_i.h /usr/src/linux/include/linux/msdos_fs_i.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/vm86.h /usr/src/linux/include/linux/proc_fs.h /usr/src/linux/include/linux/stat.h +base.o : base.c /usr/include/asm/segment.h /usr/include/linux/errno.h /usr/include/linux/sched.h \ + /usr/include/linux/head.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/types.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h \ + /usr/include/linux/kernel.h /usr/include/linux/signal.h /usr/include/linux/time.h \ + /usr/include/linux/param.h /usr/include/linux/resource.h /usr/include/linux/vm86.h \ + /usr/include/linux/proc_fs.h /usr/include/linux/stat.h +fd.o : fd.c /usr/include/asm/segment.h /usr/include/linux/errno.h /usr/include/linux/sched.h \ + /usr/include/linux/head.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/types.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h \ + /usr/include/linux/kernel.h /usr/include/linux/signal.h /usr/include/linux/time.h \ + /usr/include/linux/param.h /usr/include/linux/resource.h /usr/include/linux/vm86.h \ + /usr/include/linux/proc_fs.h /usr/include/linux/stat.h +inode.o : inode.c /usr/include/linux/sched.h /usr/include/linux/head.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/types.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/proc_fs.h /usr/include/linux/string.h \ + /usr/include/linux/stat.h /usr/include/asm/system.h /usr/include/asm/segment.h +link.o : link.c /usr/include/asm/segment.h /usr/include/linux/errno.h /usr/include/linux/sched.h \ + /usr/include/linux/head.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/types.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h \ + /usr/include/linux/kernel.h /usr/include/linux/signal.h /usr/include/linux/time.h \ + /usr/include/linux/param.h /usr/include/linux/resource.h /usr/include/linux/vm86.h \ + /usr/include/linux/minix_fs.h /usr/include/linux/stat.h +mem.o : mem.c /usr/include/linux/types.h /usr/include/linux/errno.h /usr/include/linux/sched.h \ + /usr/include/linux/head.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/asm/segment.h \ + /usr/include/asm/io.h +root.o : root.c /usr/include/asm/segment.h /usr/include/linux/errno.h /usr/include/linux/sched.h \ + /usr/include/linux/head.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/types.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h \ + /usr/include/linux/kernel.h /usr/include/linux/signal.h /usr/include/linux/time.h \ + /usr/include/linux/param.h /usr/include/linux/resource.h /usr/include/linux/vm86.h \ + /usr/include/linux/proc_fs.h /usr/include/linux/stat.h diff --git a/include/const.h b/include/const.h deleted file mode 100644 index 7828e61..0000000 --- a/include/const.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef _CONST_H -#define _CONST_H - -#define BUFFER_END 0x200000 - -#define I_TYPE 0170000 -#define I_DIRECTORY 0040000 -#define I_REGULAR 0100000 -#define I_BLOCK_SPECIAL 0060000 -#define I_CHAR_SPECIAL 0020000 -#define I_NAMED_PIPE 0010000 -#define I_SET_UID_BIT 0004000 -#define I_SET_GID_BIT 0002000 - -#endif diff --git a/include/linux/busmouse.h b/include/linux/busmouse.h index d83768e..fb555c6 100644 --- a/include/linux/busmouse.h +++ b/include/linux/busmouse.h @@ -60,7 +60,7 @@ /*--------- MICROSOFT BUSMOUSE ITEMS -------------*/ #define MS_MSE_DATA_PORT 0x23d -#define MS_MSE_SIGNATURE_PORT 0x23d +#define MS_MSE_SIGNATURE_PORT 0x23e #define MS_MSE_CONTROL_PORT 0x23c #define MS_MSE_CONFIG_PORT 0x23f diff --git a/include/linux/config.h b/include/linux/config.h index 6f79980..abfbf7e 100644 --- a/include/linux/config.h +++ b/include/linux/config.h @@ -22,7 +22,7 @@ #define DEF_INITSEG 0x9000 #define DEF_SYSSEG 0x1000 #define DEF_SETUPSEG 0x9020 -#define DEF_SYSSIZE 0x5000 +#define DEF_SYSSIZE 0x7000 /* * The root-device is no longer hard-coded. You can change the default diff --git a/include/linux/config_rel.h b/include/linux/config_rel.h index bd66dee..f875936 100644 --- a/include/linux/config_rel.h +++ b/include/linux/config_rel.h @@ -1 +1 @@ -#define UTS_RELEASE "0.97-11" +#define UTS_RELEASE "0.97.pl2-44" diff --git a/include/linux/config_ver.h b/include/linux/config_ver.h index e09eeab..18a6d6e 100644 --- a/include/linux/config_ver.h +++ b/include/linux/config_ver.h @@ -1 +1 @@ -#define UTS_VERSION "08/01/92" +#define UTS_VERSION "08/23/92" diff --git a/include/linux/socket.h b/include/linux/socket.h index 3c1da05..f11e8d0 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h @@ -48,6 +48,13 @@ struct sockaddr { #define SO_KEEPALIVE 9 #define SO_OOBINLINE 10 #define SO_NO_CHECK 11 +#define SO_PRIORITY 12 +#define SO_LINGER 13 + +/* the different priorities */ +#define SOPRI_INTERACTIVE 0 +#define SOPRI_NORMAL 1 +#define SOPRI_BACKGROUND 2 /* setsockoptions level */ #define SOL_SOCKET 1 diff --git a/include/linux/vmm.h b/include/linux/vmm.h new file mode 100644 index 0000000..ad31dda --- /dev/null +++ b/include/linux/vmm.h @@ -0,0 +1,37 @@ +#ifndef _LINUX_VMM_H +#define _LINUX_VMM_H + +/* + * Linux kernel virtual memory manager primitives. + * The idea being to have a "virtual" mm in the same way + * we have a virtual fs - giving a cleaner interface to the + * mm details, and allowing different kinds of memory mappings + * (from shared memory to executable loading to arbitrary + * mmap() functions). + */ + +/* + * This struct defines a memory VMM memory area. There is one of these + * per VM-area/task. A VM area is any part of the process virtual memory + * space that has a special rule for the page-fault handlers (ie a shared + * library, the executable area etc). + */ +struct vm_area_struct { + unsigned long vm_start; /* VM area parameters */ + unsigned long vm_end; + struct vm_area_struct * vm_next; /* ordered linked list */ + struct vm_area_struct * vm_share; /* circular linked list */ + struct inode * vm_inode; + unsigned long vm_offset; + struct vm_operations_struct * vm_ops; + unsigned long vm_flags; +}; + +struct vm_operations_struct { + void (*open)(struct task_struct * tsk, struct vm_area_struct * area); + void (*close)(struct task_struct * tsk, struct vm_area_struct * area); + void (*nopage)(struct task_struct * tsk, struct vm_area_struct * area, unsigned long address); + void (*wppage)(struct task_struct * tsk, struct vm_area_struct * area, unsigned long address); +}; + +#endif diff --git a/include/stdarg.h b/include/stdarg.h deleted file mode 100644 index fd79ec0..0000000 --- a/include/stdarg.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef _STDARG_H -#define _STDARG_H - -typedef char *va_list; - -/* Amount of space required in an argument list for an arg of type TYPE. - TYPE may alternatively be an expression whose type is used. */ - -#define __va_rounded_size(TYPE) \ - (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) - -#ifndef __sparc__ -#define va_start(AP, LASTARG) \ - (AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG))) -#else -#define va_start(AP, LASTARG) \ - (__builtin_saveregs (), \ - AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG))) -#endif - -void va_end (va_list); /* Defined in gnulib */ -#define va_end(AP) - -#define va_arg(AP, TYPE) \ - (AP += __va_rounded_size (TYPE), \ - *((TYPE *) (AP - __va_rounded_size (TYPE)))) - -#endif /* _STDARG_H */ diff --git a/include/sys/kd.h b/include/sys/kd.h deleted file mode 100644 index 9335ebf..0000000 --- a/include/sys/kd.h +++ /dev/null @@ -1,179 +0,0 @@ -#ifndef _KD_H -#define _KD_H - -/* 0x4B is 'K', to avoid collision with termios and vt */ - -#define SWAPMONO 0x4B00 /* use mca as output device */ -#define SWAPCGA 0x4B01 /* use cga as output device */ -#define SWAPEGA 0x4B02 /* use ega as output device */ -#define SWAPVGA 0x4B03 /* use vga as output device */ -#define CONS_CURRENT 0x4B04 /* return current output device */ -#define MONO 0x01 -#define CGA 0x02 -#define EGA 0x03 - -#define SW_B40x25 0x4B05 /* 40x25 mono text (cga/ega) */ -#define SW_C40x25 0x4B06 /* 40x24 color text (cga/ega) */ -#define SW_B80x25 0x4B07 /* 80x25 mono text (cga/ega) */ -#define SW_C80x25 0x4B08 /* 80x25 color text (cga/ega) */ -#define SW_BG320 0x4B09 /* 320x200 mono graphics (cga/ega) */ -#define SW_CG320 0x4B0A /* 320x200 color graphics (cga/ega) */ -#define SW_BG640 0x4B0B /* 640x200 mono graphics (cga/ega) */ -#define SW_CG320_D 0x4B0C /* 320x200 graphics (ega mode d) */ -#define SW_CG640_E 0x4B0D /* 640x200 graphics (ega mode e) */ -#define SW_EGAMONOAPA 0x4B0E /* 640x350 graphics (ega mode f) */ -#define SW_ENH_MONOAPA2 0x4B0F /* 640x350 graphics extd mem (ega mode f*) */ -#define SW_CG640x350 0x4B10 /* 640x350 graphics (ega mode 10) */ -#define SW_ENH_CG640 0x4B11 /* 640x350 graphics extd mem (ega mode 10*) */ -#define SW_EGAMONO80x25 0x4B12 /* 80x25 mono text (ega mode 7) */ -#define SW_ENHB40x25 0x4B13 /* enhanced 40x25 mono text (ega) */ -#define SW_ENHC40x25 0x4B14 /* enhanced 40x25 color text (ega) */ -#define SW_ENHB80x25 0x4B15 /* enhanced 80x25 mono text (ega) */ -#define SW_ENHC80x25 0x4B16 /* enhanced 80x25 color text (ega) */ -#define SW_ENHB80x43 0x4B17 /* enhanced 80x43 mono text (ega) */ -#define SW_ENHC80x43 0x4B18 /* enhanced 80x43 color text (ega) */ -#define SW_MCAMODE 0x4B19 /* reinit mca */ -#define SW_ATT640 0x4B1A /* 640x400 16color */ -/* should add more vga modes, etc */ - -#define CONS_GET 0x4B1B /* get current display mode */ -#define M_B40x25 0 /* 40x25 mono (cga/ega) */ -#define M_C40x25 1 /* 40x25 color (cga/ega) */ -#define M_B80x25 2 /* 80x25 mono (cga/ega) */ -#define M_C80x25 3 /* 80x25 color (cga/ega) */ -#define M_BG320 4 /* 320x200 mono (cga/ega) */ -#define M_CG320 5 /* 320x200 color (cga/ega) */ -#define M_BG640 6 /* 640x200 mono (cga/ega) */ -#define M_EGAMONO80x25 7 /* 80x25 mono (ega) */ -#define M_CG320_D 13 /* ega mode d */ -#define M_CG640_E 14 /* ega mode e */ -#define M_EFAMONOAPA 15 /* ega mode f */ -#define M_CG640x350 16 /* ega mode 10 */ -#define M_ENHMONOAPA2 17 /* ega mode f with ext mem */ -#define M_ENH_CG640 18 /* ega mode 10* */ -#define M_ENH_B40x25 19 /* ega enh 40x25 mono */ -#define M_ENH_C40x25 20 /* ega enh 40x25 color */ -#define M_ENH_B80x25 21 /* ega enh 80x25 mono */ -#define M_ENH_C80x25 22 /* ega enh 80x25 color */ -#define M_ENH_B80x43 0x70 /* ega enh 80x43 mono */ -#define M_ENH_C80x43 0x71 /* ega enh 80x43 color */ -#define M_MCA_MODE 0xff /* monochrome adapter mode */ -#define MCA_GET 0x4B1C /* get mca display mode */ -#define CGA_GET 0x4B1D /* get cga display mode */ -#define EGA_GET 0x4B1E /* get ega display mode */ - -#define MAPCONS 0x4B1F /* map current video mem into address space */ -#define MAPMONO 0x4B20 /* map mca video mem into address space */ -#define MAPCGA 0x4B21 /* map cga video mem into address space */ -#define MAPEGA 0x4B22 /* map ega video mem into address space */ -#define MAPVGA 0x4B23 /* map vga video mem into address space */ - -struct port_io_struc { - char dir; /* direction in vs out */ - unsigned short port; - char data; -}; -#define IN_ON_PORT 0x00 -#define OUT_ON_PORT 0x01 -struct port_io_arg { - struct port_io_struc args[4]; -}; -#define MCAIO 0x4B24 /* i/o to mca video board */ -#define CGAIO 0x4B25 /* i/o to cga video board */ -#define EGAIO 0x4B26 /* i/o to ega video board */ -#define VGAIO 0x4B27 /* i/o to vga video board */ - -#define GIO_FONT8x8 0x4B28 /* gets current 8x8 font used */ -#define PIO_FONT8x8 0x4B29 /* use supplied 8x8 font */ -#define GIO_FONT8x14 0x4B2A /* gets current 8x14 font used */ -#define PIO_FONT8x14 0x4B2B /* use supplied 8x14 font */ -#define GIO_FONT8x16 0x4B2C /* gets current 8x16 font used */ -#define PIO_FONT8x16 0x4B2D /* use supplied 8x16 font */ - -#define MKDIOADDR 32 /* io bitmap size from <linux/sched.h> */ -struct kd_disparam { - long type; /* type of display */ - char *addr; /* display mem address */ - ushort ioaddr[MKDIOADDR]; /* valid i/o addresses */ -}; -#define KDDISPTYPE 0x4B2E /* gets display info */ -#define KD_MONO 0x01 -#define KD_HERCULES 0x02 -#define KD_CGA 0x03 -#define KD_EGA 0x04 - -#define KIOCSOUND 0x4B2F /* start sound generation (0 for off) */ -#define KDMKTONE 0x4B30 /* generate tone */ - -#define KDGETLED 0x4B31 /* return current led flags */ -#define KDSETLED 0x4B32 /* set current led flags */ -#define LED_SCR 0x01 /* scroll lock */ -#define LED_CAP 0x04 /* caps lock */ -#define LED_NUM 0x02 /* num lock */ - -#define KDGKBTYPE 0x4B33 /* get keyboard type */ -#define KB_84 0x01 -#define KB_101 0x02 -#define KB_OTHER 0x03 - -#define KDADDIO 0x4B34 /* add i/o port as valid */ -#define KDDELIO 0x4B35 /* del i/o port as valid */ -#define KDENABIO 0x4B36 /* enable i/o to video board */ -#define KDDISABIO 0x4B37 /* disable i/o to video board */ - -struct kd_quemode { - int qsize; /* desired # elem in queue */ - int signo; /* signal to send when queue not empty */ - char *qaddr; /* user virt addr of queue */ -}; -#define KDQUEMODE 0x4B38 /* enable/disable special queue mode */ - -#define KDSBORDER 0x4B39 /* set screen boarder in ega text mode */ - -#define KDSETMODE 0x4B3A /* set text/grahics mode */ -#define KD_TEXT 0x00 -#define KD_GRAPHICS 0x01 -#define KD_TEXT0 0x02 /* ? */ -#define KD_TEXT1 0x03 /* ? */ -#define KDGETMODE 0x4B3B /* get current mode */ - -struct kd_memloc { - char *vaddr; /* virt addr to map to */ - char *physaddr; /* phys addr to map from */ - long length; /* number of bytes */ - long ioflg; /* enable i/o if set */ -}; -#define KDMAPDISP 0x4B3C /* map display into address space */ -#define KDUNMAPDISP 0x4B3D /* unmap display from address space */ - -#define KDVDCTYPE 0x4B3E /* return vdc controller/display info */ - -#define KIOCINFO 0x4B3F /* tell what the device is */ - -typedef char scrnmap_t; -#define E_TABSZ 256 -#define GIO_SCRNMAP 0x4B40 /* get screen mapping from kernel */ -#define PIO_SCRNMAP 0x4B41 /* put screen mapping table in kernel */ - -#define GIO_ATTR 0x4B42 /* get screen attributes */ -#define GIO_COLOR 0x4B43 /* return nonzero if display is color */ - -#define K_RAW 0x00 -#define K_XLATE 0x01 -#define KDGKBMODE 0x4B44 /* gets current keyboard mode */ -#define KDSKBMODE 0x4B45 /* sets current keyboard mode */ - -struct kbentry { - u_char kb_table; - u_char kb_index; - u_char kb_value; -}; -#define K_NORMTAB 0x00 -#define K_SHIFTTAB 0x01 -#define K_ALTTAB 0x02 -#define K_ALTSHIFTTAB 0x03 -#define K_SRQTAB 0x04 -#define KDGKBENT 0x4B46 /* gets one entry in translation table */ -#define KDSKBENT 0x4B47 /* sets one entry in translation table */ - -#endif /* _KD_H */ diff --git a/include/sys/mman.h b/include/sys/mman.h deleted file mode 100644 index 0a26c1b..0000000 --- a/include/sys/mman.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef _MMAN_H -#define _MMAN_H - -#define PROT_READ 0x1 /* page can be read */ -#define PROT_WRITE 0x2 /* page can be written */ -#define PROT_EXEC 0x4 /* page can be executed */ -#define PROT_NONE 0x0 /* page can not be accessed */ - -#define MAP_SHARED 1 /* Share changes */ -#define MAP_PRIVATE 2 /* Changes are private */ -#define MAP_TYPE 0xf /* Mask for type of mapping */ -#define MAP_FIXED 0x10 /* Interpret addr exactly */ - -extern caddr_t mmap(caddr_t addr, size_t len, int prot, int flags, int fd, - off_t off); -extern int munmap(caddr_t addr, size_t len); - -#endif /* _MMAN_H */ diff --git a/include/sys/vt.h b/include/sys/vt.h deleted file mode 100644 index 092ae0d..0000000 --- a/include/sys/vt.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef _VT_H -#define _VT_H - -/* 0x56 is 'V', to avoid collision with termios and kd */ - -#define VT_OPENQRY 0x5600 /* find available vt */ - -struct vt_mode { - char mode; /* vt mode */ - char waitv; /* if set, hang on writes if not active */ - short relsig; /* signal to raise on release req */ - short acqsig; /* signal to raise on acquisition */ - short frsig; /* unused (set to 0) */ -}; -#define VT_GETMODE 0x5601 /* get mode of active vt */ -#define VT_SETMODE 0x5602 /* set mode of active vt */ -#define VT_AUTO 0x00 /* auto vt switching */ -#define VT_PROCESS 0x01 /* process controls switching */ - -struct vt_stat { - ushort v_active; /* active vt */ - ushort v_signal; /* signal to send */ - ushort v_state; /* vt bitmask */ -}; -#define VT_GETSTATE 0x5603 /* get global vt state info */ -#define VT_SENDSIG 0x5604 /* signal to send to bitmask of vts */ - -#define VT_RELDISP 0x5605 /* release display */ - -#define VT_ACTIVATE 0x5606 /* make vt active */ - -#endif /* _VT_H */ diff --git a/include/time.h b/include/time.h deleted file mode 100644 index 66aa634..0000000 --- a/include/time.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef _TIME_H -#define _TIME_H - -#ifndef _TIME_T -#define _TIME_T -typedef long time_t; -#endif - -#ifndef _SIZE_T -#define _SIZE_T -typedef unsigned int size_t; -#endif - -#ifndef NULL -#define NULL ((void *) 0) -#endif - -#define CLOCKS_PER_SEC 100 - -#ifndef _CLOCK_T -#define _CLOCK_T -typedef long clock_t; -#endif - -struct tm { - int tm_sec; - int tm_min; - int tm_hour; - int tm_mday; - int tm_mon; - int tm_year; - int tm_wday; - int tm_yday; - int tm_isdst; -}; - -#define __isleap(year) \ - ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0)) - -#ifdef __cplusplus -extern "C" { -#endif - -clock_t clock(void); -time_t time(time_t * tp); -double difftime(time_t time2, time_t time1); -time_t mktime(struct tm * tp); - -char * asctime(const struct tm * tp); -char * ctime(const time_t * tp); -struct tm * gmtime(const time_t *tp); -struct tm *localtime(const time_t * tp); -size_t strftime(char * s, size_t smax, const char * fmt, const struct tm * tp); -void tzset(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/init/main.c b/init/main.c index 110a569..1012114 100644 --- a/init/main.c +++ b/init/main.c @@ -162,8 +162,8 @@ void start_kernel(void) envp_init[1] = term; memory_end = (1<<20) + (EXT_MEM_K<<10); memory_end &= 0xfffff000; - if (memory_end > 16*1024*1024) - memory_end = 16*1024*1024; + if (memory_end > MAX_MEGABYTES*1024*1024) + memory_end = MAX_MEGABYTES*1024*1024; memory_start = 1024*1024; low_memory_start = (unsigned long) &end; low_memory_start += 0xfff; diff --git a/kernel/Makefile b/kernel/Makefile index 279afa8..f189aaf 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -52,111 +52,115 @@ dep: dummy: ### Dependencies: -exit.o : exit.c /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/signal.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/types.h \ - /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/time.h \ - /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/tty.h /usr/src/linux/include/linux/termios.h /usr/src/linux/include/asm/system.h \ - /usr/src/linux/include/asm/segment.h -fork.o : fork.c /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/stddef.h /usr/src/linux/include/asm/segment.h /usr/src/linux/include/asm/system.h -ioport.o : ioport.c /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/errno.h -irq.o : irq.c /usr/src/linux/include/linux/ptrace.h /usr/src/linux/include/linux/errno.h \ - /usr/src/linux/include/linux/signal.h /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h \ - /usr/src/linux/include/linux/resource.h /usr/src/linux/include/asm/system.h \ - /usr/src/linux/include/asm/io.h /usr/src/linux/include/asm/irq.h -itimer.o : itimer.c /usr/src/linux/include/linux/signal.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/time.h \ - /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/string.h /usr/src/linux/include/linux/errno.h /usr/src/linux/include/asm/segment.h -mktime.o : mktime.c /usr/src/linux/include/time.h -panic.o : panic.c /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/signal.h /usr/src/linux/include/linux/time.h \ - /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h -printk.o : printk.c /usr/src/linux/include/stdarg.h /usr/src/linux/include/asm/segment.h \ - /usr/src/linux/include/asm/system.h /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h -ptrace.o : ptrace.c /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/kernel.h \ - /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/signal.h /usr/src/linux/include/linux/time.h \ - /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/ptrace.h /usr/src/linux/include/asm/segment.h \ - /usr/src/linux/include/asm/system.h -sched.o : sched.c /usr/src/linux/include/linux/signal.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/time.h \ - /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/timer.h /usr/src/linux/include/linux/sys.h /usr/src/linux/include/linux/fdreg.h \ - /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/ptrace.h /usr/src/linux/include/asm/system.h \ - /usr/src/linux/include/asm/io.h /usr/src/linux/include/asm/segment.h -signal.o : signal.c /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/ptrace.h /usr/src/linux/include/asm/segment.h -sys.o : sys.c /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/tty.h /usr/src/linux/include/linux/termios.h /usr/src/linux/include/asm/system.h \ - /usr/src/linux/include/linux/config.h /usr/src/linux/include/linux/config_rel.h \ - /usr/src/linux/include/linux/config_ver.h /usr/src/linux/include/linux/config.dist.h \ - /usr/src/linux/include/linux/times.h /usr/src/linux/include/linux/utsname.h \ - /usr/src/linux/include/linux/string.h /usr/src/linux/include/asm/segment.h -traps.o : traps.c /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/string.h /usr/src/linux/include/linux/errno.h /usr/src/linux/include/asm/system.h \ - /usr/src/linux/include/asm/segment.h /usr/src/linux/include/asm/io.h -vsprintf.o : vsprintf.c /usr/src/linux/include/stdarg.h /usr/src/linux/include/linux/types.h \ - /usr/src/linux/include/linux/string.h +exit.o : exit.c /usr/include/linux/wait.h /usr/include/linux/limits.h /usr/include/linux/errno.h \ + /usr/include/linux/signal.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/types.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h \ + /usr/include/linux/kernel.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/tty.h \ + /usr/include/linux/termios.h /usr/include/asm/system.h /usr/include/asm/segment.h +fork.o : fork.c /usr/include/linux/errno.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/stddef.h \ + /usr/include/asm/segment.h /usr/include/asm/system.h +ioport.o : ioport.c /usr/include/linux/sched.h /usr/include/linux/head.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/types.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/errno.h +irq.o : irq.c /usr/include/linux/ptrace.h /usr/include/linux/errno.h /usr/include/linux/signal.h \ + /usr/include/linux/sched.h /usr/include/linux/head.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/types.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/time.h \ + /usr/include/linux/param.h /usr/include/linux/resource.h /usr/include/linux/vm86.h \ + /usr/include/asm/system.h /usr/include/asm/io.h /usr/include/asm/irq.h +itimer.o : itimer.c /usr/include/linux/signal.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/string.h /usr/include/linux/errno.h \ + /usr/include/asm/segment.h +mktime.o : mktime.c /usr/include/linux/mktime.h +panic.o : panic.c /usr/include/linux/kernel.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h +printk.o : printk.c /usr/lib/gcc-lib/i386-linux/2.2.2d/include/stdarg.h /usr/include/asm/segment.h \ + /usr/include/asm/system.h /usr/include/linux/errno.h /usr/include/linux/sched.h \ + /usr/include/linux/head.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/types.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h \ + /usr/include/linux/kernel.h /usr/include/linux/signal.h /usr/include/linux/time.h \ + /usr/include/linux/param.h /usr/include/linux/resource.h /usr/include/linux/vm86.h +ptrace.o : ptrace.c /usr/include/linux/head.h /usr/include/linux/kernel.h /usr/include/linux/sched.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/errno.h /usr/include/linux/ptrace.h \ + /usr/include/asm/segment.h /usr/include/asm/system.h +sched.o : sched.c /usr/include/linux/signal.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/timer.h /usr/include/linux/sys.h \ + /usr/include/linux/fdreg.h /usr/include/linux/errno.h /usr/include/linux/ptrace.h \ + /usr/include/asm/system.h /usr/include/asm/io.h /usr/include/asm/segment.h +signal.o : signal.c /usr/include/linux/sched.h /usr/include/linux/head.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/types.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/errno.h /usr/include/linux/ptrace.h \ + /usr/include/asm/segment.h +sys.o : sys.c /usr/include/linux/errno.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/tty.h \ + /usr/include/linux/termios.h /usr/include/asm/system.h /usr/include/linux/config.h \ + /usr/include/linux/config.dist.h /usr/include/linux/times.h /usr/include/linux/utsname.h \ + /usr/include/linux/string.h /usr/include/linux/ptrace.h /usr/include/asm/segment.h +traps.o : traps.c /usr/include/linux/head.h /usr/include/linux/sched.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/types.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/string.h /usr/include/linux/errno.h \ + /usr/include/asm/system.h /usr/include/asm/segment.h /usr/include/asm/io.h +vsprintf.o : vsprintf.c /usr/lib/gcc-lib/i386-linux/2.2.2d/include/stdarg.h \ + /usr/include/linux/types.h /usr/include/linux/string.h diff --git a/kernel/blk_drv/Makefile b/kernel/blk_drv/Makefile index f4ddb35..ccbe8ed 100644 --- a/kernel/blk_drv/Makefile +++ b/kernel/blk_drv/Makefile @@ -44,43 +44,41 @@ dep: dummy: ### Dependencies: -floppy.o : floppy.c /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/timer.h /usr/src/linux/include/linux/fdreg.h /usr/src/linux/include/linux/fd.h \ - /usr/src/linux/include/linux/errno.h /usr/src/linux/include/asm/system.h /usr/src/linux/include/asm/io.h \ - /usr/src/linux/include/asm/segment.h blk.h -genhd.o : genhd.c /usr/src/linux/include/linux/config.h /usr/src/linux/include/linux/config_rel.h \ - /usr/src/linux/include/linux/config_ver.h /usr/src/linux/include/linux/config.dist.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/genhd.h \ - /usr/src/linux/include/linux/kernel.h -hd.o : hd.c /usr/src/linux/include/linux/config.h /usr/src/linux/include/linux/config_rel.h \ - /usr/src/linux/include/linux/config_ver.h /usr/src/linux/include/linux/config.dist.h \ - /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/signal.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/time.h \ - /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/timer.h /usr/src/linux/include/linux/hdreg.h /usr/src/linux/include/linux/genhd.h \ - /usr/src/linux/include/asm/system.h /usr/src/linux/include/asm/io.h /usr/src/linux/include/asm/segment.h \ +floppy.o : floppy.c /usr/include/linux/sched.h /usr/include/linux/head.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/types.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/timer.h /usr/include/linux/fdreg.h \ + /usr/include/linux/fd.h /usr/include/linux/errno.h /usr/include/asm/system.h \ + /usr/include/asm/io.h /usr/include/asm/segment.h blk.h +genhd.o : genhd.c /usr/include/linux/config.h /usr/include/linux/config.dist.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/genhd.h /usr/include/linux/kernel.h +hd.o : hd.c /usr/include/linux/config.h /usr/include/linux/config.dist.h /usr/include/linux/errno.h \ + /usr/include/linux/signal.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/timer.h /usr/include/linux/hdreg.h \ + /usr/include/linux/genhd.h /usr/include/asm/system.h /usr/include/asm/io.h /usr/include/asm/segment.h \ blk.h -ll_rw_blk.o : ll_rw_blk.c /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/string.h /usr/src/linux/include/asm/system.h \ - blk.h -ramdisk.o : ramdisk.c /usr/src/linux/include/linux/config.h /usr/src/linux/include/linux/config_rel.h \ - /usr/src/linux/include/linux/config_ver.h /usr/src/linux/include/linux/config.dist.h +ll_rw_blk.o : ll_rw_blk.c /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/errno.h \ + /usr/include/linux/string.h /usr/include/linux/config.h /usr/include/linux/config.dist.h \ + /usr/include/asm/system.h blk.h +ramdisk.o : ramdisk.c /usr/include/linux/config.h /usr/include/linux/config.dist.h diff --git a/kernel/blk_drv/genhd.c b/kernel/blk_drv/genhd.c index 6618ce1..6addf89 100644 --- a/kernel/blk_drv/genhd.c +++ b/kernel/blk_drv/genhd.c @@ -63,7 +63,7 @@ static void extended_partition(struct gendisk *hd, int dev) goto done; /* shouldn't happen */ hd->part[current_minor].start_sect = this_sector + p->start_sect; printk(" Logical part %d start %d size %d end %d\n\r", - current_minor, hd->part[current_minor].start_sect, + mask & current_minor, hd->part[current_minor].start_sect, hd->part[current_minor].nr_sects, hd->part[current_minor].start_sect + hd->part[current_minor].nr_sects - 1); @@ -96,6 +96,7 @@ static void check_partition(struct gendisk *hd, unsigned int dev) struct buffer_head *bh; struct partition *p; unsigned long first_sector; + int mask = (1 << hd->minor_shift) - 1; first_sector = hd->part[MINOR(dev)].start_sect; @@ -103,7 +104,7 @@ static void check_partition(struct gendisk *hd, unsigned int dev) printk("Unable to read partition table of device %04x\n",dev); return; } - printk("%s%d :\n\r", hd->major_name, minor >> hd->minor_shift); + printk("%s%c :\n\r", hd->major_name, 'a'+(minor >> hd->minor_shift)); current_minor += 4; /* first "extra" minor */ if (*(unsigned short *) (bh->b_data+510) == 0xAA55) { p = 0x1BE + (void *)bh->b_data; @@ -127,14 +128,14 @@ static void check_partition(struct gendisk *hd, unsigned int dev) p = 0x1BE + (void *)bh->b_data; for (i = 4 ; i < 16 ; i++, current_minor++) { p--; - if ((current_minor & 0x3f) >= 60) + if ((current_minor & mask) >= mask-2) break; if (!(p->start_sect && p->nr_sects)) continue; hd->part[current_minor].start_sect = p->start_sect; hd->part[current_minor].nr_sects = p->nr_sects; printk(" DM part %d start %d size %d end %d\n\r", - current_minor, + current_minor & mask, hd->part[current_minor].start_sect, hd->part[current_minor].nr_sects, hd->part[current_minor].start_sect + diff --git a/kernel/blk_drv/hd.c b/kernel/blk_drv/hd.c index 3652c96..39a4fc1 100644 --- a/kernel/blk_drv/hd.c +++ b/kernel/blk_drv/hd.c @@ -251,23 +251,27 @@ static inline int wait_DRQ(void) static void read_intr(void) { int i; + int retries = 100000; - i = (unsigned) inb_p(HD_STATUS); - if ((i & STAT_MASK) != STAT_OK) { - printk("HD: read_intr: status = 0x%02x\n",i); - goto bad_read; - } - if (wait_DRQ()) { - printk("HD: read_intr: no DRQ\n"); - goto bad_read; + do { + i = (unsigned) inb_p(HD_STATUS); + if ((i & STAT_MASK) != STAT_OK) + break; + if (i & DRQ_STAT) + goto ok_to_read; + } while (--retries > 0); + sti(); + printk("HD: read_intr: status = 0x%02x\n",i); + if (i & ERR_STAT) { + i = (unsigned) inb(HD_ERROR); + printk("HD: read_intr: error = 0x%02x\n",i); } + bad_rw_intr(); + cli(); + do_hd_request(); + return; +ok_to_read: port_read(HD_DATA,CURRENT->buffer,256); - i = (unsigned) inb_p(HD_STATUS); - if (!(i & BUSY_STAT)) - if ((i & STAT_MASK) != STAT_OK) { - printk("HD: read_intr: second status = 0x%02x\n",i); - goto bad_read; - } CURRENT->errors = 0; CURRENT->buffer += 512; CURRENT->sector++; @@ -290,29 +294,31 @@ static void read_intr(void) #endif do_hd_request(); return; -bad_read: - if (i & ERR_STAT) { - i = (unsigned) inb(HD_ERROR); - printk("HD: read_intr: error = 0x%02x\n",i); - } - bad_rw_intr(); - do_hd_request(); - return; } static void write_intr(void) { int i; + int retries = 100000; - i = (unsigned) inb_p(HD_STATUS); - if ((i & STAT_MASK) != STAT_OK) { - printk("HD: write_intr: status = 0x%02x\n",i); - goto bad_write; - } - if (CURRENT->nr_sectors > 1 && wait_DRQ()) { - printk("HD: write_intr: no DRQ\n"); - goto bad_write; + do { + i = (unsigned) inb_p(HD_STATUS); + if ((i & STAT_MASK) != STAT_OK) + break; + if ((CURRENT->nr_sectors <= 1) || (i & DRQ_STAT)) + goto ok_to_write; + } while (--retries > 0); + sti(); + printk("HD: write_intr: status = 0x%02x\n",i); + if (i & ERR_STAT) { + i = (unsigned) inb(HD_ERROR); + printk("HD: write_intr: error = 0x%02x\n",i); } + bad_rw_intr(); + cli(); + do_hd_request(); + return; +ok_to_write: CURRENT->sector++; i = --CURRENT->nr_sectors; --CURRENT->current_nr_sectors; @@ -330,16 +336,6 @@ static void write_intr(void) do_hd_request(); } return; -bad_write: - sti(); - if (i & ERR_STAT) { - i = (unsigned) inb(HD_ERROR); - printk("HD: write_intr: error = 0x%02x\n",i); - } - bad_rw_intr(); - cli(); - do_hd_request(); - return; } static void recal_intr(void) @@ -587,7 +583,7 @@ static void hd_interrupt(int unused) } /* - * This is the harddisk IRQ descruption. The SA_INTERRUPT in sa_flags + * This is the harddisk IRQ description. The SA_INTERRUPT in sa_flags * means we run the IRQ-handler with interrupts disabled: this is bad for * interrupt latency, but anything else has led to problems on some * machines... diff --git a/kernel/blk_drv/scsi/Makefile b/kernel/blk_drv/scsi/Makefile index 10d5305..2ed7206 100644 --- a/kernel/blk_drv/scsi/Makefile +++ b/kernel/blk_drv/scsi/Makefile @@ -40,7 +40,7 @@ max_hosts.h : figure echo "#define MAX_SCSI_HOSTS `./figure`";\ echo "#endif") > tmp_max cp tmp_max max_hosts.h - + scsi.a: $(OBJS) $(AR) rcs scsi.a $(OBJS) sync @@ -56,113 +56,126 @@ seagate.o: seagate.c dep: touch max_hosts.h sed '/\#\#\# Dependencies/q' < Makefile > tmp_make - for i in *.c;do $(CPP) -M $$i;done >> tmp_make + $(CPP) -M *.c >> tmp_make rm max_hosts.h cp tmp_make Makefile ### Dependencies: -7000fasst.o : 7000fasst.c /usr/src/linux/include/linux/config.h /usr/src/linux/include/linux/config_rel.h \ - /usr/src/linux/include/linux/config_ver.h /usr/src/linux/include/linux/config.dist.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/types.h \ - /usr/src/linux/include/linux/string.h /usr/src/linux/include/asm/system.h /usr/src/linux/include/asm/io.h \ +7000fasst.o : 7000fasst.c /usr/include/linux/config.h /usr/include/linux/config.dist.h \ + /usr/include/linux/kernel.h /usr/include/linux/head.h /usr/include/linux/types.h \ + /usr/include/linux/string.h /usr/include/asm/system.h /usr/include/asm/io.h \ scsi.h hosts.h max_hosts.h 7000fasst.h -aha1542.o : aha1542.c /usr/src/linux/include/linux/config.h /usr/src/linux/include/linux/config_rel.h \ - /usr/src/linux/include/linux/config_ver.h /usr/src/linux/include/linux/config.dist.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/types.h \ - /usr/src/linux/include/linux/string.h /usr/src/linux/include/asm/system.h /usr/src/linux/include/asm/io.h \ +aha1542.o : aha1542.c /usr/include/linux/config.h /usr/include/linux/config.dist.h \ + /usr/include/linux/kernel.h /usr/include/linux/head.h /usr/include/linux/types.h \ + /usr/include/linux/string.h /usr/include/asm/system.h /usr/include/asm/io.h \ scsi.h hosts.h max_hosts.h aha1542.h -fdomain.o : fdomain.c /usr/src/linux/include/linux/config.h /usr/src/linux/include/linux/config_rel.h \ - /usr/src/linux/include/linux/config_ver.h /usr/src/linux/include/linux/config.dist.h \ - /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h \ - /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h \ - /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/asm/io.h fdomain.h scsi.h hosts.h max_hosts.h /usr/src/linux/include/asm/system.h \ - /usr/src/linux/include/linux/errno.h -hosts.o : hosts.c /usr/src/linux/include/linux/config.h /usr/src/linux/include/linux/config_rel.h \ - /usr/src/linux/include/linux/config_ver.h /usr/src/linux/include/linux/config.dist.h \ - /usr/src/linux/include/linux/kernel.h scsi.h hosts.h max_hosts.h aha1542.h /usr/src/linux/include/linux/types.h \ +fdomain.o : fdomain.c /usr/include/linux/config.h /usr/include/linux/config.dist.h \ + /usr/include/linux/sched.h /usr/include/linux/head.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/types.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/asm/io.h fdomain.h scsi.h hosts.h max_hosts.h \ + /usr/include/asm/system.h /usr/include/linux/errno.h +hosts.o : hosts.c /usr/include/linux/config.h /usr/include/linux/config.dist.h \ + /usr/include/linux/kernel.h scsi.h hosts.h max_hosts.h aha1542.h /usr/include/linux/types.h \ fdomain.h seagate.h ultrastor.h 7000fasst.h -scsi.o : scsi.c /usr/src/linux/include/linux/config.h /usr/src/linux/include/linux/config_rel.h \ - /usr/src/linux/include/linux/config_ver.h /usr/src/linux/include/linux/config.dist.h \ - /usr/src/linux/include/asm/system.h /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/timer.h /usr/src/linux/include/linux/string.h scsi.h \ - hosts.h max_hosts.h sd.h /usr/src/linux/include/linux/genhd.h st.h -scsi_ioctl.o : scsi_ioctl.c /usr/src/linux/include/linux/config.h /usr/src/linux/include/linux/config_rel.h \ - /usr/src/linux/include/linux/config_ver.h /usr/src/linux/include/linux/config.dist.h \ - /usr/src/linux/include/asm/io.h /usr/src/linux/include/asm/segment.h /usr/src/linux/include/asm/system.h \ - /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/signal.h /usr/src/linux/include/linux/time.h \ - /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/string.h scsi.h hosts.h max_hosts.h scsi_ioctl.h -sd.o : sd.c /usr/src/linux/include/linux/config.h /usr/src/linux/include/linux/config_rel.h \ - /usr/src/linux/include/linux/config_ver.h /usr/src/linux/include/linux/config.dist.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/kernel.h \ - /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/signal.h /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h \ - /usr/src/linux/include/linux/resource.h /usr/src/linux/include/linux/string.h \ - scsi.h sd.h /usr/src/linux/include/linux/genhd.h ../blk.h -sd_ioctl.o : sd_ioctl.c /usr/src/linux/include/linux/config.h /usr/src/linux/include/linux/config_rel.h \ - /usr/src/linux/include/linux/config_ver.h /usr/src/linux/include/linux/config.dist.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/signal.h /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h \ - /usr/src/linux/include/linux/resource.h scsi.h sd.h /usr/src/linux/include/linux/genhd.h -seagate.o : seagate.c /usr/src/linux/include/linux/config.h /usr/src/linux/include/linux/config_rel.h \ - /usr/src/linux/include/linux/config_ver.h /usr/src/linux/include/linux/config.dist.h \ - /usr/src/linux/include/asm/io.h /usr/src/linux/include/asm/system.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - seagate.h scsi.h hosts.h max_hosts.h -st.o : st.c /usr/src/linux/include/linux/config.h /usr/src/linux/include/linux/config_rel.h \ - /usr/src/linux/include/linux/config_ver.h /usr/src/linux/include/linux/config.dist.h \ - scsi.h st.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/signal.h /usr/src/linux/include/linux/time.h \ - /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - ../blk.h -st_ioctl.o : st_ioctl.c /usr/src/linux/include/linux/config.h /usr/src/linux/include/linux/config_rel.h \ - /usr/src/linux/include/linux/config_ver.h /usr/src/linux/include/linux/config.dist.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/signal.h /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h \ - /usr/src/linux/include/linux/resource.h st.h scsi.h -ultrastor.o : ultrastor.c /usr/src/linux/include/linux/config.h /usr/src/linux/include/linux/config_rel.h \ - /usr/src/linux/include/linux/config_ver.h /usr/src/linux/include/linux/config.dist.h \ - /usr/src/linux/include/linux/stddef.h /usr/src/linux/include/linux/string.h \ - /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h \ - /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h \ - /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/asm/io.h /usr/src/linux/include/asm/system.h ultrastor.h \ - scsi.h hosts.h max_hosts.h +scsi.o : scsi.c /usr/include/linux/config.h /usr/include/linux/config.dist.h \ + /usr/include/asm/system.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/timer.h \ + /usr/include/linux/string.h scsi.h hosts.h max_hosts.h sd.h /usr/include/linux/genhd.h \ + st.h sr.h +scsi_ioctl.o : scsi_ioctl.c /usr/include/linux/config.h /usr/include/linux/config.dist.h \ + /usr/include/asm/io.h /usr/include/asm/segment.h /usr/include/asm/system.h /usr/include/linux/errno.h \ + /usr/include/linux/kernel.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/string.h scsi.h hosts.h max_hosts.h \ + scsi_ioctl.h +sd.o : sd.c /usr/include/linux/config.h /usr/include/linux/config.dist.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/types.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/kernel.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/mm.h /usr/include/linux/signal.h /usr/include/linux/time.h \ + /usr/include/linux/param.h /usr/include/linux/resource.h /usr/include/linux/vm86.h \ + /usr/include/linux/string.h scsi.h sd.h /usr/include/linux/genhd.h ../blk.h +sd_ioctl.o : sd_ioctl.c /usr/include/linux/config.h /usr/include/linux/config.dist.h \ + /usr/include/linux/kernel.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h scsi.h sd.h /usr/include/linux/genhd.h +seagate.o : seagate.c /usr/include/linux/config.h /usr/include/linux/config.dist.h \ + /usr/include/asm/io.h /usr/include/asm/system.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h seagate.h scsi.h hosts.h \ + max_hosts.h +sr.o : sr.c /usr/include/linux/config.h /usr/include/linux/config.dist.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/types.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/kernel.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/mm.h /usr/include/linux/signal.h /usr/include/linux/time.h \ + /usr/include/linux/param.h /usr/include/linux/resource.h /usr/include/linux/vm86.h \ + /usr/include/linux/string.h scsi.h sr.h ../blk.h +sr_ioctl.o : sr_ioctl.c /usr/include/linux/config.h /usr/include/linux/config.dist.h \ + /usr/include/linux/kernel.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/asm/segment.h /usr/include/linux/errno.h \ + ../blk.h scsi.h sr.h /usr/include/linux/cdrom.h +st.o : st.c /usr/include/linux/config.h /usr/include/linux/config.dist.h scsi.h \ + st.h /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/kernel.h /usr/include/linux/sched.h \ + /usr/include/linux/head.h /usr/include/linux/mm.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h ../blk.h +st_ioctl.o : st_ioctl.c /usr/include/linux/config.h /usr/include/linux/config.dist.h \ + /usr/include/linux/kernel.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h st.h scsi.h +ultrastor.o : ultrastor.c /usr/include/linux/config.h /usr/include/linux/config.dist.h \ + /usr/include/linux/stddef.h /usr/include/linux/string.h /usr/include/linux/sched.h \ + /usr/include/linux/head.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/types.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h \ + /usr/include/linux/kernel.h /usr/include/linux/signal.h /usr/include/linux/time.h \ + /usr/include/linux/param.h /usr/include/linux/resource.h /usr/include/linux/vm86.h \ + /usr/include/asm/io.h /usr/include/asm/system.h ultrastor.h scsi.h hosts.h max_hosts.h diff --git a/kernel/blk_drv/scsi/ultrastor.c b/kernel/blk_drv/scsi/ultrastor.c index 279448f..6b6b172 100644 --- a/kernel/blk_drv/scsi/ultrastor.c +++ b/kernel/blk_drv/scsi/ultrastor.c @@ -1,5 +1,5 @@ /* - * ultrastor.c Copyright (C) 1991, 1992 David B. Gentzel + * ultrastor.c Copyright (C) 1992 David B. Gentzel * Low-level SCSI driver for UltraStor 14F * by David B. Gentzel, Whitfield Software Services, Carnegie, PA * (gentzel@nova.enet.dec.com) @@ -24,9 +24,8 @@ /* * CAVEATS: ??? * This driver is VERY stupid. It takes no advantage of much of the power - * of the UltraStor controller. We just sit-and-spin while waiting for - * commands to complete. I hope to go back and beat it into shape, but - * PLEASE, anyone else who would like to, please make improvements! + * of the UltraStor controller. I hope to go back and beat it into shape, + * but PLEASE, anyone else who would like to, please make improvements! * * By defining NO_QUEUEING in ultrastor.h, you disable the queueing feature * of the mid-level SCSI driver. Once I'm satisfied that the queueing @@ -155,7 +154,7 @@ static const unsigned short ultrastor_ports[] = { }; #endif -void ultrastor_interrupt(void); +static void ultrastor_interrupt(int cpl); static void (*ultrastor_done)(int, int) = 0; @@ -292,11 +291,19 @@ int ultrastor_14f_detect(int hostnum) host_number = hostnum; scsi_hosts[hostnum].this_id = config.ha_scsi_id; #ifndef NO_QUEUEING - set_intr_gate(0x20 + config.interrupt, ultrastor_interrupt); - /* gate to PIC 2 */ - outb_p(inb_p(0x21) & ~BIT(2), 0x21); - /* enable the interrupt */ - outb(inb_p(0xA1) & ~BIT(config.interrupt - 8), 0xA1); + { + struct sigaction sa; + + sa.sa_handler = ultrastor_interrupt; + sa.sa_mask = 0; + sa.sa_flags = SA_INTERRUPT; /* ??? Do we really need this? */ + sa.sa_restorer = 0; + if (irqaction(config.interrupt, &sa)) { + printk("Unable to get IRQ%u for UltraStor controller\n", + config.interrupt); + return FALSE; + } + } #endif return TRUE; } @@ -309,7 +316,7 @@ const char *ultrastor_14f_info(void) } static struct mscp mscp = { - OP_SCSI, DTD_SCSI, FALSE, TRUE, FALSE /* This stuff doesn't change */ + OP_SCSI, DTD_SCSI, 0, 1, 0 /* This stuff doesn't change */ }; int ultrastor_14f_queuecommand(unsigned char target, const void *cmnd, @@ -437,15 +444,15 @@ int ultrastor_14f_reset(void) } #ifndef NO_QUEUEING -void ultrastor_interrupt_service(void) +static void ultrastor_interrupt(int cpl) { #if (ULTRASTOR_DEBUG & UD_INTERRUPT) - printk("US14F: interrupt_service: called: status = %08X\n", + printk("US14F: interrupt: called: status = %08X\n", (mscp.adapter_status << 16) | mscp.target_status); #endif if (ultrastor_done == 0) - panic("US14F: interrupt_service: unexpected interrupt!\n"); + panic("US14F: interrupt: unexpected interrupt!\n"); else { void (*done)(int, int); @@ -464,40 +471,9 @@ void ultrastor_interrupt_service(void) } #if (ULTRASTOR_DEBUG & UD_INTERRUPT) - printk("US14F: interrupt_service: returning\n"); + printk("US14F: interrupt: returning\n"); #endif } - -__asm__(" -_ultrastor_interrupt: - cld - pushl %eax - pushl %ecx - pushl %edx - push %ds - push %es - push %fs - movl $0x10,%eax - mov %ax,%ds - mov %ax,%es - movl $0x17,%eax - mov %ax,%fs - movb $0x20,%al - outb %al,$0xA0 # EOI to interrupt controller #1 - outb %al,$0x80 # give port chance to breathe - outb %al,$0x80 - outb %al,$0x80 - outb %al,$0x80 - outb %al,$0x20 - call _ultrastor_interrupt_service - pop %fs - pop %es - pop %ds - popl %edx - popl %ecx - popl %eax - iret -"); #endif #endif diff --git a/kernel/chr_drv/Makefile b/kernel/chr_drv/Makefile index 484e9b6..740d377 100644 --- a/kernel/chr_drv/Makefile +++ b/kernel/chr_drv/Makefile @@ -35,103 +35,125 @@ clean: dep: sed '/\#\#\# Dependencies/q' < Makefile > tmp_make - for i in *.c;do $(CPP) -M -DKBD_FINNISH $$i;done >> tmp_make + $(CPP) -M $(KEYBOARD) *.c >> tmp_make cp tmp_make Makefile ### Dependencies: -console.o : console.c /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/timer.h /usr/src/linux/include/linux/tty.h /usr/src/linux/include/linux/termios.h \ - /usr/src/linux/include/asm/system.h /usr/src/linux/include/linux/config.h /usr/src/linux/include/linux/config_rel.h \ - /usr/src/linux/include/linux/config_ver.h /usr/src/linux/include/linux/config.dist.h \ - /usr/src/linux/include/linux/string.h /usr/src/linux/include/linux/errno.h /usr/src/linux/include/asm/io.h \ - /usr/src/linux/include/asm/segment.h /usr/src/linux/include/sys/kd.h vt_kern.h -keyboard.o : keyboard.c /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/ctype.h /usr/src/linux/include/linux/tty.h /usr/src/linux/include/linux/termios.h \ - /usr/src/linux/include/asm/system.h /usr/src/linux/include/linux/ptrace.h /usr/src/linux/include/asm/io.h -lp.o : lp.c /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/lp.h /usr/src/linux/include/linux/errno.h /usr/src/linux/include/asm/io.h \ - /usr/src/linux/include/asm/segment.h -mem.o : mem.c /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/errno.h \ - /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h \ - /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/tty.h /usr/src/linux/include/linux/termios.h /usr/src/linux/include/asm/system.h \ - /usr/src/linux/include/linux/mouse.h /usr/src/linux/include/asm/segment.h /usr/src/linux/include/asm/io.h -mouse.o : mouse.c /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/signal.h /usr/src/linux/include/linux/time.h \ - /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/mouse.h /usr/src/linux/include/linux/tty.h /usr/src/linux/include/linux/termios.h \ - /usr/src/linux/include/asm/system.h /usr/src/linux/include/linux/errno.h /usr/src/linux/include/asm/io.h \ - /usr/src/linux/include/asm/segment.h /usr/src/linux/include/asm/irq.h -pty.o : pty.c /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/tty.h /usr/src/linux/include/linux/termios.h /usr/src/linux/include/asm/system.h \ - /usr/src/linux/include/linux/fcntl.h /usr/src/linux/include/asm/io.h -serial.o : serial.c /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h \ - /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h \ - /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/time.h \ - /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/timer.h /usr/src/linux/include/linux/tty.h /usr/src/linux/include/linux/termios.h \ - /usr/src/linux/include/asm/system.h /usr/src/linux/include/asm/io.h /usr/src/linux/include/asm/segment.h -tty_io.o : tty_io.c /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/errno.h \ - /usr/src/linux/include/linux/signal.h /usr/src/linux/include/linux/fcntl.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h \ - /usr/src/linux/include/linux/resource.h /usr/src/linux/include/linux/tty.h /usr/src/linux/include/linux/termios.h \ - /usr/src/linux/include/asm/system.h /usr/src/linux/include/linux/ctype.h /usr/src/linux/include/asm/io.h \ - /usr/src/linux/include/asm/segment.h /usr/src/linux/include/sys/kd.h vt_kern.h -tty_ioctl.o : tty_ioctl.c /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/termios.h \ - /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/tty.h /usr/src/linux/include/asm/system.h /usr/src/linux/include/linux/fcntl.h \ - /usr/src/linux/include/asm/io.h /usr/src/linux/include/asm/segment.h -vt.o : vt.c /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/errno.h \ - /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h \ - /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/tty.h /usr/src/linux/include/linux/termios.h /usr/src/linux/include/asm/system.h \ - /usr/src/linux/include/linux/timer.h /usr/src/linux/include/asm/io.h /usr/src/linux/include/asm/segment.h \ - vt_kern.h /usr/src/linux/include/sys/kd.h /usr/src/linux/include/sys/vt.h +busmouse.o : busmouse.c /usr/include/linux/kernel.h /usr/include/linux/sched.h \ + /usr/include/linux/head.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/types.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/busmouse.h \ + /usr/include/linux/tty.h /usr/include/linux/termios.h /usr/include/asm/system.h \ + /usr/include/linux/errno.h /usr/include/asm/io.h /usr/include/asm/segment.h \ + /usr/include/asm/irq.h +console.o : console.c /usr/include/linux/sched.h /usr/include/linux/head.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/types.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/timer.h /usr/include/linux/tty.h \ + /usr/include/linux/termios.h /usr/include/asm/system.h /usr/include/linux/config.h \ + /usr/include/linux/config.dist.h /usr/include/linux/string.h /usr/include/linux/errno.h \ + /usr/include/linux/kd.h /usr/include/asm/io.h /usr/include/asm/segment.h vt_kern.h +keyboard.o : keyboard.c /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/ctype.h \ + /usr/include/linux/tty.h /usr/include/linux/termios.h /usr/include/asm/system.h \ + /usr/include/linux/ptrace.h /usr/include/asm/io.h +lp.o : lp.c /usr/include/linux/sched.h /usr/include/linux/head.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/types.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/lp.h /usr/include/linux/errno.h \ + /usr/include/asm/io.h /usr/include/asm/segment.h +mem.o : mem.c /usr/include/linux/types.h /usr/include/linux/errno.h /usr/include/linux/sched.h \ + /usr/include/linux/head.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/tty.h \ + /usr/include/linux/termios.h /usr/include/asm/system.h /usr/include/linux/mouse.h \ + /usr/include/asm/segment.h /usr/include/asm/io.h +mouse.o : mouse.c /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/errno.h /usr/include/linux/mouse.h +psaux.o : psaux.c /usr/include/linux/timer.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/fcntl.h \ + /usr/include/linux/errno.h /usr/include/asm/io.h /usr/include/asm/segment.h \ + /usr/include/asm/system.h +pty.o : pty.c /usr/include/linux/errno.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/tty.h \ + /usr/include/linux/termios.h /usr/include/asm/system.h /usr/include/linux/fcntl.h \ + /usr/include/asm/io.h +serial.o : serial.c /usr/include/linux/errno.h /usr/include/linux/signal.h /usr/include/linux/sched.h \ + /usr/include/linux/head.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/types.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h \ + /usr/include/linux/kernel.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/timer.h \ + /usr/include/linux/tty.h /usr/include/linux/termios.h /usr/include/asm/system.h \ + /usr/include/linux/serial.h /usr/include/asm/io.h /usr/include/asm/segment.h +tty_io.o : tty_io.c /usr/include/linux/types.h /usr/include/linux/errno.h /usr/include/linux/signal.h \ + /usr/include/linux/fcntl.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/time.h \ + /usr/include/linux/param.h /usr/include/linux/resource.h /usr/include/linux/vm86.h \ + /usr/include/linux/tty.h /usr/include/linux/termios.h /usr/include/asm/system.h \ + /usr/include/linux/ctype.h /usr/include/linux/kd.h /usr/include/linux/string.h \ + /usr/include/asm/io.h /usr/include/asm/segment.h vt_kern.h +tty_ioctl.o : tty_ioctl.c /usr/include/linux/types.h /usr/include/linux/termios.h \ + /usr/include/linux/errno.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/tty.h /usr/include/asm/system.h \ + /usr/include/linux/fcntl.h /usr/include/asm/io.h /usr/include/asm/segment.h +vt.o : vt.c /usr/include/linux/types.h /usr/include/linux/errno.h /usr/include/linux/sched.h \ + /usr/include/linux/head.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/tty.h \ + /usr/include/linux/termios.h /usr/include/asm/system.h /usr/include/linux/timer.h \ + /usr/include/linux/kd.h /usr/include/linux/vt.h /usr/include/asm/io.h /usr/include/asm/segment.h \ + vt_kern.h diff --git a/kernel/chr_drv/busmouse.c b/kernel/chr_drv/busmouse.c index 1b7277a..5b51d71 100644 --- a/kernel/chr_drv/busmouse.c +++ b/kernel/chr_drv/busmouse.c @@ -31,7 +31,12 @@ * Added a couple of new functions to handle differences in using * MS vs. Logitech (where the int variable wasn't appropriate). * - * version 0.2 + * Modified by Peter Cervasio (address above) (26SEP92) + * Changes: Included code to (properly?) detect when a Microsoft mouse is + * really attached to the machine. Don't know what this does to + * Logitech bus mice, but all it does is read ports. + * + * version 0.3 */ #include <linux/kernel.h> @@ -254,9 +259,40 @@ long bus_mouse_init(long kmem_start) return kmem_start; } +#define MS_DELAY 100000 + long ms_bus_mouse_init(long kmem_start) -{ - +{ + register int mse_byte; + int i, delay_val, msfound = 1; + + if (inb(MS_MSE_SIGNATURE_PORT) == 0xde) { + for (delay_val=0; delay_val<MS_DELAY;) delay_val++; + + mse_byte = inb(MS_MSE_SIGNATURE_PORT); + for (delay_val=0; delay_val<MS_DELAY; ) delay_val++; + + for (i = 0; i < 4; i++) { + for (delay_val=0; delay_val<MS_DELAY;) delay_val++; + if (inb(MS_MSE_SIGNATURE_PORT) == 0xde) { + + for (delay_val=0; delay_val<MS_DELAY; ) delay_val++; + if (inb(MS_MSE_SIGNATURE_PORT) == mse_byte) + msfound = 0; + else + msfound = 1; + } + else + msfound = 1; + } + } + + if (msfound == 1) { + printk("No Microsoft bus mouse detected.\n"); + mouse.present = 0; + return kmem_start; + } + MS_MSE_INT_OFF(); mouse.present = 1; diff --git a/kernel/chr_drv/keyboard.c b/kernel/chr_drv/keyboard.c index e3f24a7..2a4d86e 100644 --- a/kernel/chr_drv/keyboard.c +++ b/kernel/chr_drv/keyboard.c @@ -160,7 +160,7 @@ static void puts_queue(char *cp) struct tty_struct *tty = TTY_TABLE(0); unsigned long new_head; char ch; - + wake_up(&keypress_wait); if (!tty) return; @@ -963,6 +963,95 @@ static unsigned char alt_map[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +#elif defined KBD_SF + +static unsigned char key_map[] = { + 0, 27, '1', '2', '3', '4', '5', '6', + '7', '8', '9', '0', '\'', '^', 127, 9, + 'q', 'w', 'e', 'r', 't', 'z', 'u', 'i', + 'o', 'p', 0, 0, 13, 0, 'a', 's', + 'd', 'f', 'g', 'h', 'j', 'k', 'l', 0, + 0, 0, 0, '$', 'y', 'x', 'c', 'v', + 'b', 'n', 'm', ',', '.', '-', 0, '*', + 0, 32, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, '-', 0, 0, 0, '+', 0, + 0, 0, 0, 0, 0, 0, '<', 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0 }; +static unsigned char shift_map[] = { + 0, 27, '+', '"', '*', 0, '%', '&', + '/', '(', ')', '=', '?', '`', 127, 9, + 'Q', 'W', 'E', 'R', 'T', 'Z', 'U', 'I', + 'O', 'P', 0, '!', 13, 0, 'A', 'S', + 'D', 'F', 'G', 'H', 'J', 'K', 'L', 0, + 0, 0, 0, 0, 'Y', 'X', 'C', 'V', + 'B', 'N', 'M', ';', ':', '_', 0, '*', + 0, 32, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, '-', 0, 0, 0, '+', 0, + 0, 0, 0, 0, 0, 0, '>', 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0 }; +static unsigned char alt_map[] = { + 0, 0, 0, '@', '#', 0, 0, 0, + '|', 0, 0, 0, '\'', '~', 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, '[', ']', 13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + '{', 0, 0, '}', 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, '\\', 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0 }; + +#elif defined KBD_SF_LATIN1 + +static unsigned char key_map[] = { + 0, 27, '1', '2', '3', '4', '5', '6', + '7', '8', '9', '0', '\'', '^', 127, 9, + 'q', 'w', 'e', 'r', 't', 'z', 'u', 'i', + 'o', 'p', 232, 168, 13, 0, 'a', 's', + 'd', 'f', 'g', 'h', 'j', 'k', 'l', 233, + 224, 167, 0, '$', 'y', 'x', 'c', 'v', + 'b', 'n', 'm', ',', '.', '-', 0, '*', + 0, 32, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, '-', 0, 0, 0, '+', 0, + 0, 0, 0, 0, 0, 0, '<', 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0 }; +static unsigned char shift_map[] = { + 0, 27, '+', '"', '*', 231, '%', '&', + '/', '(', ')', '=', '?', '`', 127, 9, + 'Q', 'W', 'E', 'R', 'T', 'Z', 'U', 'I', + 'O', 'P', 252, '!', 13, 0, 'A', 'S', + 'D', 'F', 'G', 'H', 'J', 'K', 'L', 246, + 228, 176, 0, 163, 'Y', 'X', 'C', 'V', + 'B', 'N', 'M', ';', ':', '_', 0, '*', + 0, 32, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, '-', 0, 0, 0, '+', 0, + 0, 0, 0, 0, 0, 0, '>', 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0 }; +static unsigned char alt_map[] = { + 0, 0, 0, '@', '#', 0, 0, 172, + '|', 162, 0, 0, 180, '~', 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, '[', ']', 13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + '{', 0, 0, '}', 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, '\\', 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0 }; #else #error "KBD-type not defined" #endif diff --git a/kernel/chr_drv/serial.c b/kernel/chr_drv/serial.c index ca4a615..26eda93 100644 --- a/kernel/chr_drv/serial.c +++ b/kernel/chr_drv/serial.c @@ -328,7 +328,7 @@ static void init(struct async_struct * info) outb_p(UART_MCR_LOOP | 0x0A, UART_MCR + port); status1 = inb_p(UART_MSR + port) & 0xF0; outb_p(scratch, UART_MCR + port); - outb_p(scratch, UART_MSR + port); + outb_p(scratch2, UART_MSR + port); if (status1 != 0x90) { info->type = PORT_UNKNOWN; return; @@ -379,9 +379,7 @@ static void init(struct async_struct * info) */ void rs_write(struct tty_struct * tty) { - int line = tty->line - 64; - - do_rs_write(rs_table+line); + do_rs_write(rs_table+DEV_TO_SL(tty->line)); } /* @@ -571,6 +569,10 @@ static int set_serial_info(struct async_struct * info, irq = ISR->irq; if (irq == 2) irq = 9; + if (!new_irq) + new_irq = irq; + if (!new_port) + new_port = info->port; if (irq != new_irq) { /* * We need to change the IRQ for this board. OK, if @@ -582,7 +584,7 @@ static int set_serial_info(struct async_struct * info, sa.sa_flags = (SA_INTERRUPT); sa.sa_mask = 0; sa.sa_restorer = NULL; - retval = irqaction(irq,&sa); + retval = irqaction(new_irq,&sa); if (retval) return retval; } @@ -608,6 +610,7 @@ static int set_serial_info(struct async_struct * info, if (ISR->next_ISR) ISR->next_ISR->prev_ISR = ISR; IRQ_ISR[new_irq] = ISR; + ISR->irq = new_irq; } cli(); if (new_port != info->port) { diff --git a/kernel/math/Makefile b/kernel/math/Makefile index 5b2a163..b0d1eb3 100644 --- a/kernel/math/Makefile +++ b/kernel/math/Makefile @@ -26,72 +26,81 @@ clean: dep: sed '/\#\#\# Dependencies/q' < Makefile > tmp_make - for i in *.c;do $(CPP) -M $$i;done >> tmp_make + $(CPP) -M *.c >> tmp_make cp tmp_make Makefile ### Dependencies: -add.o : add.c /usr/src/linux/include/linux/math_emu.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h -compare.o : compare.c /usr/src/linux/include/linux/math_emu.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h -convert.o : convert.c /usr/src/linux/include/linux/math_emu.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h -div.o : div.c /usr/src/linux/include/linux/math_emu.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h -ea.o : ea.c /usr/src/linux/include/linux/stddef.h /usr/src/linux/include/linux/math_emu.h \ - /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h \ - /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h \ - /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/asm/segment.h -emulate.o : emulate.c /usr/src/linux/include/linux/signal.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/time.h \ - /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h -get_put.o : get_put.c /usr/src/linux/include/linux/signal.h /usr/src/linux/include/linux/math_emu.h \ - /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h \ - /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h \ - /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/time.h \ - /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/asm/segment.h -mul.o : mul.c /usr/src/linux/include/linux/math_emu.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h -sqrt.o : sqrt.c /usr/src/linux/include/linux/math_emu.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h +add.o : add.c /usr/include/linux/math_emu.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h +compare.o : compare.c /usr/include/linux/math_emu.h /usr/include/linux/sched.h \ + /usr/include/linux/head.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/types.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h \ + /usr/include/linux/kernel.h /usr/include/linux/signal.h /usr/include/linux/time.h \ + /usr/include/linux/param.h /usr/include/linux/resource.h /usr/include/linux/vm86.h +convert.o : convert.c /usr/include/linux/math_emu.h /usr/include/linux/sched.h \ + /usr/include/linux/head.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/types.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h \ + /usr/include/linux/kernel.h /usr/include/linux/signal.h /usr/include/linux/time.h \ + /usr/include/linux/param.h /usr/include/linux/resource.h /usr/include/linux/vm86.h +div.o : div.c /usr/include/linux/math_emu.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h +ea.o : ea.c /usr/include/linux/stddef.h /usr/include/linux/math_emu.h /usr/include/linux/sched.h \ + /usr/include/linux/head.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/types.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h \ + /usr/include/linux/kernel.h /usr/include/linux/signal.h /usr/include/linux/time.h \ + /usr/include/linux/param.h /usr/include/linux/resource.h /usr/include/linux/vm86.h \ + /usr/include/asm/segment.h +emulate.o : emulate.c /usr/include/linux/signal.h /usr/include/linux/sched.h \ + /usr/include/linux/head.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/types.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h \ + /usr/include/linux/kernel.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h +get_put.o : get_put.c /usr/include/linux/signal.h /usr/include/linux/math_emu.h \ + /usr/include/linux/sched.h /usr/include/linux/head.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/types.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/time.h \ + /usr/include/linux/param.h /usr/include/linux/resource.h /usr/include/linux/vm86.h \ + /usr/include/asm/segment.h +mul.o : mul.c /usr/include/linux/math_emu.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h +sqrt.o : sqrt.c /usr/include/linux/math_emu.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h diff --git a/kernel/sys.c b/kernel/sys.c index 0df6ff2..90a558d 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -155,7 +155,7 @@ static void mark_screen_rdonly(struct task_struct * tsk) tmp = *(unsigned long *) tmp; if (tmp & PAGE_PRESENT) { tmp &= 0xfffff000; - pg_table = (0xA00000 >> PAGE_SHIFT) + (unsigned long *) tmp; + pg_table = (0xA0000 >> PAGE_SHIFT) + (unsigned long *) tmp; tmp = 32; while (tmp--) { if (PAGE_PRESENT & *pg_table) diff --git a/lib/Makefile b/lib/Makefile index b86a6d4..5a21576 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -26,24 +26,24 @@ clean: dep: sed '/\#\#\# Dependencies/q' < Makefile > tmp_make - for i in *.c;do $(CPP) -M $$i;done >> tmp_make + $(CPP) -M *.c >> tmp_make cp tmp_make Makefile ### Dependencies: -_exit.o : _exit.c /usr/src/linux/include/linux/unistd.h -close.o : close.c /usr/src/linux/include/linux/unistd.h -ctype.o : ctype.c /usr/src/linux/include/linux/ctype.h -dup.o : dup.c /usr/src/linux/include/linux/unistd.h +_exit.o : _exit.c /usr/include/linux/unistd.h +close.o : close.c /usr/include/linux/unistd.h +ctype.o : ctype.c /usr/include/linux/ctype.h +dup.o : dup.c /usr/include/linux/unistd.h errno.o : errno.c -execve.o : execve.c /usr/src/linux/include/linux/unistd.h -malloc.o : malloc.c /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/mm.h \ - /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h \ - /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h \ - /usr/src/linux/include/linux/minix_fs_sb.h /usr/src/linux/include/linux/ext_fs_sb.h \ - /usr/src/linux/include/linux/msdos_fs_sb.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/asm/system.h -open.o : open.c /usr/src/linux/include/linux/unistd.h /usr/src/linux/include/stdarg.h -setsid.o : setsid.c /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/unistd.h -string.o : string.c /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/string.h -wait.o : wait.c /usr/src/linux/include/linux/unistd.h /usr/src/linux/include/linux/types.h -write.o : write.c /usr/src/linux/include/linux/unistd.h /usr/src/linux/include/linux/types.h +execve.o : execve.c /usr/include/linux/unistd.h +malloc.o : malloc.c /usr/include/linux/kernel.h /usr/include/linux/mm.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/types.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/asm/system.h +open.o : open.c /usr/include/linux/unistd.h /usr/lib/gcc-lib/i386-linux/2.2.2d/include/stdarg.h +setsid.o : setsid.c /usr/include/linux/types.h /usr/include/linux/unistd.h +string.o : string.c /usr/include/linux/types.h /usr/include/linux/string.h +wait.o : wait.c /usr/include/linux/unistd.h /usr/include/linux/types.h +write.o : write.c /usr/include/linux/unistd.h /usr/include/linux/types.h diff --git a/lib/malloc.c b/lib/malloc.c index 7f4a62e..e9c5cac 100644 --- a/lib/malloc.c +++ b/lib/malloc.c @@ -1,6 +1,6 @@ /* * malloc.c --- a general purpose kernel memory allocator for Linux. - * + * * Written by Theodore Ts'o (tytso@mit.edu), 11/29/91 * * This routine is written to be as fast as possible, so that it @@ -15,14 +15,14 @@ * called, it looks for the smallest bucket size which will fulfill its * request, and allocate a piece of memory from that bucket pool. * - * Each bucket has as its control block a bucket descriptor which keeps + * Each bucket has as its control block a bucket descriptor which keeps * track of how many objects are in use on that page, and the free list * for that page. Like the buckets themselves, bucket descriptors are * stored on pages requested from get_free_page(). However, unlike buckets, * pages devoted to bucket descriptor pages are never released back to the * system. Fortunately, a system should probably only need 1 or 2 bucket * descriptor pages, since a page can hold 256 bucket descriptors (which - * corresponds to 1 megabyte worth of bucket pages.) If the kernel is using + * corresponds to 1 megabyte worth of bucket pages.) If the kernel is using * that much allocated memory, it's probably doing something wrong. :-) * * Note: malloc() and free() both call get_free_page() and free_page() @@ -36,11 +36,11 @@ * "pre-allocated" so that it can safely draw upon those pages if * it is called from an interrupt routine. * - * Another concern is that get_free_page() should not sleep; if it - * does, the code is carefully ordered so as to avoid any race - * conditions. The catch is that if malloc() is called re-entrantly, - * there is a chance that unecessary pages will be grabbed from the - * system. Except for the pages for the bucket descriptor page, the + * Another concern is that get_free_page() should not sleep; if it + * does, the code is carefully ordered so as to avoid any race + * conditions. The catch is that if malloc() is called re-entrantly, + * there is a chance that unecessary pages will be grabbed from the + * system. Except for the pages for the bucket descriptor page, the * extra pages will eventually get released back to the system, though, * so it isn't all that bad. */ @@ -72,7 +72,7 @@ struct _bucket_dir { /* 8 bytes */ /* * The following is the where we store a pointer to the first bucket - * descriptor for a given size. + * descriptor for a given size. * * If it turns out that the Linux kernel allocates a lot of objects of a * specific size, then we may want to add that specific size to this list, diff --git a/mm/Makefile b/mm/Makefile index 9523711..6a8f5ba 100644 --- a/mm/Makefile +++ b/mm/Makefile @@ -25,32 +25,34 @@ clean: dep: sed '/\#\#\# Dependencies/q' < Makefile > tmp_make - for i in *.c;do $(CPP) -M $$i;done >> tmp_make + $(CPP) -M *.c >> tmp_make cp tmp_make Makefile ### Dependencies: -memory.o : memory.c /usr/src/linux/include/asm/system.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h \ - /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h \ - /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/time.h \ - /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/string.h -mmap.o : mmap.c /usr/src/linux/include/linux/stat.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/time.h /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/errno.h /usr/src/linux/include/asm/segment.h /usr/src/linux/include/asm/system.h \ - /usr/src/linux/include/sys/mman.h -swap.o : swap.c /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/fs.h \ - /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h \ - /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/signal.h \ - /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/time.h \ - /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/string.h /usr/src/linux/include/linux/stat.h +memory.o : memory.c /usr/include/asm/system.h /usr/include/linux/signal.h /usr/include/linux/sched.h \ + /usr/include/linux/head.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/types.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h \ + /usr/include/linux/kernel.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/errno.h \ + /usr/include/linux/string.h +mmap.o : mmap.c /usr/include/linux/stat.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/errno.h \ + /usr/include/linux/mman.h /usr/include/asm/segment.h /usr/include/asm/system.h +swap.o : swap.c /usr/include/linux/mm.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/types.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/kernel.h \ + /usr/include/linux/sched.h /usr/include/linux/head.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/errno.h /usr/include/linux/string.h \ + /usr/include/linux/stat.h /usr/include/asm/system.h diff --git a/mm/memory.c b/mm/memory.c index fc2ad1c..d556e4f 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -792,6 +792,10 @@ void do_page_fault(unsigned long *esp, unsigned long error_code) /* get the address */ __asm__("movl %%cr2,%0":"=r" (address)); + if (address >= TASK_SIZE) { + printk("Unable to handle kernel paging request at address %08x\n",address); + do_exit(SIGSEGV); + } if (esp[2] & VM_MASK) { unsigned int bit; diff --git a/net/Makefile b/net/Makefile index 75afc2f..f69daf0 100644 --- a/net/Makefile +++ b/net/Makefile @@ -32,6 +32,7 @@ subdirs: dummy clean: rm -f core *.o *.a tmp_make for i in *.c;do rm -f `basename $$i .c`.s;done + @for i in $(SUBDIRS); do (cd $$i && echo $$i && $(MAKE) clean) || exit; done dep: sed '/\#\#\# Dependencies/q' < Makefile > tmp_make @@ -42,24 +43,24 @@ dep: dummy: ### Dependencies: -socket.o : socket.c /usr/src/linux/include/linux/signal.h /usr/src/linux/include/linux/errno.h \ - /usr/src/linux/include/linux/sched.h /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h \ - /usr/src/linux/include/linux/limits.h /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h \ - /usr/src/linux/include/linux/dirent.h /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/time.h \ - /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/stat.h /usr/src/linux/include/linux/socket.h /usr/src/linux/include/linux/fcntl.h \ - /usr/src/linux/include/linux/termios.h /usr/src/linux/include/asm/system.h /usr/src/linux/include/asm/segment.h \ - kern_sock.h socketcall.h -unix.o : unix.c /usr/src/linux/include/linux/signal.h /usr/src/linux/include/linux/sched.h \ - /usr/src/linux/include/linux/head.h /usr/src/linux/include/linux/fs.h /usr/src/linux/include/linux/limits.h \ - /usr/src/linux/include/linux/wait.h /usr/src/linux/include/linux/types.h /usr/src/linux/include/linux/dirent.h \ - /usr/src/linux/include/linux/vfs.h /usr/src/linux/include/linux/minix_fs_sb.h \ - /usr/src/linux/include/linux/ext_fs_sb.h /usr/src/linux/include/linux/msdos_fs_sb.h \ - /usr/src/linux/include/linux/mm.h /usr/src/linux/include/linux/kernel.h /usr/src/linux/include/linux/time.h \ - /usr/src/linux/include/linux/param.h /usr/src/linux/include/linux/resource.h \ - /usr/src/linux/include/linux/errno.h /usr/src/linux/include/linux/string.h /usr/src/linux/include/linux/stat.h \ - /usr/src/linux/include/linux/socket.h /usr/src/linux/include/linux/un.h /usr/src/linux/include/linux/fcntl.h \ - /usr/src/linux/include/linux/termios.h /usr/src/linux/include/asm/system.h /usr/src/linux/include/asm/segment.h \ - kern_sock.h +socket.o : socket.c /usr/include/linux/signal.h /usr/include/linux/errno.h /usr/include/linux/sched.h \ + /usr/include/linux/head.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/types.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h \ + /usr/include/linux/kernel.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/stat.h \ + /usr/include/linux/socket.h /usr/include/linux/fcntl.h /usr/include/linux/termios.h \ + /usr/include/asm/system.h /usr/include/asm/segment.h kern_sock.h socketcall.h +unix.o : unix.c /usr/include/linux/signal.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/kernel.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/errno.h /usr/include/linux/string.h \ + /usr/include/linux/stat.h /usr/include/linux/socket.h /usr/include/linux/un.h \ + /usr/include/linux/fcntl.h /usr/include/linux/termios.h /usr/include/asm/system.h \ + /usr/include/asm/segment.h kern_sock.h diff --git a/net/tcp/Makefile b/net/tcp/Makefile new file mode 100644 index 0000000..74c7d0f --- /dev/null +++ b/net/tcp/Makefile @@ -0,0 +1,222 @@ +# +# Makefile for the linux networking. +# +# Note! Dependencies are done automagically by 'make dep', which also +# removes any old dependencies. DON'T put your own dependencies here +# unless it's something special (ie not a .c file). +# +# Note 2! The CFLAGS definition is now in the main makefile... + +.c.o: + $(CC) $(CFLAGS) \ + -c -o $*.o $< +.s.o: + $(AS) -o $*.o $< +.c.s: + $(CC) $(CFLAGS) \ + -S -o $*.s $< + +OBJS = sock.o tcp.o ip.o timer.o we.o arp.o udp.o eth.o Space.o loopback.o \ + icmp.o protocols.o raw.o pack_type.o dev.o packet.o + +tcpip.o: $(OBJS) + $(LD) -r -o tcpip.o $(OBJS) + +subdirs: dummy + for i in $(SUBDIRS); do (cd $$i; $(MAKE)); done + + +clean: + rm -f core *.o *.a tmp_make + for i in *.c;do rm -f `basename $$i .c`.s;done + +dep: + sed '/\#\#\# Dependencies/q' < Makefile > tmp_make + $(CPP) -M *.c >> tmp_make + cp tmp_make Makefile + +tar: + tar -cvf /dev/f1 . + +### Dependencies: +Space.o : Space.c dev.h /usr/include/linux/stddef.h +arp.o : arp.c /usr/include/linux/types.h /usr/include/linux/string.h /usr/include/linux/kernel.h \ + /usr/include/linux/sched.h /usr/include/linux/head.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h \ + /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h \ + /usr/include/linux/signal.h /usr/include/linux/time.h /usr/include/linux/param.h \ + /usr/include/linux/resource.h /usr/include/linux/vm86.h /usr/include/linux/socket.h \ + /usr/include/netinet/in.h /usr/include/features.h /usr/include/sys/socket.h \ + /usr/include/traditional.h /usr/include/asm/system.h timer.h ip.h dev.h /usr/include/linux/sock_ioctl.h \ + /usr/include/netinet/protocols.h eth.h tcp.h sock.h arp.h +dev.o : dev.c /usr/include/asm/segment.h /usr/include/asm/system.h /usr/include/linux/types.h \ + /usr/include/linux/kernel.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/signal.h /usr/include/linux/time.h \ + /usr/include/linux/param.h /usr/include/linux/resource.h /usr/include/linux/vm86.h \ + /usr/include/linux/string.h /usr/include/linux/socket.h /usr/include/netinet/in.h \ + /usr/include/features.h /usr/include/sys/socket.h /usr/include/traditional.h \ + /usr/include/asm/memory.h dev.h eth.h timer.h ip.h /usr/include/linux/sock_ioctl.h \ + /usr/include/netinet/protocols.h tcp.h sock.h /usr/include/linux/errno.h arp.h +eth.o : eth.c /usr/include/asm/segment.h /usr/include/asm/system.h /usr/include/linux/types.h \ + /usr/include/linux/kernel.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/signal.h /usr/include/linux/time.h \ + /usr/include/linux/param.h /usr/include/linux/resource.h /usr/include/linux/vm86.h \ + /usr/include/linux/string.h /usr/include/linux/socket.h /usr/include/netinet/in.h \ + /usr/include/features.h /usr/include/sys/socket.h /usr/include/traditional.h \ + /usr/include/asm/memory.h dev.h eth.h timer.h ip.h /usr/include/linux/sock_ioctl.h \ + /usr/include/netinet/protocols.h tcp.h sock.h /usr/include/linux/errno.h arp.h +icmp.o : icmp.c /usr/include/linux/types.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/fcntl.h /usr/include/linux/socket.h \ + /usr/include/netinet/in.h /usr/include/features.h /usr/include/sys/socket.h \ + /usr/include/traditional.h timer.h ip.h dev.h /usr/include/linux/sock_ioctl.h \ + /usr/include/netinet/protocols.h eth.h tcp.h sock.h /usr/include/linux/errno.h \ + /usr/include/linux/timer.h /usr/include/asm/system.h /usr/include/asm/segment.h \ + ../kern_sock.h icmp.h +ip.o : ip.c /usr/include/asm/segment.h /usr/include/asm/system.h /usr/include/linux/types.h \ + /usr/include/linux/kernel.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/signal.h /usr/include/linux/time.h \ + /usr/include/linux/param.h /usr/include/linux/resource.h /usr/include/linux/vm86.h \ + /usr/include/linux/string.h /usr/include/linux/socket.h /usr/include/netinet/in.h \ + /usr/include/features.h /usr/include/sys/socket.h /usr/include/traditional.h \ + timer.h ip.h dev.h /usr/include/linux/sock_ioctl.h /usr/include/netinet/protocols.h \ + eth.h tcp.h sock.h /usr/include/linux/errno.h arp.h icmp.h +loopback.o : loopback.c /usr/include/linux/config.h /usr/include/linux/config.dist.h \ + /usr/include/linux/kernel.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/types.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/tty.h /usr/include/linux/termios.h \ + /usr/include/asm/system.h /usr/include/linux/ptrace.h /usr/include/asm/segment.h \ + /usr/include/asm/io.h /usr/include/asm/memory.h /usr/include/errno.h /usr/include/traditional.h \ + /usr/include/linux/errno.h /usr/include/linux/fcntl.h /usr/include/netinet/in.h \ + /usr/include/features.h /usr/include/sys/socket.h /usr/include/linux/socket.h \ + dev.h eth.h timer.h ip.h /usr/include/linux/sock_ioctl.h /usr/include/netinet/protocols.h \ + tcp.h sock.h arp.h ../kern_sock.h +pack_type.o : pack_type.c /usr/include/linux/stddef.h dev.h eth.h +packet.o : packet.c /usr/include/linux/types.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/fcntl.h /usr/include/linux/socket.h \ + /usr/include/netinet/in.h /usr/include/features.h /usr/include/sys/socket.h \ + /usr/include/traditional.h timer.h ip.h dev.h /usr/include/linux/sock_ioctl.h \ + /usr/include/netinet/protocols.h eth.h tcp.h sock.h /usr/include/linux/errno.h \ + /usr/include/linux/timer.h /usr/include/asm/system.h /usr/include/asm/segment.h \ + ../kern_sock.h +protocols.o : protocols.c /usr/include/asm/segment.h /usr/include/asm/system.h \ + /usr/include/linux/types.h /usr/include/linux/kernel.h /usr/include/linux/sched.h \ + /usr/include/linux/head.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/string.h /usr/include/linux/socket.h \ + /usr/include/netinet/in.h /usr/include/features.h /usr/include/sys/socket.h \ + /usr/include/traditional.h timer.h ip.h dev.h /usr/include/linux/sock_ioctl.h \ + /usr/include/netinet/protocols.h eth.h tcp.h sock.h icmp.h +raw.o : raw.c /usr/include/linux/types.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/fcntl.h /usr/include/linux/socket.h \ + /usr/include/netinet/in.h /usr/include/features.h /usr/include/sys/socket.h \ + /usr/include/traditional.h timer.h ip.h dev.h /usr/include/linux/sock_ioctl.h \ + /usr/include/netinet/protocols.h eth.h tcp.h sock.h /usr/include/linux/errno.h \ + /usr/include/linux/timer.h /usr/include/asm/system.h /usr/include/asm/segment.h \ + ../kern_sock.h +sock.o : sock.c /usr/include/linux/errno.h /usr/include/linux/types.h /usr/include/linux/socket.h \ + /usr/include/netinet/in.h /usr/include/features.h /usr/include/sys/socket.h \ + /usr/include/traditional.h /usr/include/linux/kernel.h /usr/include/linux/sched.h \ + /usr/include/linux/head.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/timer.h /usr/include/linux/sock_ioctl.h \ + /usr/include/asm/memory.h ../kern_sock.h timer.h ip.h dev.h /usr/include/netinet/protocols.h \ + eth.h tcp.h udp.h sock.h /usr/include/asm/segment.h /usr/include/asm/system.h \ + /usr/include/linux/fcntl.h +tcp.o : tcp.c /usr/include/linux/types.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/asm/memory.h /usr/include/linux/socket.h \ + /usr/include/netinet/in.h /usr/include/features.h /usr/include/sys/socket.h \ + /usr/include/traditional.h /usr/include/linux/fcntl.h timer.h ip.h dev.h /usr/include/linux/sock_ioctl.h \ + /usr/include/netinet/protocols.h eth.h icmp.h tcp.h sock.h /usr/include/linux/errno.h \ + /usr/include/linux/timer.h /usr/include/asm/system.h /usr/include/asm/segment.h \ + ../kern_sock.h +timer.o : timer.c /usr/include/linux/types.h /usr/include/linux/errno.h /usr/include/linux/socket.h \ + /usr/include/netinet/in.h /usr/include/features.h /usr/include/sys/socket.h \ + /usr/include/traditional.h /usr/include/linux/kernel.h /usr/include/linux/sched.h \ + /usr/include/linux/head.h /usr/include/linux/fs.h /usr/include/linux/limits.h \ + /usr/include/linux/wait.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ + /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h \ + /usr/include/linux/msdos_fs_sb.h /usr/include/linux/mm.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/timer.h /usr/include/asm/system.h \ + timer.h ip.h dev.h /usr/include/linux/sock_ioctl.h /usr/include/netinet/protocols.h \ + eth.h tcp.h sock.h arp.h ../kern_sock.h +udp.o : udp.c /usr/include/linux/types.h /usr/include/linux/sched.h /usr/include/linux/head.h \ + /usr/include/linux/fs.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/kernel.h /usr/include/linux/signal.h \ + /usr/include/linux/time.h /usr/include/linux/param.h /usr/include/linux/resource.h \ + /usr/include/linux/vm86.h /usr/include/linux/fcntl.h /usr/include/linux/socket.h \ + /usr/include/netinet/in.h /usr/include/features.h /usr/include/sys/socket.h \ + /usr/include/traditional.h timer.h ip.h dev.h /usr/include/linux/sock_ioctl.h \ + /usr/include/netinet/protocols.h eth.h tcp.h sock.h /usr/include/linux/errno.h \ + /usr/include/linux/timer.h /usr/include/asm/system.h /usr/include/asm/segment.h \ + ../kern_sock.h udp.h icmp.h +we.o : we.c /usr/include/linux/config.h /usr/include/linux/config.dist.h /usr/include/linux/kernel.h \ + /usr/include/linux/sched.h /usr/include/linux/head.h /usr/include/linux/fs.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/types.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/msdos_fs_i.h \ + /usr/include/linux/minix_fs_sb.h /usr/include/linux/ext_fs_sb.h /usr/include/linux/msdos_fs_sb.h \ + /usr/include/linux/mm.h /usr/include/linux/signal.h /usr/include/linux/time.h \ + /usr/include/linux/param.h /usr/include/linux/resource.h /usr/include/linux/vm86.h \ + /usr/include/linux/tty.h /usr/include/linux/termios.h /usr/include/asm/system.h \ + /usr/include/linux/ptrace.h /usr/include/asm/segment.h /usr/include/asm/io.h \ + /usr/include/asm/memory.h /usr/include/errno.h /usr/include/traditional.h /usr/include/linux/errno.h \ + /usr/include/linux/fcntl.h /usr/include/netinet/in.h /usr/include/features.h \ + /usr/include/sys/socket.h /usr/include/linux/socket.h dev.h eth.h timer.h ip.h \ + /usr/include/linux/sock_ioctl.h /usr/include/netinet/protocols.h tcp.h sock.h \ + arp.h wereg.h diff --git a/net/tcp/Space.c b/net/tcp/Space.c new file mode 100644 index 0000000..c6777bb --- /dev/null +++ b/net/tcp/Space.c @@ -0,0 +1,79 @@ +/* Space.c */ +/* Holds initial configuration information for devices. */ +#include "dev.h" +#include <linux/stddef.h> + + +extern void wd8003_init(struct device *); + +static struct device wd8003_dev = +{ + "eth0", + 0xd2000, /* recv memory end. */ + 0xd0600, /* recv memory start. */ + 0xd2000, /* memory end. */ + 0xd0000, /* memory start. */ + 0x280, /* base i/o address. */ + 5, /* irq */ + 0,0,0,0,0, /* flags */ + NULL, /* next device */ + wd8003_init, + /* wd8003_init should set up the rest. */ + 0, /* trans start. */ + {NULL}, /* buffs */ + NULL, /* backlog */ + NULL, /* open */ + NULL, /* stop */ + NULL, /* hard_start_xmit */ + NULL, /* hard_header */ + NULL, /* add arp */ + NULL, /* queue xmit */ + NULL, /* rebuild header */ + NULL, /* type_trans */ + NULL, /* send_packet */ + NULL, /* private */ + 0, /* type. */ + 0, /* hard_header_len */ + 0, /* mtu */ + {0,}, /* broadcast address */ + {0,}, /* device address */ + 0 /* addr len */ +}; + +extern void loopback_init(struct device *dev); + +static struct device loopback_dev = +{ + "loopback", + -1, /* recv memory end. */ + 0x0, /* recv memory start. */ + -1, /* memory end. */ + 0, /* memory start. */ + 0, /* base i/o address. */ + 0, /* irq */ + 0,0,1,0,0, /* flags */ + &wd8003_dev, /* next device */ + loopback_init, + /* loopback_init should set up the rest. */ + 0, /* trans start. */ + {NULL}, /* buffs */ + NULL, /* backlog */ + NULL, /* open */ + NULL, /* stop */ + NULL, /* hard_start_xmit */ + NULL, /* hard_header */ + NULL, /* add arp */ + NULL, /* queue xmit */ + NULL, /* rebuild header */ + NULL, /* type_trans */ + NULL, /* send_packet */ + NULL, /* private */ + 0, /* type. */ + 0, /* hard_header_len */ + 0, /* mtu */ + {0,}, /* broadcast address */ + {0,}, /* device address */ + 0 /* addr len */ +}; + +struct device *dev_base = &loopback_dev; diff --git a/net/tcp/arp.c b/net/tcp/arp.c new file mode 100644 index 0000000..ad3a7dc --- /dev/null +++ b/net/tcp/arp.c @@ -0,0 +1,485 @@ +/* arp.c */ +/* + Copyright (C) 1992 Ross Biro + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + The Author may be reached as bir7@leland.stanford.edu or + C/O Department of Mathematics; Stanford University; Stanford, CA 94305 +*/ + +#include <linux/types.h> +#include <linux/string.h> +#include <linux/kernel.h> +#include <linux/sched.h> + +#include <linux/socket.h> +#include <netinet/in.h> +#include <asm/system.h> + +#include "timer.h" +#include "ip.h" +#include "tcp.h" +#include "sock.h" +#include "arp.h" + +#undef ARP_DEBUG +#ifdef ARP_DEBUG +#define PRINTK printk +#else +#define PRINTK dummy_routine +#endif + +static struct arp_table *arp_table[ARP_TABLE_SIZE] ={NULL, }; +static struct sk_buff *arp_q=NULL; + +/* this will try to retransmit everything on the queue. */ +static void +send_arp_q(void) +{ + struct sk_buff *skb; + if (arp_q == NULL) return; + + skb = arp_q; + do { + if (!skb->dev->rebuild_header (skb+1, skb->dev)) + { + if (skb->next == skb) + { + arp_q = NULL; + } + else + { + skb->next->prev = skb->prev; + skb->prev->next = skb->next; + arp_q = skb->next; + } + skb->next = NULL; + skb->prev = NULL; + skb->arp = 1; + skb->dev->queue_xmit (skb, skb->dev, 0); + if (arp_q == NULL) break; + skb = arp_q; + continue; + } + skb=skb->next; + } while (skb != arp_q); + +} + +static void +print_arp(struct arp *arp) +{ + int i; + unsigned long *lptr; + unsigned char *ptr; + PRINTK ("arp: \n"); + PRINTK (" hrd = %d\n",net16(arp->hrd)); + PRINTK (" pro = %d\n",net16(arp->pro)); + PRINTK (" hlen = %d plen = %d\n",arp->hlen, arp->plen); + PRINTK (" op = %d\n", net16(arp->op)); + ptr = (unsigned char *)(arp+1); + PRINTK (" sender haddr = "); + for (i = 0; i < arp->hlen; i++) + { + PRINTK ("0x%02X ",*ptr++); + } + lptr = (void *)ptr; + PRINTK (" send paddr = %X\n",*lptr); + lptr ++; + ptr = (void *)lptr; + PRINTK (" destination haddr = "); + for (i = 0; i < arp->hlen; i++) + { + PRINTK ("0x%02X ",*ptr++); + } + lptr = (void *)ptr; + PRINTK (" destination paddr = %X\n",*lptr); +} + +static unsigned char * +arp_sourceh(struct arp *arp) +{ + unsigned char *ptr; + ptr = (unsigned char *)(arp + 1); + return (ptr); +} + +static unsigned char * +arp_targeth(struct arp *arp) +{ + unsigned char *ptr; + ptr = (unsigned char *)(arp + 1); + ptr += arp->hlen+4; + return (ptr); +} + +static unsigned long * +arp_sourcep(struct arp *arp) +{ + unsigned long *lptr; + unsigned char *ptr; + ptr = (unsigned char *)(arp + 1); + ptr += arp->hlen; + lptr = (unsigned long *)ptr; + return (lptr); +} + + +static unsigned long * +arp_targetp(struct arp *arp) +{ + unsigned long *lptr; + unsigned char *ptr; + ptr = (unsigned char *)(arp + 1); + ptr += 2*arp->hlen+4; + lptr = (unsigned long *)ptr; + return (lptr); +} + +static void +arp_free (void *ptr, unsigned long len) +{ + free_s(ptr, len); +} + +static void * +arp_malloc (unsigned long amount) +{ + return (malloc (amount)); +} + +static int +arp_response (struct arp *arp1, struct device *dev) +{ + struct arp *arp2; + struct sk_buff *skb; + int tmp; + + /* get some mem and initialize it for the return trip. */ + skb = arp_malloc (sizeof (*skb) + sizeof (*arp2) + + 2*arp1->hlen + 2*arp1->plen + dev->hard_header_len); + if (skb == NULL) return (1); + + skb->mem_addr = skb; + skb->mem_len = sizeof (*skb) + sizeof (*arp2) + 2*arp1->hlen + + 2*arp1->plen + dev->hard_header_len; + skb->len = sizeof (*arp2) + 2*arp1->hlen + + 2*arp1->plen + dev->hard_header_len; + + tmp = dev->hard_header((unsigned char *)(skb+1), dev, + ETHERTYPE_ARP, *arp_sourcep(arp1), + *arp_targetp(arp1),skb->len); + + if (tmp < 0) return (1); + + arp2 =(struct arp *) ((unsigned char *)skb+sizeof (*skb) + tmp ); + memcpy (arp2, arp1, sizeof (*arp2)); + + /* now swap the addresses. */ + *arp_sourcep(arp2) = *arp_targetp(arp1); + memcpy(arp_sourceh(arp2), dev->dev_addr, arp1->hlen); + + *arp_targetp(arp2) = *arp_sourcep(arp1); + memcpy(arp_targeth(arp2), arp_sourceh(arp1), arp1->hlen); + + arp2->op = NET16(ARP_REPLY); + skb->free = 1; + skb->arp = 1; /* so the code will know it's not waiting on an arp. */ + skb->sk = NULL; + skb->next = NULL; + PRINTK (">>"); + print_arp(arp2); + /* send it. */ + dev->queue_xmit (skb, dev, 0); + return (0); +} + +/* This will find an entry in the arp table by looking at the ip + address. */ +static struct arp_table * +arp_lookup (unsigned long paddr) +{ + unsigned long hash; + struct arp_table *apt; + PRINTK ("arp_lookup(paddr=%X)\n", paddr); + /* we don't want to arp ourselves. */ + if (my_ip_addr(paddr)) return (NULL); + hash = net32(paddr) & (ARP_TABLE_SIZE - 1); + cli(); + for (apt = arp_table[hash]; apt != NULL; apt = apt->next) + { + if (apt->ip == paddr) + { + sti(); + return (apt); + } + } + sti(); + return (NULL); +} + +void +arp_destroy(unsigned long paddr) +{ + unsigned long hash; + struct arp_table *apt; + struct arp_table *lapt; + PRINTK ("arp_destroy (paddr=%X)\n",paddr); + /* we don't want to destroy are own arp */ + if (my_ip_addr(paddr)) return; + hash = net32(paddr) & (ARP_TABLE_SIZE - 1); + + cli(); /* can't be interrupted. */ + /* make sure there is something there. */ + if (arp_table[hash] == NULL) return; + + /* check the first one. */ + if (arp_table[hash]->ip == paddr) + { + apt = arp_table[hash]; + arp_table[hash] = arp_table[hash]->next; + arp_free (apt, sizeof (*apt)); + sti(); + return; + } + + /* now deal with it any where else in the chain. */ + lapt = arp_table[hash]; + for (apt = arp_table[hash]->next; apt != NULL; apt = apt->next) + { + if (apt->ip == paddr) + { + lapt->next = apt->next; + arp_free (apt, sizeof (*apt)); + sti(); + return; + } + } + sti(); +} + +/* this routine does not check for duplicates. It assumes the caller + does. */ +static struct arp_table * +create_arp (unsigned long paddr, unsigned char *addr, int hlen) +{ + struct arp_table *apt; + unsigned long hash; + apt = arp_malloc (sizeof (*apt)); + if (apt == NULL) return (NULL); + + hash = net32(paddr) & (ARP_TABLE_SIZE - 1); + apt->ip = paddr; + apt->hlen =hlen; + memcpy (apt->hard, addr, hlen); + apt->last_used=timer_seq; + sti(); + apt->next = arp_table[hash]; + arp_table[hash]=apt; + cli(); + return (apt); +} + +int +arp_rcv(struct sk_buff *skb, struct device *dev, struct packet_type *pt) +{ + struct arp *arp; + struct arp_table *tbl; + int ret; + + PRINTK ("<<\n"); + arp = skb->h.arp; + print_arp(arp); + + /* if this test doesn't pass, something fishy is going on. */ + if (arp->hlen != dev->addr_len || dev->type !=NET16( arp->hrd)) + { + free_skb(skb, FREE_READ); + return (0); + } + + /* for now we will only deal with ip addresses. */ + if (arp->pro != NET16(ARP_IP_PROT) || arp->plen != 4) + { + free_skb (skb, FREE_READ); + return (0); + } + + /* now look up the ip address in the table. */ + tbl = arp_lookup (*arp_sourcep(arp)); + if (tbl != NULL) + { + memcpy (tbl->hard, arp+1, arp->hlen); + tbl->hlen = arp->hlen; + tbl->last_used = timer_seq; + } + + if (!my_ip_addr(*arp_targetp(arp))) + { + free_skb (skb, FREE_READ); + return (0); + } + + if (tbl == NULL) + create_arp (*arp_sourcep(arp), arp_sourceh(arp), arp->hlen); + + /* now see if we can send anything. */ + send_arp_q(); + + if (arp->op != NET16(ARP_REQUEST)) + { + free_skb (skb, FREE_READ); + return (0); + } + + /* now we need to create a new packet. */ + ret = arp_response(arp, dev); + free_skb (skb, FREE_READ); + return (ret); +} + +void +arp_snd (unsigned long paddr, struct device *dev, unsigned long saddr) +{ + struct sk_buff *skb; + struct arp *arp; + struct arp_table *apt; + int tmp; + PRINTK ("arp_snd (paddr=%X, dev=%X, saddr=%X)\n",paddr, dev, saddr); + + /* first we build a dummy arp table entry. */ + apt = create_arp (paddr, NULL, 0); + if (apt == NULL) return; + + skb = arp_malloc (sizeof (*arp) + sizeof (*skb) + dev->hard_header_len + + 2*dev->addr_len+8); + if (skb == NULL) return; + + skb->sk = NULL; + skb->mem_addr = skb; + skb->mem_len = sizeof (*arp) + sizeof (*skb) + dev->hard_header_len + + 2*dev->addr_len+8; + skb->arp = 1; + skb->dev = dev; + skb->len = sizeof (*arp) + dev->hard_header_len + 2*dev->addr_len+8; + skb->next = NULL; + + tmp = dev->hard_header ((unsigned char *)(skb+1), dev, + ETHERTYPE_ARP, 0, saddr, skb->len); + if (tmp < 0) + { + arp_free (skb->mem_addr, skb->mem_len); + return; + } + + arp =(struct arp *) ((unsigned char *)skb+sizeof (*skb) + tmp ); + arp->hrd = net16(dev->type); + arp->pro = NET16(ARP_IP_PROT); + arp->hlen = dev->addr_len; + arp->plen = 4; + arp->op = NET16(ARP_REQUEST); + *arp_sourcep(arp) = saddr; + *arp_targetp(arp) = paddr; + memcpy (arp_sourceh(arp), dev->dev_addr, dev->addr_len); + memcpy (arp_targeth(arp), dev->broadcast, dev->addr_len); + PRINTK(">>\n"); + print_arp(arp); + dev->queue_xmit (skb, dev, 0); +} + +int +arp_find(unsigned char *haddr, unsigned long paddr, struct device *dev, + unsigned long saddr) +{ + struct arp_table *apt; + PRINTK ("arp_find(haddr=%X, paddr=%X, dev=%X, saddr=%X)\n", + haddr, paddr, dev, saddr); + if (my_ip_addr (paddr)) + { + memcpy (haddr, dev->dev_addr, dev->addr_len); + return (0); + } + apt = arp_lookup (paddr); + if (apt != NULL) + { + /* make sure it's not too old. If it is too old, we will + just pretend we did not find it, and then arp_snd + will verify the address for us. */ + if (!before (apt->last_used, timer_seq+ARP_TIMEOUT) && + apt->hlen != 0) + { + apt->last_used=timer_seq; + memcpy (haddr, apt->hard, dev->addr_len); + return (0); + } + } + + /* if we didn't find an entry, we will try to + send an arp packet. */ + if (apt == NULL || after (timer_seq, apt->last_used+ARP_RES_TIME)) + arp_snd(paddr,dev,saddr); + + /* this assume haddr are atleast 4 bytes. + If this isn't true we can use a lookup + table, one for every dev. */ + *(unsigned long *)haddr = paddr; + return (1); +} + + +void +arp_add (unsigned long addr, unsigned char *haddr, struct device *dev) +{ + struct arp_table *apt; + /* first see if the address is already in the table. */ + apt = arp_lookup (addr); + if (apt != NULL) + { + apt->last_used = timer_seq; + memcpy (apt->hard, haddr , dev->addr_len); + return; + } + create_arp (addr, haddr, dev->addr_len); +} + +void +arp_add_broad (unsigned long addr, struct device *dev) +{ + arp_add (addr, dev->broadcast , dev); +} + + +void +arp_queue(struct sk_buff *skb) +{ + cli(); + if (arp_q == NULL) + { + arp_q = skb; + skb->next = skb; + skb->prev = skb; + } + else + { + skb->next = arp_q; + skb->prev = arp_q->prev; + skb->next->prev = skb; + skb->prev->next = skb; + } + sti(); + +} + diff --git a/net/tcp/arp.h b/net/tcp/arp.h new file mode 100644 index 0000000..e9c6498 --- /dev/null +++ b/net/tcp/arp.h @@ -0,0 +1,61 @@ +/* arp.h */ +/* + Copyright (C) 1992 Ross Biro + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + The Author may be reached as bir7@leland.stanford.edu or + C/O Department of Mathematics; Stanford University; Stanford, CA 94305 +*/ +#ifndef _TCP_ARP_H +#define _TCP_ARP_H + +struct arp +{ + unsigned short hrd; + unsigned short pro; + unsigned char hlen; + unsigned char plen; + unsigned short op; +}; + + +struct arp_table +{ + struct arp_table *next; + unsigned long last_used; + unsigned long ip; + unsigned char hlen; + unsigned char hard[MAX_ADDR_LEN]; +}; + + + +int arp_rcv(struct sk_buff *, struct device *, struct packet_type *); +void arp_snd (unsigned long, struct device *, unsigned long); +int arp_find (unsigned char *, unsigned long, struct device *dev, + unsigned long); +void arp_add_broad (unsigned long, struct device *dev); +void arp_destroy (unsigned long); +void arp_add (unsigned long addr, unsigned char *haddr, struct device *dev); +void arp_queue (struct sk_buff *skb); + +#define ARP_TABLE_SIZE 16 +#define ARP_IP_PROT ETHERTYPE_IP +#define ARP_REQUEST 1 +#define ARP_REPLY 2 +#define ARP_TIMEOUT 8640000 /* about 8 hours. */ +#define ARP_RES_TIME 250 /* 2.5 seconds. */ +#endif diff --git a/net/tcp/dev.c b/net/tcp/dev.c new file mode 100644 index 0000000..fd6e8b6 --- /dev/null +++ b/net/tcp/dev.c @@ -0,0 +1,394 @@ +/* dev.c */ +/* + Copyright (C) 1992 Ross Biro + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + The Author may be reached as bir7@leland.stanford.edu or + C/O Department of Mathematics; Stanford University; Stanford, CA 94305 +*/ + +#include <asm/segment.h> +#include <asm/system.h> +#include <linux/types.h> +#include <linux/kernel.h> +#include <linux/sched.h> +#include <linux/string.h> +#include <linux/mm.h> +#include <linux/socket.h> +#include <netinet/in.h> +#include <asm/memory.h> +#include "dev.h" +#include "eth.h" +#include "timer.h" +#include "ip.h" +#include "tcp.h" +#include "sock.h" +#include <linux/errno.h> +#include "arp.h" + +#undef DEV_DEBUG +#ifdef DEV_DEBUG +#define PRINTK printk +#else +#define PRINTK dummy_routine +#endif + + +static unsigned long +min(unsigned long a, unsigned long b) +{ + if (a < b) return (a); + return (b); +} + +void +dev_add_pack (struct packet_type *pt) +{ + struct packet_type *p1; + pt->next = ptype_base; + + /* see if we need to copy it. */ + for (p1 = ptype_base; p1 != NULL; p1 = p1->next) + { + if (p1->type == pt->type) + { + pt->copy = 1; + break; + } + } + + ptype_base = pt; + +} + +void +dev_remove_pack (struct packet_type *pt) +{ + struct packet_type *lpt, *pt1; + if (pt == ptype_base) + { + ptype_base = pt->next; + return; + } + + lpt = NULL; + + for (pt1 = ptype_base; pt1->next != NULL; pt1=pt1->next) + { + if (pt1->next == pt ) + { + cli(); + if (!pt->copy && lpt) + lpt->copy = 0; + pt1->next = pt->next; + sti(); + return; + } + + if (pt1->next -> type == pt ->type) + { + lpt = pt1->next; + } + } +} + +struct device * +get_dev (char *name) +{ + struct device *dev; + for (dev = dev_base; dev != NULL; dev=dev->next) + { + if (strcmp (dev->name, name) == 0) return (dev); + } + return (NULL); +} + +void +dev_queue_xmit (struct sk_buff *skb, struct device *dev, int pri) +{ + struct sk_buff *skb2; + PRINTK ("eth_queue_xmit (skb=%X, dev=%X, pri = %d)\n", skb, dev, pri); + skb->dev = dev; + if (pri < 0 || pri >= DEV_NUMBUFFS) + { + printk ("bad priority in dev_queue_xmit.\n"); + pri = 1; + } + + if (dev->hard_start_xmit(skb, dev) == 0) + { + return; + } + + if (skb->next != NULL) + { + printk ("retransmitted packet still on queue. \n"); + return; + } + + /* used to say it is not currently on a send list. */ + skb->next = NULL; + + + /* put skb into a bidirectional circular linked list. */ + PRINTK ("eth_queue dev->buffs[%d]=%X\n",pri, dev->buffs[pri]); + /* interrupts should already be cleared by hard_start_xmit. */ + cli(); + if (dev->buffs[pri] == NULL) + { + dev->buffs[pri]=skb; + skb->next = skb; + skb->prev = skb; + } + else + { + skb2=dev->buffs[pri]; + skb->next = skb2; + skb->prev = skb2->prev; + skb->next->prev = skb; + skb->prev->next = skb; + } + sti(); + +} + + +/* this routine now just gets the data out of the card and returns. + it's return values now mean. + + 1 <- exit even if you have more packets. + 0 <- call me again no matter what. + -1 <- last packet not processed, try again. */ + +int +dev_rint(unsigned char *buff, unsigned long len, int flags, + struct device * dev) +{ + struct sk_buff *skb=NULL; + struct packet_type *ptype; + unsigned short type; + unsigned char flag =0; + unsigned char *to; + int amount; + + /* try to grab some memory. */ + if (len > 0 && buff != NULL) + { + skb = malloc (sizeof (*skb) + len); + skb->mem_len = sizeof (*skb) + len; + skb->mem_addr = skb; + } + + /* firs we copy the packet into a buffer, and save it for later. */ + if (buff != NULL && skb != NULL) + { + if ( !(flags & IN_SKBUFF)) + { + to = (unsigned char *)(skb+1); + while (len > 0) + { + amount = min (len, (unsigned long) dev->rmem_end - + (unsigned long) buff); + memcpy (to, buff, amount); + len -= amount; + buff += amount; + to += amount; + if ((unsigned long)buff == dev->rmem_end) + buff = (unsigned char *)dev->rmem_start; + } + } + else + { + free_s (skb->mem_addr, skb->mem_len); + skb = (struct sk_buff *)buff; + } + + skb->len = len; + skb->dev = dev; + skb->sk = NULL; + + /* now add it to the dev backlog. */ + cli(); + if (dev-> backlog == NULL) + { + skb->prev = skb; + skb->next = skb; + dev->backlog = skb; + } + else + { + skb ->prev = dev->backlog->prev; + skb->next = dev->backlog; + skb->next->prev = skb; + skb->prev->next = skb; + } + sti(); + return (0); + } + + if (skb != NULL) + free_s (skb->mem_addr, skb->mem_len); + + /* anything left to process? */ + + if (dev->backlog == NULL) + { + if (buff == NULL) + { + sti(); + return (1); + } + + if (skb != NULL) + { + sti(); + return (-1); + } + + sti(); + printk ("dev_rint:Dropping packets due to lack of memory\n"); + return (1); + } + + skb= dev->backlog; + if (skb->next == skb) + { + dev->backlog = NULL; + } + else + { + dev->backlog = skb->next; + skb->next->prev = skb->prev; + skb->prev->next = skb->next; + } + sti(); + + /* bump the pointer to the next structure. */ + skb->h.raw = (unsigned char *)(skb+1) + dev->hard_header_len; + skb->len -= dev->hard_header_len; + + /* convert the type to an ethernet type. */ + type = dev->type_trans (skb, dev); + + /* if there get to be a lot of types we should changes this to + a bunch of linked lists like we do for ip protocols. */ + for (ptype = ptype_base; ptype != NULL; ptype=ptype->next) + { + if (ptype->type == type) + { + struct sk_buff *skb2; + /* copy the packet if we need to. */ + if (ptype->copy) + { + skb2 = malloc (skb->mem_len); + if (skb2 == NULL) continue; + memcpy (skb2, skb, skb->mem_len); + skb2->mem_addr = skb2; + } + else + { + skb2 = skb; + flag = 1; + } + + ptype->func (skb2, dev, ptype); + } + } + + if (!flag) + { + PRINTK ("discarding packet type = %X\n", type); + free_skb (skb, FREE_READ); + } + + if (buff == NULL) + return (0); + else + return (-1); +} + +/* This routine is called when an device interface is ready to + transmit a packet. Buffer points to where the packet should + be put, and the routine returns the length of the packet. A + length of zero is interrpreted to mean the transmit buffers + are empty, and the transmitter should be shut down. */ + +unsigned long +dev_tint(unsigned char *buff, struct device *dev) +{ + int i; + int tmp; + struct sk_buff *skb; + for (i=0; i < DEV_NUMBUFFS; i++) + { + while (dev->buffs[i]!=NULL) + { + cli(); + skb=dev->buffs[i]; + if (skb->next == skb) + { + dev->buffs[i] = NULL; + } + else + { + dev->buffs[i]=skb->next; + skb->prev->next = skb->next; + skb->next->prev = skb->prev; + } + skb->next = NULL; + skb->prev = NULL; + sti(); + tmp = skb->len; + if (!skb->arp) + { + if (dev->rebuild_header (skb+1, dev)) + { + skb->dev = dev; + arp_queue (skb); + continue; + } + } + + if (tmp <= dev->mtu) + { + if (dev->send_packet != NULL) + { + dev->send_packet(skb, dev); + } + if (buff != NULL) + memcpy (buff, skb + 1, tmp); + + PRINTK (">>\n"); + print_eth ((struct enet_header *)(skb+1)); + } + else + { + printk ("**** bug len bigger than mtu. \n"); + } + + if (skb->free) + { + free_skb(skb, FREE_WRITE); + } + + if (tmp != 0) + return (tmp); + } + } + PRINTK ("dev_tint returning 0 \n"); + return (0); +} + diff --git a/net/tcp/dev.h b/net/tcp/dev.h new file mode 100644 index 0000000..16fe2b1 --- /dev/null +++ b/net/tcp/dev.h @@ -0,0 +1,96 @@ +/* dev.h */ +/* + Copyright (C) 1992 Ross Biro + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + The Author may be reached as bir7@leland.stanford.edu or + C/O Department of Mathematics; Stanford University; Stanford, CA 94305 +*/ +#ifndef _TCP_DEV_H +#define _TCP_DEV_H +/* for future expansion when we will have different priorities. */ +#define DEV_NUMBUFFS 3 +#define MAX_ADDR_LEN 6 +#define MAX_HEADER 14 +#define MAX_ROUTE 16 + +struct device +{ + char *name; + unsigned long rmem_end; + unsigned long rmem_start; + unsigned long mem_end; + unsigned long mem_start; + unsigned short base_addr; + unsigned char irq; + unsigned char start:1, + tbusy:1, + loopback:1, + interrupt:1, + up:1; + struct device *next; + void (*init)(struct device *dev); + unsigned long trans_start; + struct sk_buff *buffs[DEV_NUMBUFFS]; + struct sk_buff *backlog; + int (*open)(struct device *dev); + int (*stop)(struct device *dev); + int (*hard_start_xmit) (struct sk_buff *skb, struct device *dev); + int (*hard_header) (unsigned char *buff, struct device *dev, + unsigned short type, unsigned long daddr, + unsigned long saddr, unsigned len); + void (*add_arp) (unsigned long addr, struct sk_buff *skb, + struct device *dev); + void (*queue_xmit)(struct sk_buff *skb, struct device *dev, int pri); + int (*rebuild_header)(void *eth, struct device *dev); + unsigned short (*type_trans) (struct sk_buff *skb, struct device *dev); + void (*send_packet)(struct sk_buff *skb, struct device *dev); + void *private; + + unsigned short type; + unsigned short hard_header_len; + unsigned short mtu; + unsigned char broadcast[MAX_ADDR_LEN]; + unsigned char dev_addr[MAX_ADDR_LEN]; + unsigned char addr_len; +}; + +extern struct device *dev_base; + +struct packet_type +{ + unsigned short type; /* This is really NET16(ether_type) other devices + will have to translate appropriately. */ + unsigned short copy:1; + int (*func) (struct sk_buff *, struct device *, struct packet_type *); + void *data; + struct packet_type *next; +}; + +/* used by dev_rint */ +#define IN_SKBUFF 1 + +extern struct packet_type *ptype_base; +void dev_queue_xmit (struct sk_buff *skb, struct device *dev, int pri); +int dev_rint (unsigned char *buff, unsigned long len, int flags, + struct device *dev); +unsigned long dev_tint (unsigned char *buff, struct device *dev); +void dev_add_pack (struct packet_type *pt); +void dev_remove_pack (struct packet_type *pt); +struct device *get_dev (char *name); + + +#endif diff --git a/net/tcp/eth.c b/net/tcp/eth.c new file mode 100644 index 0000000..3e6fccd --- /dev/null +++ b/net/tcp/eth.c @@ -0,0 +1,120 @@ +/* eth.c */ +/* + Copyright (C) 1992 Ross Biro + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + The Author may be reached as bir7@leland.stanford.edu or + C/O Department of Mathematics; Stanford University; Stanford, CA 94305 +*/ + +#include <asm/segment.h> +#include <asm/system.h> +#include <linux/types.h> +#include <linux/kernel.h> +#include <linux/sched.h> +#include <linux/string.h> +#include <linux/mm.h> +#include <linux/socket.h> +#include <netinet/in.h> +#include <asm/memory.h> +#include "dev.h" +#include "eth.h" +#include "timer.h" +#include "ip.h" +#include "tcp.h" +#include "sock.h" +#include <linux/errno.h> +#include "arp.h" + +#undef ETH_DEBUG +#ifdef ETH_DEBUG +#define PRINTK printk +#else +#define PRINTK dummy_routine +#endif + +void +print_eth (struct enet_header *eth) +{ + int i; + PRINTK ("ether source addr: "); + for (i =0 ; i < ETHER_ADDR_LEN; i++) + { + PRINTK ("0x%2X ",eth->saddr[i]); + } + PRINTK ("\n"); + + PRINTK ("ether dest addr: "); + for (i =0 ; i < ETHER_ADDR_LEN; i++) + { + PRINTK ("0x%2X ",eth->daddr[i]); + } + PRINTK ("\n"); + PRINTK ("ethertype = %X\n",net16(eth->type)); +} + +int +eth_hard_header (unsigned char *buff, struct device *dev, + unsigned short type, unsigned long daddr, + unsigned long saddr, unsigned len) +{ + struct enet_header *eth; + eth = (struct enet_header *)buff; + eth->type = net16(type); + memcpy (eth->saddr, dev->dev_addr, dev->addr_len); + if (daddr == 0) + { + memset (eth->daddr, 0xff, dev->addr_len); + return (14); + } + if (!arp_find (eth->daddr, daddr, dev, saddr)) + { + return (14); + } + else + { + *(unsigned long *)eth->saddr = saddr; + return (-14); + } +} + +int +eth_rebuild_header (void *buff, struct device *dev) +{ + struct enet_header *eth; + eth = buff; + if (arp_find(eth->daddr, *(unsigned long*)eth->daddr, dev, + *(unsigned long *)eth->saddr)) + return (1); + memcpy (eth->saddr, dev->dev_addr, dev->addr_len); + return (0); +} + +void +eth_add_arp (unsigned long addr, struct sk_buff *skb, struct device *dev) +{ + struct enet_header *eh; + eh = (struct enet_header *)(skb + 1); + arp_add (addr, eh->saddr, dev); +} + +unsigned short +eth_type_trans (struct sk_buff *skb, struct device *dev) +{ + struct enet_header *eh; + eh = (struct enet_header *)(skb + 1); + return (eh->type); +} diff --git a/net/tcp/eth.h b/net/tcp/eth.h new file mode 100644 index 0000000..a849d3b --- /dev/null +++ b/net/tcp/eth.h @@ -0,0 +1,93 @@ +/* eth.h */ +/* + Copyright (C) 1992 Ross Biro + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + The Author may be reached as bir7@leland.stanford.edu or + C/O Department of Mathematics; Stanford University; Stanford, CA 94305 +*/ + + +#ifndef _TCP_ETH_H +#define _TCP_ETH_H + +#define ETHER_MIN_LEN 64 +#define ETHER_ADDR_LEN 6 + +#define ETHERTYPE_ARP 0x806 +#define ETHERTYPE_IP 0x800 +#define ETHER_TYPE 1 + +/* Reciever modes */ +#define ETH_MODE_MONITOR 1 /* Monitor mode - no receive */ +#define ETH_MODE_PHYSICAL 2 /* Physical address receive only */ +#define ETH_MODE_BROADCAST 3 /* Broadcast receive + mode 2 */ +#define ETH_MODE_MULTICAST 4 /* Multicast receive + mode 3 */ +#define ETH_MODE_PROMISCUOUS 5 /* Promiscuous mode - receive all */ + +#define WD_RX_SAVE_ERRORS 1 /* save error packets */ +#define WD_RX_RUNT 2 /* accept runt packets */ +#define WD_RX_BROAD 4 /* accept broadcast packets */ +#define WD_RX_MULTI 8 /* accept multicast packets */ +#define WD_RX_PROM 0x10 /* accept all packets */ +#define WD_RX_MON 0x20 /* monitor mode (just count packets) */ + +#define NET16(x) (((x&0xff)<<8)|((x>>8)&0xff)) + +struct enet_header +{ + unsigned char daddr[ETHER_ADDR_LEN]; + unsigned char saddr[ETHER_ADDR_LEN]; + unsigned short type; +}; + +#define ETHER_HEADER sizeof(struct enet_header) + +struct enet_statistics{ + int rx_packets; /* total packets received */ + int tx_packets; /* total packets transmitted */ + int rx_errors; /* bad packets received */ + int tx_errors; /* packet transmit problems */ + int rx_dropped; /* no space in linux buffers */ + int tx_dropped; /* no space available in linux */ + int collisions; /* total number of collisions */ + int multicast; /* multicast packets received */ + /* detailed rx_errors: */ + int rx_length_errors; + int rx_over_errors; /* receiver overwrote ring buffer in card */ + int rx_crc_errors; /* received packet with crc error */ + int rx_frame_errors; /* received frame alignment error */ + int rx_fifo_errors; /* receiver fifo overrun */ + int rx_missed_errors; /* receiver missed packet */ + /* detailed tx_errors */ + int tx_aborted_errors; + int tx_carrier_errors; + int tx_fifo_errors; + int tx_heartbeat_errors; + int tx_window_errors; +}; + +void print_eth(struct enet_header *eth); +int eth_hard_header (unsigned char *buff, struct device *dev, + unsigned short type, unsigned long daddr, + unsigned long saddr, unsigned len); + +int eth_rebuild_header(void *eth, struct device *dev); +void eth_add_arp (unsigned long addr, struct sk_buff *skb, + struct device *dev); +unsigned short eth_type_trans (struct sk_buff *skb, struct device *dev); + +#endif diff --git a/net/tcp/icmp.c b/net/tcp/icmp.c new file mode 100644 index 0000000..9c75ea1 --- /dev/null +++ b/net/tcp/icmp.c @@ -0,0 +1,283 @@ +/* Internet Control Message Protocol (ICMP) icmp.c */ + +/* + Copyright (C) 1992 Bob Harris + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + The Author of tcpip package may be reached as bir7@leland.stanford.edu or + C/O Department of Mathematics; Stanford University; Stanford, CA 94305 + + The author of this file may be reached at rth@sparta.com or Sparta, Inc. + 7926 Jones Branch Dr. Suite 900, McLean Va 22102. +*/ + +/* modified by Ross Biro bir7@leland.stanford.edu to do more than just + echo responses. */ + +#include <linux/types.h> +#include <linux/sched.h> +#include <linux/kernel.h> /* free_s */ +#include <linux/fcntl.h> +#include <linux/socket.h> +#include <netinet/in.h> +#include "timer.h" +#include "ip.h" +#include "tcp.h" +#include "sock.h" +#include <linux/errno.h> +#include <linux/timer.h> +#include <asm/system.h> +#include <asm/segment.h> +#include "../kern_sock.h" /* for PRINTK */ +#include "icmp.h" + +#define min(a,b) ((a)<(b)?(a):(b)) + +/* an array of errno for error messages from dest unreach. */ +struct icmp_err icmp_err_convert[]= +{ + {ENETUNREACH, 1}, + {EHOSTUNREACH, 1}, + {ENOPROTOOPT, 1}, + {ECONNREFUSED, 1}, + {EOPNOTSUPP, 0}, + {EOPNOTSUPP, 0}, + {ENETUNREACH, 1}, + {EHOSTDOWN, 1}, + {ENONET, 1}, + {ENETUNREACH, 1}, + {EHOSTUNREACH, 1}, + {EOPNOTSUPP, 0}, + {EOPNOTSUPP, 0} +}; + +void +print_icmph (struct icmp_header *icmph) +{ + PRINTK (" type = %d, code = %d, checksum = %X\n", icmph->type, + icmph->code, icmph->checksum); + PRINTK (" gateway = %X\n", icmph->un.gateway); +} + +/* sends an icmp message in response to a packet. */ +void +icmp_reply (struct sk_buff *skb_in, int type, int code, struct device *dev) +{ + struct sk_buff *skb; + struct ip_header *iph; + int offset; + struct icmp_header *icmph; + + int len; + /* get some memory for the replay. */ + len = sizeof (*skb) + 8 /* amount of header to return. */ + + sizeof (struct icmp_header) + + 64 /* enough for an ip header. */ + + dev->hard_header_len; + + skb = malloc (len); + if (skb == NULL) return; + + skb->mem_addr = skb; + skb->mem_len = len; + + len -= sizeof (*skb); + + /* find the ip header. */ + iph = (struct ip_header *)(skb_in+1); + iph = (struct ip_header *)((unsigned char *)iph + dev->hard_header_len); + + /* Build Layer 2-3 headers for message back to source */ + offset = ip_build_header( skb, iph->daddr, iph->saddr, + &dev, IP_ICMP, NULL, len ); + + if (offset < 0) + { + skb->sk = NULL; + free_skb (skb, FREE_READ); + return; + } + + /* Readjust length according to actual IP header size */ + skb->len = offset + sizeof (struct icmp_header) + 8; + + icmph = (struct icmp_header *)((unsigned char *)(skb+1) + offset); + icmph->type = type; + icmph->code = code; + icmph->checksum = 0; /* we don't need to compute this. */ + icmph->un.gateway = 0; /* might as well 0 it. */ + memcpy (icmph+1, iph+1, 8); + /* send it and free it. */ + ip_queue_xmit (NULL, dev, skb, 1); + +} + +/* deals with incoming icmp packets. */ + +int +icmp_rcv(struct sk_buff *skb1, struct device *dev, struct options *opt, + unsigned long daddr, unsigned short len, + unsigned long saddr, int redo, struct ip_protocol *protocol ) +{ + int size, offset; + struct icmp_header *icmph, *icmphr; + struct sk_buff *skb; + unsigned char *buff; + + + /* drop broadcast packets. */ + if ((daddr & 0xff000000) == 0 || (daddr & 0xff000000) == 0xff000000) + { + skb1->sk = NULL; + free_skb (skb1, FREE_READ); + return (0); + } + + buff = skb1->h.raw; + + icmph = (struct icmp_header *)buff; + + /* Validate the packet first */ + if( icmph->checksum ) + { /* Checksums Enabled? */ + if( ip_compute_csum( (unsigned char *)icmph, len ) ) + { + /* Failed checksum! */ + PRINTK("\nICMP ECHO failed checksum!"); + skb1->sk = NULL; + free_skb (skb1, FREE_READ); + return (0); + } + } + + print_icmph(icmph); + + /* Parse the ICMP message */ + switch( icmph->type ) + { + case ICMP_DEST_UNREACH: + case ICMP_SOURCE_QUENCH: + { + struct ip_header *iph; + struct ip_protocol *ipprot; + unsigned char hash; + int err; + + err = icmph->type << 8 | icmph->code; + + /* we need to cause the socket to be closed and the error message + to be set appropriately. */ + iph = (struct ip_header *)(icmph+1); + + /* get the protocol(s) */ + hash = iph->protocol & (MAX_IP_PROTOS -1 ); + for (ipprot = ip_protos[hash]; ipprot != NULL; ipprot=ipprot->next) + { + /* pass it off to everyone who wants it. */ + ipprot->err_handler (err, (unsigned char *)iph+4*iph->ihl, + iph->daddr, iph->saddr, ipprot); + } + skb1->sk = NULL; + free_skb (skb1, FREE_READ); + return (0); + } + + case ICMP_REDIRECT: + { + /* we need to put a new route in the routing table. */ + struct rtable *rt; /* we will add a new route. */ + struct ip_header *iph; + + iph = (struct ip_header *)(icmph+1); + rt = malloc (sizeof (*rt)); + if (rt != NULL) + { + rt->net = iph->daddr; + /* assume class C network. Technically this is incorrect, + but will give it a try. */ + if ((icmph->code & 1) == 0) rt->net &= 0x00ffffff; + rt->dev = dev; + rt->router = icmph->un.gateway; + add_route (rt); + } + skb1->sk = NULL; + free_skb (skb1, FREE_READ); + return (0); + } + + case ICMP_ECHO: + + /* Allocate an sk_buff response buffer (assume 64 byte IP header) */ + + size = sizeof( struct sk_buff ) + dev->hard_header_len + 64 + len; + skb = malloc( size ); + if (skb == NULL) + { + skb1->sk = NULL; + free_skb (skb1, FREE_READ); + return (0); + } + skb->sk = NULL; + skb->mem_addr = skb; + skb->mem_len = size; + + /* Build Layer 2-3 headers for message back to source */ + offset = ip_build_header( skb, daddr, saddr, &dev, IP_ICMP, opt, len ); + if (offset < 0) + { + /* Problems building header */ + PRINTK("\nCould not build IP Header for ICMP ECHO Response"); + free_s (skb->mem_addr, skb->mem_len); + skb1->sk = NULL; + free_skb (skb1, FREE_READ); + return( 0 ); /* just toss the received packet */ + } + + /* Readjust length according to actual IP header size */ + skb->len = offset + len; + + /* Build ICMP_ECHO Response message */ + icmphr = (struct icmp_header *)( (char *)( skb + 1 ) + offset ); + memcpy( (char *)icmphr, (char *)icmph, len ); + icmphr->type = ICMP_ECHOREPLY; + icmphr->code = 0; + icmphr->checksum = 0; + + if( icmph->checksum ) + { /* Calculate Checksum */ + icmphr->checksum = ip_compute_csum( (void *)icmphr, len ); + } + + /* Ship it out - free it when done */ + ip_queue_xmit( (volatile struct sock *)NULL, dev, skb, 1 ); + + skb1->sk = NULL; + free_skb (skb1, FREE_READ); + return( 0 ); + + default: + PRINTK("\nUnsupported ICMP type = x%x", icmph->type ); + skb1->sk = NULL; + free_skb (skb1, FREE_READ); + return( 0 ); /* just toss the packet */ + } + + /* should be unecessary, but just in case. */ + skb1->sk = NULL; + free_skb (skb1, FREE_READ); + return( 0 ); /* just toss the packet */ +} + diff --git a/net/tcp/icmp.h b/net/tcp/icmp.h new file mode 100644 index 0000000..ada5286 --- /dev/null +++ b/net/tcp/icmp.h @@ -0,0 +1,64 @@ +/* Internet Control Message Protocol (ICMP) header file */ + + +#define ICMP_ECHOREPLY 0 +#define ICMP_DEST_UNREACH 3 +#define ICMP_SOURCE_QUENCH 4 +#define ICMP_REDIRECT 5 +#define ICMP_ECHO 8 +#define ICMP_TIME_EXCEEDED 11 +#define ICMP_PARAMETERPROB 12 +#define ICMP_TIMESTAMP 13 +#define ICMP_TIMESTAMPREPLY 14 +#define ICMP_INFO_REQUEST 15 +#define ICMP_INFO_REPLY 16 + + +/* used by unreachable. */ + +#define ICMP_NET_UNREACH 0 +#define ICMP_HOST_UNREACH 1 +#define ICMP_PROT_UNREACH 2 +#define ICMP_PORT_UNREACH 3 /* lots of room for confusion. */ +#define ICMP_FRAG_NNEDED 4 +#define ICMP_SR_FAILED 5 +#define ICMP_NET_UNKNOWN 6 +#define ICMP_HOST_UNKNOWN 7 +#define ICMP_HOST_ISOLATED 8 +#define ICMP_NET_ANO 9 +#define ICMP_HOST_ANO 10 +#define ICMP_NET_UNR_TOS 11 +#define ICMP_HOST_UNR_TOS 12 + + +struct icmp_header +{ + unsigned char type; + unsigned char code; + unsigned short checksum; + union + { + struct + { + unsigned short id; + unsigned short sequence; + } echo; + unsigned long gateway; + } un; +}; + +struct icmp_err +{ + int errno; + unsigned fatal:1; +}; + +extern struct icmp_err icmp_err_convert[]; + +int +icmp_rcv(struct sk_buff *skb, struct device *dev, struct options *opt, + unsigned long daddr, unsigned short len, + unsigned long saddr, int redo, struct ip_protocol *protocol); + +void +icmp_reply (struct sk_buff *skb_in, int type, int code, struct device *dev); diff --git a/net/tcp/ip.c b/net/tcp/ip.c new file mode 100644 index 0000000..35d2a73 --- /dev/null +++ b/net/tcp/ip.c @@ -0,0 +1,931 @@ +/* ip.c */ +/* + Copyright (C) 1992 Ross Biro + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + The Author may be reached as bir7@leland.stanford.edu or + C/O Department of Mathematics; Stanford University; Stanford, CA 94305 +*/ + +#include <asm/segment.h> +#include <asm/system.h> +#include <linux/types.h> +#include <linux/kernel.h> +#include <linux/sched.h> +#include <linux/string.h> +#include <linux/socket.h> +#include <netinet/in.h> +#include "timer.h" +#include "ip.h" +#include "tcp.h" +#include "sock.h" +#include <linux/errno.h> +#include "arp.h" +#include "icmp.h" + +unsigned long ip_addr[MAX_IP_ADDRES]={0,0,0}; + +#undef IP_DEBUG +#ifdef IP_DEBUG +#define PRINTK printk +#else +#define PRINTK dummy_routine +#endif + +static struct rtable *rt_base=NULL; /* used to base all the routing data. */ + +struct ip_protocol *ip_protos[MAX_IP_PROTOS] = { NULL, }; + +#if 0 +static struct ip_protocol * +get_protocol(unsigned char prot) +{ + unsigned char hash; + struct ip_protocol *p; + PRINTK ("get_protocol (%d)\n ", prot); + hash = prot & (MAX_IP_PROTOS -1); + for (p = ip_protos[hash] ; p != NULL; p=p->next) + { + PRINTK ("trying protocol %d\n", p->protocol); + if (p->protocol == prot) + return (p); + } + return (NULL); + +} +#endif + +void +add_ip_protocol (struct ip_protocol *prot) +{ + unsigned char hash; + struct ip_protocol *p2; + hash = prot->protocol & (MAX_IP_PROTOS-1); + prot ->next = ip_protos[hash]; + ip_protos[hash] = prot; + prot->copy = 0; + /* set the copy bit if we need to. */ + for (p2 = prot->next; p2 != NULL; p2=p2->next) + { + if (p2->protocol == prot->protocol) + { + prot->copy = 1; + break; + } + } + +} + +int +delete_ip_protocol (struct ip_protocol *prot) +{ + struct ip_protocol *p; + struct ip_protocol *lp=NULL; + unsigned char hash; + + + hash = prot->protocol & (MAX_IP_PROTOS -1); + if (prot == ip_protos[hash]) + { + ip_protos[hash]=ip_protos[hash]->next; + return (0); + } + + for (p = ip_protos[hash]; p != NULL; p = p->next) + { + /* we have to worry if the protocol being deleted is the + last one on the list, then we may need to reset someones + copied bit. */ + if (p->next != NULL && p->next == prot) + { + /* if we are the last one with this protocol and + there is a previous one, reset its copy bit. */ + + if (p->copy == 0 && lp != NULL) + lp->copy = 0; + p->next = prot->next; + return (0); + } + + if (p->next != NULL && p->next->protocol == prot->protocol) + { + lp = p; + } + } + return (-1); +} + +/* addr1 is the address which may or may not be broadcast etc. + addr2 is the "real addr." */ + +int +ip_addr_match (unsigned long addr1, unsigned long addr2) +{ + int i; + if (addr1 == addr2) return (1); + for (i = 0; i < 4; i++, addr1 >>= 8, addr2 >>= 8) + { + if ((addr1 & 0xff) != (addr2 & 0xff)) + { + /* the only way this could be a match is for the rest of + addr1 to be 0. */ + if (addr1 != 0) + { + return (0); + } + return (1); + } + } + return (1); +} + +int +my_ip_addr(unsigned long addr) +{ + int i; + for (i = 0; i < MAX_IP_ADDRES; i++) + { + if (ip_addr[i] == 0) return (0); + if (ip_addr_match (addr, ip_addr[i])) return (1); + } + return (0); +} + +/* these two routines will do routining. */ +static void +strict_route(struct ip_header *iph, struct options *opt) +{ +} + +static void +loose_route(struct ip_header *iph, struct options *opt) +{ +} + +void +print_rt(struct rtable *rt) +{ + PRINTK ("net = %08X router = %08X\n",rt->net, rt->router); + PRINTK ("dev = %X, next = %X\n",rt->dev, rt->next); +} + +void +print_ipprot (struct ip_protocol *ipprot) +{ + PRINTK ("handler = %X, protocol = %d\n", + ipprot->handler, ipprot->protocol); +} + +/* This assumes that address are all in net order. */ +static struct device * +ip_route(struct options *opt, unsigned long daddr , unsigned long *raddr) +{ + struct rtable *rt; + /* look through the routing table for some + kind of match. */ + for (rt=rt_base; rt != NULL; rt=rt->next) + { + /* see if we found one. */ + if (ip_addr_match (rt->net, daddr)) + { + *raddr = rt->router; + return (rt->dev); + } + } + return (NULL); +}; + +void +add_route (struct rtable *rt) +{ + int mask; + struct rtable *r; + struct rtable *r1; + PRINTK ("add_route (rt=%X):\n",rt); + print_rt(rt); + + if (rt_base == NULL) + { + rt->next = NULL; + rt_base = rt; + return; + } + + /* what we have to do is loop though this until we have found the + first address which has the same generality as the one in rt. Then + we can put rt in after it. */ + for (mask = 0xff000000; mask != 0xffffffff; mask = (mask >> 8) | mask) + { + if (mask & rt->net) + { + mask = mask << 8; + break; + } + } + PRINTK ("mask = %X\n",mask); + r1=rt_base; + for (r=rt_base; r != NULL; r=r->next) + { + /* see if we are getting a duplicate. */ + if (r->net == rt->net) + { + if (r == rt_base) + { + rt->next = r->next; + rt_base = rt; + } + else + { + rt->next = r->next; + r1->next = rt; + } + free_s (r, sizeof (*r)); + return; + } + + if (!(r->net & mask)) + { + PRINTK("adding before r=%X\n",r); + print_rt(r); + if (r == rt_base) + { + rt->next = rt_base; + rt_base = rt; + return; + } + rt->next = r; + r1->next = rt; + return; + } + r1 = r; + } + PRINTK ("adding after r1=%X\n",r1); + print_rt(r1); + /* goes at the end. */ + rt->next = NULL; + r1->next = rt; +} + +int +ip_set_dev (struct ip_config *u_ipc) +{ + struct rtable *rt; + struct device *dev; + struct ip_config ipc; + static int ip_ads = 0; + + if (ip_ads >= MAX_IP_ADDRES) return (-EINVAL); + + verify_area (u_ipc, sizeof (ipc)); + memcpy_fromfs(&ipc, u_ipc, sizeof (ipc)); + ipc.name[MAX_IP_NAME-1] = 0; + dev = get_dev (ipc.name); + + if (dev == NULL) return (-EINVAL); + + /* see if we need to add a broadcast address. */ + if (ipc.net != -1) + { + arp_add_broad (ipc.net, dev); + rt = malloc (sizeof (*rt)); + if (rt == NULL) return (-ENOMEM); + + rt->net = ipc.net; + rt->dev = dev; + rt->router = 0; + add_route (rt); +/* dev->net = ipc.net;*/ + } + + if (ipc.router != -1) + { + rt = malloc (sizeof (*rt)); + if (rt == NULL) return (-ENOMEM); + rt->net = 0; + rt->dev = dev; + rt->router = ipc.router; + add_route (rt); + } + + if (dev->loopback) + { + rt = malloc (sizeof (*rt)); + if (rt == NULL) return (-ENOMEM); + rt->net = ipc.paddr; + rt->dev = dev; + rt->router = 0; + add_route (rt); + + } + + + if (!my_ip_addr (ipc.paddr)) + ip_addr[ip_ads++] = ipc.paddr; + + dev->up = ipc.up; + if (dev->up) + { + if (dev->open) + dev->open(dev); + } + else + { + if (dev->stop) + dev->stop(dev); + } + return (0); + +} + +/* this routine will check to see if we have lost a gateway. */ +void +ip_route_check (unsigned long daddr) +{ +} + +/* this routine puts the options at the end of an ip header. */ +static int +build_options (struct ip_header *iph, struct options *opt) +{ + unsigned char *ptr; + /* currently we don't support any options. */ + ptr = (unsigned char *)(iph+1); + *ptr = 0; + return (4); +} + +/* This routine builds the appropriate hardware/ip headers for + the routine. It assumes that if *prot != NULL then the + protocol knows what it's doing, otherwise it uses the + routing/arp tables to select a protocol struct. */ + +int +ip_build_header (struct sk_buff *skb, unsigned long saddr, + unsigned long daddr, struct device **dev, int type, + struct options *opt, int len) +{ + static struct options optmem; + struct ip_header *iph; + unsigned char *buff; + static int count = 0; + unsigned long raddr; /* for the router. */ + int tmp; + if (saddr == 0) saddr = MY_IP_ADDR; + PRINTK ("ip_build_header (skb=%X, saddr=%X, daddr=%X, *dev=%X,\n" + " type=%d, opt=%X, len = %d)\n", + skb, saddr, daddr, *dev, type, opt, len); + buff = (unsigned char *)(skb + 1); + /* see if we need to look up the device. */ + if (*dev == NULL) + { + *dev = ip_route(&optmem,daddr, &raddr); + if (*dev == NULL) + { + return (-ENETUNREACH); + } + opt = &optmem; + } + else + { + /* we still need the address of the first hop. */ + ip_route (&optmem, daddr, &raddr); + } + if (raddr == 0) raddr = daddr; + /* now build the header. */ + /* we need to worry about routing in here. daddr should + really be the address of the next hop. */ + /* but raddr is . */ + if ((*dev)->hard_header) + { + tmp = (*dev)->hard_header(buff, *dev, ETHERTYPE_IP, raddr, saddr, len); + } + else + { + tmp = 0; + } + if (tmp < 0) + { + tmp = -tmp; + skb->arp = 0; + } + else + { + skb->arp = 1; + } + buff += tmp; + len -= tmp; + skb->dev = *dev; + /* now build the ip header. */ + iph = (struct ip_header *)buff; + iph->version = 4; + iph->tos = 0; + iph->frag_off = 0; + iph->ttl = 32; + iph->daddr = daddr; + iph->saddr = saddr; + iph->protocol=type; + iph->ihl = 5; + iph->id = net16(count++); + /* build_options (iph, opt);*/ + return (20+tmp); +} + +static int +do_options(struct ip_header *iph, struct options *opt) +{ + unsigned char *buff; + int done = 0; + int len=sizeof (*iph); + int i; + /* zero out the options. */ + opt->record_route.route_size = 0; + opt->loose_route.route_size = 0; + opt->strict_route.route_size = 0; + opt->tstamp.ptr = 0; + opt->security = 0; + opt->compartment = 0; + opt->handling = 0; + opt->stream = 0; + opt->tcc = 0; + return (0); + /* advance the pointer to start at the options. */ + buff = (unsigned char *)(iph + 1); + + /*now start the processing. */ + while (!done && len < iph->ihl*4) + { + switch (*buff) + { + case IPOPT_END: + done=1; + break; + + case IPOPT_NOOP: + buff++; + len ++; + break; + + case IPOPT_SEC: + buff++; + if (*buff != 11) + return (1); + buff++; + opt->security = net16(*(unsigned short *)buff); + buff += 2; + opt->compartment = net16(*(unsigned short *)buff); + buff += 2; + opt-> handling = net16(*(unsigned short *)buff); + buff += 2; + opt->tcc = ((*buff) << 16) + net16(*(unsigned short *)(buff+1)); + buff += 3; + len += 11; + break; + + case IPOPT_LSRR: + buff ++; + if ((*buff - 3)% 4 != 0) return (1); + len += *buff; + opt->loose_route.route_size = (*buff -3)/4; + buff ++; + if (*buff % 4 != 0) return (1); + opt->loose_route.pointer = *buff/4 - 1; + buff ++; + buff ++; + for (i = 0; i < opt->loose_route.route_size; i++) + { + opt->loose_route.route[i]=*(unsigned long *)buff; + buff += 4; + } + break; + + + case IPOPT_SSRR: + buff ++; + if ((*buff - 3)% 4 != 0) return (1); + len += *buff; + opt->strict_route.route_size = (*buff -3)/4; + buff ++; + if (*buff % 4 != 0) return (1); + opt->strict_route.pointer = *buff/4 - 1; + buff ++; + buff ++; + for (i = 0; i < opt->strict_route.route_size; i++) + { + opt->strict_route.route[i]=*(unsigned long *)buff; + buff += 4; + } + break; + + case IPOPT_RR: + buff ++; + if ((*buff - 3)% 4 != 0) return (1); + len += *buff; + opt->record_route.route_size = (*buff -3)/4; + buff ++; + if (*buff % 4 != 0) return (1); + opt->record_route.pointer = *buff/4 - 1; + buff ++; + buff ++; + for (i = 0; i < opt->record_route.route_size; i++) + { + opt->record_route.route[i]=*(unsigned long *)buff; + buff += 4; + } + break; + + case IPOPT_SID: + len += 4; + buff +=2; + opt->stream = *(unsigned short *)buff; + buff += 2; + break; + + case IPOPT_TIMESTAMP: + buff ++; + len += *buff; + if (*buff % 4 != 0) return (1); + opt->tstamp.len = *buff / 4 - 1; + buff ++; + if ((*buff - 1) % 4 != 0) return (1); + opt->tstamp.ptr = (*buff-1)/4; + buff ++; + opt->tstamp.x.full_char = *buff; + buff ++; + for (i = 0; i < opt->tstamp.len; i++) + { + opt->tstamp.data[i] = *(unsigned long *)buff; + buff += 4; + } + break; + + default: + return (1); + } + } + if (opt->record_route.route_size == 0) + { + if (opt->strict_route.route_size != 0) + { + memcpy (&(opt->record_route), &(opt->strict_route), + sizeof (opt->record_route)); + } + else if (opt->loose_route.route_size != 0) + { + memcpy (&(opt->record_route), &(opt->loose_route), + sizeof (opt->record_route)); + } + } + + if (opt->strict_route.route_size != 0 && + opt->strict_route.route_size != opt->strict_route.pointer) + { + strict_route (iph, opt); + return (0); + } + + if (opt->loose_route.route_size != 0 && + opt->loose_route.route_size != opt->loose_route.pointer) + { + loose_route (iph, opt); + return (0); + } + + return (0); +} + + +/* This routine does all the checksum computations that don't require + anything special (like copying or special headers.) */ + +unsigned short +ip_compute_csum(unsigned char * buff, int len) +{ + unsigned long sum = 0; + if (len > 3) + { + /* do the first multiple of 4 bytes and convert to 16 bits. */ + __asm__("\t clc\n" + "1:\n" + "\t lodsl\n" + "\t adcl %%eax, %%ebx\n" + "\t loop 1b\n" + "\t adcl $0, %%ebx\n" + "\t movl %%ebx, %%eax\n" + "\t shrl $16, %%eax\n" + "\t addw %%ax, %%bx\n" + "\t adcw $0, %%bx\n" + : "=b" (sum) , "=S" (buff) + : "0" (sum), "c" (len >> 2) ,"1" (buff) + : "ax", "cx", "si", "bx" ); + } + if (len & 2) + { + __asm__("\t lodsw\n" + "\t addw %%ax, %%bx\n" + "\t adcw $0, %%bx\n" + : "=b" (sum), "=S" (buff) + : "0" (sum), "1" (buff) + : "bx", "ax", "si"); + } + if (len & 1) + { + __asm__("\t lodsb\n" + "\t movb $0, %%ah\n" + "\t addw %%ax, %%bx\n" + "\t adcw $0, %%bx\n" + : "=b" (sum), "=S" (buff) + : "0" (sum), "1" (buff) + : "bx", "ax", "si"); + } + sum =~sum; + return (sum&0xffff); +} + +static int +ip_csum(struct ip_header *iph) +{ + if (iph->check == 0) return (0); + if (ip_compute_csum((unsigned char *)iph, iph->ihl*4) == 0) return (0); + return (1); +} + +static void +ip_send_check(struct ip_header *iph) +{ + iph->check = 0; + iph->check = ip_compute_csum((unsigned char *)iph, iph->ihl*4); +} + +int +ip_rcv(struct sk_buff *skb, struct device *dev, struct packet_type *pt) +{ + struct ip_header *iph; + unsigned char hash; + unsigned char flag=0; + static struct options opt; /* since we don't use these yet, and they + take up stack space. */ + struct ip_protocol *ipprot; + + iph=skb->h.iph; + + PRINTK("<<\n"); + print_iph(iph); + + if (ip_csum (iph) || do_options (iph,&opt) || iph->version != 4) + { + PRINTK ("ip packet thrown out. \n"); + skb->sk = NULL; + free_skb(skb, 0); + return (0); + } + + /* for now we will only deal with packets meant for us. */ + if (!my_ip_addr(iph->daddr)) + { + PRINTK ("packet meant for someone else.\n"); + skb->sk = NULL; + free_skb(skb, 0); + return (0); + } + + /* deal with fragments. or don't for now.*/ + if ((iph->frag_off & 64) || (net16(iph->frag_off)&0x1fff)) + { + printk ("packet fragmented. \n"); + skb->sk = NULL; + free_skb(skb, 0); + return(0); + } + + skb->h.raw += iph->ihl*4; + + /* add it to the arp table if it's talking to us. That way we + will be able to talk to them also. */ + + hash = iph->protocol & (MAX_IP_PROTOS -1); + for (ipprot = ip_protos[hash]; ipprot != NULL; ipprot=ipprot->next) + { + struct sk_buff *skb2; + PRINTK ("Using protocol = %X:\n", ipprot); + print_ipprot (ipprot); + /* pass it off to everyone who wants it. */ + /* we should check the return values here. */ + /* see if we need to make a copy of it. This will + only be set if more than one protpocol wants it. + and then not for the last one. */ + + if (ipprot->copy) + { + skb2 = malloc (skb->mem_len); + if (skb2 == NULL) continue; + memcpy (skb2, skb, skb->mem_len); + skb2->mem_addr = skb2; + } + else + { + skb2 = skb; + } + flag = 1; + ipprot->handler (skb2, dev, &opt, iph->daddr, + net16(iph->tot_len) - iph->ihl*4, + iph->saddr, 0, ipprot); + + } + if (!flag) + { + icmp_reply (skb, ICMP_DEST_UNREACH, ICMP_PROT_UNREACH, dev); + skb->sk = NULL; + free_skb (skb, 0); + } + + + return (0); +} + + +/* queues a packet to be sent, and starts the transmitter if + necessary. if free = 1 then we free the block after transmit, + otherwise we don't. */ +/* This routine also needs to put in the total length, and compute + the checksum. */ +void +ip_queue_xmit (volatile struct sock *sk, struct device *dev, + struct sk_buff *skb, int free) +{ + struct ip_header *iph; + unsigned char *ptr; + if (sk == NULL) free = 1; + skb->free = free; + skb->dev = dev; + skb->when = jiffies; + PRINTK(">>\n"); + ptr = (unsigned char *)(skb + 1); + ptr += dev->hard_header_len; + iph = (struct ip_header *)ptr; + iph->tot_len = net16(skb->len-dev->hard_header_len); + ip_send_check (iph); + print_iph(iph); + skb->next = NULL; + if (!free) + { + skb->link3 = NULL; + sk->packets_out++; + cli(); + if (sk->send_tail == NULL) + { + sk->send_tail = skb; + sk->send_head = skb; + } + else + { + sk->send_tail->link3 = skb; + sk->send_tail = skb; + } + sti(); + sk->time_wait.len = sk->rtt*2; + sk->timeout=TIME_WRITE; + reset_timer ((struct timer *)&sk->time_wait); + } + else + { + skb->sk = sk; + } + if (dev->up) + { + if (sk) + dev->queue_xmit(skb, dev, sk->priority); + else + dev->queue_xmit (skb, dev, SOPRI_NORMAL); + } + else + { + if (free) + free_skb (skb, FREE_WRITE); + } +} + +void +ip_retransmit (volatile struct sock *sk, int all) +{ + struct sk_buff * skb; + struct proto *prot; + struct device *dev; + + prot = sk->prot; + skb = sk->send_head; + while (skb != NULL) + { + dev = skb->dev; + /* rebuild_header sees if the arp is done. If not it sends a new + arp, and if so it builds the header. */ + if (!skb->arp) + { + if (dev->rebuild_header ((struct enet_header *)(skb+1),dev)) + { + if (!all) break; + skb=skb->link3; + continue; + } + } + skb->arp = 1; + skb->when = jiffies; + + if (dev->up) + if (sk) + dev->queue_xmit(skb, dev, sk->priority); + else + dev->queue_xmit(skb, dev, SOPRI_NORMAL ); + + sk->retransmits++; + sk->prot->retransmits ++; + if (!all) break; + /* this should cut it off before we send too + many packets. */ + if (sk->retransmits > sk->cong_window) break; + skb=skb->link3; + } + sk->time_wait.len = sk->rtt*2; + sk->timeout = TIME_WRITE; + reset_timer ((struct timer *)&sk->time_wait); +} + +void +print_iph (struct ip_header *ip) +{ + PRINTK ("ip header:\n"); + PRINTK (" ihl = %d, version = %d, tos = %d, tot_len = %d\n", + ip->ihl, ip->version, ip->tos, net16(ip->tot_len)); + PRINTK (" id = %x, ttl = %d, prot = %d, check=%x\n", + ip->id, ip->ttl, ip->protocol, ip->check); + PRINTK (" frag_off=%d\n", ip->frag_off); + PRINTK (" saddr = %X, daddr = %X\n",ip->saddr, ip->daddr); +} + +#if 0 +int +ip_handoff (volatile struct sock *sk) +{ + struct ip_protocol *p; + struct sk_buff *skb; + p = get_protocol (sk->protocol); + + if (p == NULL) + { + /* this can never happen. */ + printk ("sock_ioctl: protocol not found. \n"); + /* what else can I do, I suppose I could send a sigkill. */ + return (-EIO); + } + + while (p->handler != sk->prot->rcv) + { + p=p->next; + if (p == NULL) + { + /* this can never happen. */ + printk ("sock_ioctl: protocol not found. \n"); + /* what else can I do, I suppose I could send a sigkill. */ + return (-EIO); + } + } + p = p-> next; + sk->inuse = 1; + + /* now we have to remove the top sock buff. If there are none, then + we return. */ + if (sk->rqueue == NULL) return (0); + skb = sk->rqueue; + if (skb->next == skb) + { + sk->rqueue = NULL; + } + else + { + sk->rqueue = skb->next; + skb->next->prev = skb->prev; + skb->prev->next = skb->next; + } + if (p != NULL) + { + p->handler ((unsigned char *)(skb+1), skb->dev, NULL, skb->saddr, + skb->len, skb->daddr, p->protocol, 0); + } + free_skb (skb, FREE_READ); + release_sock (sk); + return (0); +} + +#endif diff --git a/net/tcp/ip.h b/net/tcp/ip.h new file mode 100644 index 0000000..f3faad5 --- /dev/null +++ b/net/tcp/ip.h @@ -0,0 +1,170 @@ +/* ip.h */ +/* + Copyright (C) 1992 Ross Biro + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + The Author may be reached as bir7@leland.stanford.edu or + C/O Department of Mathematics; Stanford University; Stanford, CA 94305 +*/ +#ifndef _TCP_IP_H +#define _TCP_IP_H + +#include "dev.h" +#include <linux/sock_ioctl.h> +#include <netinet/protocols.h> + +struct rtable +{ + unsigned long net; + unsigned long router; + struct device *dev; + struct rtable *next; +}; + +struct route +{ + char route_size; + char pointer; + unsigned long route[MAX_ROUTE]; +}; + +struct timestamp +{ + unsigned char len; + unsigned char ptr; + union + { + unsigned char flags:4, overflow:4; + unsigned char full_char; + } x; + unsigned long data[9]; +}; + +struct options +{ + struct route record_route; + struct route loose_route; + struct route strict_route; + struct timestamp tstamp; + unsigned short security; + unsigned short compartment; + unsigned short handling; + unsigned short stream; + unsigned tcc; +}; + + + +struct ip_header +{ + unsigned char ihl:4, version:4; + unsigned char tos; + unsigned short tot_len; + unsigned short id; + unsigned short frag_off; + unsigned char ttl; + unsigned char protocol; + unsigned short check; + unsigned long saddr; + unsigned long daddr; + /*The options start here. */ +}; + + +#define IPOPT_END 0 +#define IPOPT_NOOP 1 +#define IPOPT_SEC 130 +#define IPOPT_LSRR 131 +#define IPOPT_SSRR 137 +#define IPOPT_RR 7 +#define IPOPT_SID 136 +#define IPOPT_TIMESTAMP 68 +#define IP_LOOPBACK_ADDR 0x0100007f + +static inline unsigned short +net16(unsigned short x) +{ + __asm__("xchgb %%cl,%%ch": "=c" (x) : "0" (x) : "cx"); + return (x); +} + +static inline unsigned long +net32(unsigned long x) +{ + __asm__("xchgb %%cl,%%ch\n" + "\t roll $16,%%ecx\n" + "\t xchgb %%cl,%%ch":"=c" (x):"0"(x):"cx"); + return (x); +} + +/* change the name of this. */ +#define MAX_IP_PROTOS 32 /* Must be a power of 2 */ + +/* This is used to register protocols. */ +struct ip_protocol +{ + int (*handler) (struct sk_buff *skb, struct device *dev, + struct options *opt, unsigned long daddr, + unsigned short len, unsigned long saddr, + int redo, struct ip_protocol *protocol); + void (*err_handler) (int err, unsigned char *buff, unsigned long daddr, + unsigned long saddr, struct ip_protocol *ipprot); + struct ip_protocol *next; + unsigned char protocol; + unsigned char copy:1; + void *data; +}; + +extern struct ip_protocol *ip_protocol_base; +extern struct ip_protocol *ip_protos[MAX_IP_PROTOS]; + +#define MAX_IP_ADDRES 5 +extern unsigned long ip_addr[MAX_IP_ADDRES]; +#define MY_IP_ADDR ip_addr[0]; +int my_ip_addr(unsigned long); + +#include "eth.h" + +void +print_iph (struct ip_header *); + +void +print_eth (struct enet_header *); + +int ip_set_dev (struct ip_config *); + +int ip_build_header(struct sk_buff *skb, unsigned long saddr, + unsigned long daddr, struct device **dev, int type, + struct options *opt, int len); +void ip_queue_xmit (volatile struct sock *sk, struct device *dev, + struct sk_buff *skb, int free); +void ip_retransmit(volatile struct sock *sk, int all); +int ip_rcv(struct sk_buff *buff, struct device *dev, struct packet_type *); +void add_ip_protocol (struct ip_protocol *); +int delete_ip_protocol (struct ip_protocol *); +int ip_handoff (volatile struct sock *sk); +unsigned short ip_compute_csum (unsigned char *buff, int len); +int ip_addr_match (unsigned long, unsigned long); +void add_route (struct rtable *rt); +void ip_route_check (unsigned long daddr); + +#endif + + + + + + diff --git a/net/tcp/loopback.c b/net/tcp/loopback.c new file mode 100644 index 0000000..d9f8b4a --- /dev/null +++ b/net/tcp/loopback.c @@ -0,0 +1,113 @@ +/* loopback.c contains the loopback device functions. */ +/* + Copyright (C) 1992 Ross Biro + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + The Author may be reached as bir7@leland.stanford.edu or + C/O Department of Mathematics; Stanford University; Stanford, CA 94305 +*/ +#include <linux/config.h> +#include <linux/kernel.h> +#include <linux/sched.h> +#include <linux/fs.h> +#include <linux/tty.h> +#include <linux/types.h> +#include <linux/ptrace.h> +#include <asm/system.h> +#include <asm/segment.h> +#include <asm/io.h> +#include <asm/memory.h> +#include <errno.h> +#include <linux/fcntl.h> +#include <netinet/in.h> + +#include "dev.h" +#include "eth.h" +#include "timer.h" +#include "ip.h" +#include "tcp.h" +#include "sock.h" +#include "arp.h" + +#include "../kern_sock.h" /* for PRINTK */ + + + +static int +loopback_xmit(struct sk_buff *skb, struct device *dev) +{ + static int inuse=0; + struct enet_header *eth; + int i; + int done; + static unsigned char buff[2048]; + unsigned char *tmp; + + PRINTK ("loopback_xmit (dev = %X)\n", dev); + cli(); + if (inuse) + { + sti(); + return (1); + } + inuse = 1; + sti(); + tmp = NULL; + done = dev_rint ((unsigned char *)(skb+1), skb->len, 0, dev); + + if (skb->free) + free_skb (skb, FREE_WRITE); + + while (done != 1) + { + if (done != -1 && (i = dev_tint (buff,dev)) != 0) + { + /* print out the buffer. */ + PRINTK ("ethernet xmit: \n"); + eth = (struct enet_header *)buff; + print_eth (eth); + tmp = buff; + done = dev_rint (buff, i, 0, dev); + if (done != -1) tmp = NULL; + } + else + { + done = dev_rint (tmp, 0, 0, dev); + } + + } + inuse = 0; + return (0); +} + +void +loopback_init(struct device *dev) +{ + printk ("Loopback device init\n"); + /* initialize the rest of the device structure. */ + dev->mtu = 2000; /* mtu */ + dev->hard_start_xmit = loopback_xmit; + dev->open = NULL; + dev->hard_header = eth_hard_header; + dev->add_arp = NULL; + dev->hard_header_len = sizeof (struct enet_header); + dev->addr_len = ETHER_ADDR_LEN; + dev->type = ETHER_TYPE; + dev->queue_xmit = dev_queue_xmit; + dev->rebuild_header = eth_rebuild_header; + dev->type_trans = eth_type_trans; + dev->loopback = 1; +} diff --git a/net/tcp/pack_type.c b/net/tcp/pack_type.c new file mode 100644 index 0000000..780fe26 --- /dev/null +++ b/net/tcp/pack_type.c @@ -0,0 +1,56 @@ +/* pack_type.c - implements raw packet sockets. */ +/* + Copyright (C) 1992 Ross Biro + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + The Author may be reached as bir7@leland.stanford.edu or + C/O Department of Mathematics; Stanford University; Stanford, CA 94305 +*/ + +#include <linux/stddef.h> +#include "dev.h" +#include "eth.h" + +extern int arp_rcv (struct sk_buff *skb, struct device *dev, + struct packet_type *pt); + +static struct packet_type arp_packet_type= +{ + NET16(ETHERTYPE_ARP), + 0, /* copy */ + arp_rcv, + NULL, + NULL /* next */ +}; + +extern int ip_rcv (struct sk_buff *skb, struct device *dev, + struct packet_type *pt); + +static struct packet_type ip_packet_type= +{ + NET16(ETHERTYPE_IP), + 0, /* copy */ + ip_rcv, + NULL, + &arp_packet_type +}; + +struct packet_type *ptype_base = &ip_packet_type; + + + + + diff --git a/net/tcp/packet.c b/net/tcp/packet.c new file mode 100644 index 0000000..ffad524 --- /dev/null +++ b/net/tcp/packet.c @@ -0,0 +1,315 @@ +/* packet.c - implements raw packet sockets. */ +/* + Copyright (C) 1992 Ross Biro + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + The Author may be reached as bir7@leland.stanford.edu or + C/O Department of Mathematics; Stanford University; Stanford, CA 94305 +*/ + +#include <linux/types.h> +#include <linux/sched.h> +#include <linux/fcntl.h> +#include <linux/socket.h> +#include <netinet/in.h> +#include "timer.h" +#include "ip.h" +#include "tcp.h" +#include "sock.h" +#include <linux/errno.h> +#include <linux/timer.h> +#include <asm/system.h> +#include <asm/segment.h> +#include "../kern_sock.h" /* for PRINTK */ + +extern struct proto raw_prot; + +static unsigned long +min(unsigned long a, unsigned long b) +{ + if (a < b) return (a); + return (b); +} + +/* this should be the easiest of all, all we do is copy it into + a buffer. */ +int +packet_rcv (struct sk_buff *skb, struct device *dev, struct packet_type *pt) +{ + volatile struct sock *sk; + + sk = pt->data; + skb->dev = dev; + skb->len += dev->hard_header_len; + + /* now see if we are in use. */ + cli(); + if (sk->inuse) + { + sti(); + /* drop any packets if we can't currently deal with them. + Assume that the other end will retransmit if it was + important. */ + skb->sk = NULL; + free_skb (skb, FREE_READ); + return (0); + + } + sk->inuse = 1; + sti (); + + skb->sk = sk; + + /* charge it too the socket. */ + if (sk->rmem_alloc + skb->mem_len >= SK_RMEM_MAX) + { + skb->sk = NULL; + free_skb (skb, FREE_READ); + return (0); + } + + sk->rmem_alloc += skb->mem_len; + + /* now just put it onto the queue. */ + if (sk->rqueue == NULL) + { + sk->rqueue = skb; + skb->next = skb; + skb->prev = skb; + } + else + { + skb->next = sk->rqueue; + skb->prev = sk->rqueue->prev; + skb->prev->next = skb; + skb->next->prev = skb; + } + wake_up (sk->sleep); + release_sock (sk); + return (0); +} + +/* this will do terrible things if len + ipheader + devheader > dev->mtu */ +static int +packet_sendto (volatile struct sock *sk, unsigned char *from, int len, + int noblock, + unsigned flags, struct sockaddr_in *usin, int addr_len) +{ + struct sk_buff *skb; + struct device *dev; + struct sockaddr saddr; + + /* check the flags. */ + if (flags) return (-EINVAL); + if (len < 0) return (-EINVAL); + + /* get and verify the address. */ + if (usin) + { + if (addr_len < sizeof (saddr)) + return (-EINVAL); + verify_area (usin, sizeof (saddr)); + memcpy_fromfs (&saddr, usin, sizeof(saddr)); + } + else + return (-EINVAL); + + skb = sk->prot->wmalloc (sk, len+sizeof (*skb) + sk->prot->max_header, 0); + /* this shouldn't happen, but it could. */ + if (skb == NULL) + { + PRINTK ("packet_sendto: write buffer full?\n"); + print_sk (sk); + return (-EAGAIN); + } + skb->mem_addr = skb; + skb->mem_len = len + sizeof (*skb) +sk->prot->max_header; + skb->sk = sk; + skb->free = 1; + saddr.sa_data[13] = 0; + dev = get_dev (saddr.sa_data); + if (dev == NULL) + { + sk->prot->wfree (sk, skb->mem_addr, skb->mem_len); + return (-ENXIO); + } + verify_area (from, len); + memcpy_fromfs (skb+1, from, len); + skb->len = len; + skb->next = NULL; + if (dev->up) + dev->queue_xmit (skb, dev, sk->priority); + else + free_skb (skb, FREE_WRITE); + return (len); +} + +static int +packet_write (volatile struct sock *sk, unsigned char *buff, + int len, int noblock, unsigned flags) +{ + return (packet_sendto (sk, buff, len, noblock, flags, NULL, 0)); +} + +static void +packet_close (volatile struct sock *sk, int timeout) +{ + sk->inuse = 1; + sk->state = TCP_CLOSE; + dev_remove_pack ((struct packet_type *)sk->pair); + free_s ((void *)sk->pair, sizeof (struct packet_type)); + release_sock (sk); +} + +static int +packet_init (volatile struct sock *sk) +{ + struct packet_type *p; + p = malloc (sizeof (*p)); + if (p == NULL) return (-ENOMEM); + + p->func = packet_rcv; + p->type = sk->num; + p->data = (void *)sk; + dev_add_pack (p); + + /* we need to remember this somewhere. */ + sk->pair = (volatile struct sock *)p; + + return (0); +} + + +int +packet_recvfrom (volatile struct sock *sk, unsigned char *to, int len, + int noblock, + unsigned flags, struct sockaddr_in *sin, int *addr_len) +{ + /* this should be easy, if there is something there we + return it, otherwise we block. */ + int copied=0; + struct sk_buff *skb; + struct sockaddr *saddr; + saddr = (struct sockaddr *)sin; + + if (len == 0) return (0); + if (len < 0) return (-EINVAL); + if (addr_len) + { + verify_area (addr_len, sizeof(*addr_len)); + put_fs_long (sizeof (*saddr), addr_len); + } + + sk->inuse = 1; + while (sk->rqueue == NULL) + { + if (noblock) + { + release_sock (sk); + return (-EAGAIN); + } + release_sock (sk); + cli(); + if (sk->rqueue == NULL) + { + interruptible_sleep_on (sk->sleep); + if (current->signal & ~current->blocked) + { + return (-ERESTARTSYS); + } + } + sti(); + } + skb = sk->rqueue; + + if (!(flags & MSG_PEEK)) + { + if (skb->next == skb ) + { + sk->rqueue = NULL; + } + else + { + sk->rqueue = sk->rqueue ->next; + skb->prev->next = skb->next; + skb->next->prev = skb->prev; + } + } + copied = min (len, skb->len); + verify_area (to, copied); + memcpy_tofs (to, skb+1, copied); + /* copy the address. */ + if (saddr) + { + struct sockaddr addr; + addr.sa_family = skb->dev->type; + memcpy (addr.sa_data,skb->dev->name, 14); + verify_area (saddr, sizeof (*saddr)); + memcpy_tofs(saddr, &addr, sizeof (*saddr)); + } + + if (!(flags & MSG_PEEK)) + { + free_skb (skb, FREE_READ); + } + + release_sock (sk); + return (copied); + +} + +int +packet_read (volatile struct sock *sk, unsigned char *buff, + int len, int noblock, unsigned flags) +{ + return (packet_recvfrom (sk, buff, len, noblock, flags, NULL, NULL)); +} + + +int udp_connect (volatile struct sock *sk, struct sockaddr_in *usin, + int addr_len); + +int udp_select (volatile struct sock *sk, int sel_type, select_table *wait); + + +struct proto packet_prot = +{ + sock_wmalloc, + sock_rmalloc, + sock_wfree, + sock_rfree, + sock_rspace, + sock_wspace, + packet_close, + packet_read, + packet_write, + packet_sendto, + packet_recvfrom, + ip_build_header, + udp_connect, + NULL, + ip_queue_xmit, + ip_retransmit, + NULL, + NULL, + NULL, + udp_select, + NULL, + packet_init, + 128, + 0, + {NULL,} +}; diff --git a/net/tcp/protocols.c b/net/tcp/protocols.c new file mode 100644 index 0000000..d0942a7 --- /dev/null +++ b/net/tcp/protocols.c @@ -0,0 +1,69 @@ +/* protocols.c */ +/* these headers are overkill, but until I clean up the socket header + files, this is the best way. */ + +#include <asm/segment.h> +#include <asm/system.h> +#include <linux/types.h> +#include <linux/kernel.h> +#include <linux/sched.h> +#include <linux/string.h> +#include <linux/socket.h> +#include <netinet/in.h> +#include "timer.h" +#include "ip.h" +#include "tcp.h" +#include "sock.h" +#include "icmp.h" + +int udp_rcv(struct sk_buff *skb, struct device *dev, struct options *opt, + unsigned long daddr, unsigned short len, + unsigned long saddr, int redo, struct ip_protocol *protocol); + +void udp_err (int err, unsigned char *header, unsigned long daddr, + unsigned long saddr, struct ip_protocol *protocol); + + +int tcp_rcv(struct sk_buff *skb, struct device *dev, struct options *opt, + unsigned long daddr, unsigned short len, + unsigned long saddr, int redo, struct ip_protocol *protocol); + +void tcp_err (int err, unsigned char *header, unsigned long daddr, + unsigned long saddr, struct ip_protocol *protocol); + +int icmp_rcv(struct sk_buff *skb, struct device *dev, struct options *opt, + unsigned long daddr, unsigned short len, + unsigned long saddr, int redo, struct ip_protocol *protocol); + + +static struct ip_protocol tcp_protocol = +{ + tcp_rcv, + tcp_err, + NULL, + IP_TCP, + 0, /* copy */ + NULL +}; + +static struct ip_protocol udp_protocol = +{ + udp_rcv, + udp_err, + &tcp_protocol, + IP_UDP, + 0, /* copy */ + NULL +}; + +static struct ip_protocol icmp_protocol = +{ + icmp_rcv, + NULL, + &udp_protocol, + IP_ICMP, + 0, /* copy */ + NULL +}; + +struct ip_protocol *ip_protocol_base = &icmp_protocol; diff --git a/net/tcp/raw.c b/net/tcp/raw.c new file mode 100644 index 0000000..8cd116e --- /dev/null +++ b/net/tcp/raw.c @@ -0,0 +1,367 @@ +/* raw.c - implements raw ip sockets. */ +/* + Copyright (C) 1992 Ross Biro + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + The Author may be reached as bir7@leland.stanford.edu or + C/O Department of Mathematics; Stanford University; Stanford, CA 94305 +*/ + +#include <linux/types.h> +#include <linux/sched.h> +#include <linux/fcntl.h> +#include <linux/socket.h> +#include <netinet/in.h> +#include "timer.h" +#include "ip.h" +#include "tcp.h" +#include "sock.h" +#include <linux/errno.h> +#include <linux/timer.h> +#include <asm/system.h> +#include <asm/segment.h> +#include "../kern_sock.h" /* for PRINTK */ + +extern struct proto raw_prot; + +static unsigned long +min(unsigned long a, unsigned long b) +{ + if (a < b) return (a); + return (b); +} + +/* this should be the easiest of all, all we do is copy it into + a buffer. */ +int +raw_rcv (struct sk_buff *skb, struct device *dev, struct options *opt, + unsigned long daddr, unsigned short len, unsigned long saddr, + int redo, struct ip_protocol *protocol) +{ + + volatile struct sock *sk; + + sk = protocol->data; + + /* now we need to copy this into memory. */ + if (!redo ) + { + skb->dev = dev; + skb->saddr = daddr; + skb->daddr = saddr; + /* now see if we are in use. */ + cli(); + if (sk->inuse) + { + PRINTK ("raw_rcv adding to backlog. \n"); + if (sk->back_log == NULL) + { + sk->back_log = skb; + skb->next = skb; + skb->prev = skb; + } + else + { + skb->next = sk->back_log; + skb->prev = sk->back_log->prev; + skb->prev->next = skb; + skb->next->prev = skb; + } + sti(); + return (0); + } + sk->inuse = 1; + sti(); + } + + skb->sk = sk; + skb->len = len; + + /* charge it too the socket. */ + if (sk->rmem_alloc + skb->mem_len >= SK_RMEM_MAX) + { + skb->sk = NULL; + free_skb (skb, FREE_READ); + return (0); + } + + sk->rmem_alloc += skb->mem_len; + + /* now just put it onto the queue. */ + if (sk->rqueue == NULL) + { + sk->rqueue = skb; + skb->next = skb; + skb->prev = skb; + } + else + { + skb->next = sk->rqueue; + skb->prev = sk->rqueue->prev; + skb->prev->next = skb; + skb->next->prev = skb; + } + skb->len = len; + wake_up (sk->sleep); + release_sock (sk); + return (0); +} + +static int +raw_loopback (volatile struct sock *sk, int prot, char *from, int len, + unsigned long daddr) +{ + /* just pretend it just came in. */ + struct sk_buff *skb; + int err; + skb = malloc (len+sizeof (*skb)); + if (skb == NULL) return (-ENOMEM); + + skb->mem_addr = skb; + skb->mem_len = len + sizeof (*skb); + skb->h.raw = (unsigned char *)(skb+1); + verify_area (from, len); + memcpy_fromfs (skb+1, from, len); + err = raw_rcv (skb, NULL, NULL, daddr, len, sk->saddr, prot, 0); + return (err); +} + +/* this will do terrible things if len + ipheader + devheader > dev->mtu */ +static int +raw_sendto (volatile struct sock *sk, unsigned char *from, int len, + int noblock, + unsigned flags, struct sockaddr_in *usin, int addr_len) +{ + struct sk_buff *skb; + struct device *dev=NULL; + struct sockaddr_in sin; + int tmp; + + /* check the flags. */ + if (flags) return (-EINVAL); + if (len < 0) return (-EINVAL); + + /* get and verify the address. */ + if (usin) + { + if (addr_len < sizeof (sin)) + return (-EINVAL); + verify_area (usin, sizeof (sin)); + memcpy_fromfs (&sin, usin, sizeof(sin)); + if (sin.sin_family && + sin.sin_family != AF_INET) + return (-EINVAL); + } + else + { + if (sk->state != TCP_ESTABLISHED) + return (-EINVAL); + sin.sin_family = AF_INET; + sin.sin_port = sk->protocol; + sin.sin_addr.s_addr = sk->daddr; + } + if (sin.sin_port == 0) sin.sin_port = sk->protocol; + + if ((sin.sin_addr.s_addr & 0xff000000) == 0) + { + int err; + err = raw_loopback (sk, sin.sin_port, from, len, + sin.sin_addr.s_addr); + if (err < 0) return (err); + } + + sk->inuse = 1; + skb = sk->prot->wmalloc (sk, len+sizeof (*skb) + sk->prot->max_header, 0); + /* this shouldn't happen, but it could. */ + if (skb == NULL) + { + PRINTK ("raw_sendto: write buffer full?\n"); + print_sk (sk); + release_sock (sk); + return (-EAGAIN); + } + skb->mem_addr = skb; + skb->mem_len = len + sizeof (*skb) +sk->prot->max_header; + skb->sk = sk; + skb->free = 1; /* these two should be unecessary. */ + skb->arp = 0; + tmp = sk->prot->build_header (skb, sk->saddr, + sin.sin_addr.s_addr, &dev, + sk->protocol, sk->opt, skb->mem_len); + if (tmp < 0) + { + sk->prot->wfree (sk, skb->mem_addr, skb->mem_len); + release_sock (sk); + return (tmp); + } + verify_area (from, len); + memcpy_fromfs (skb+1, from, len); + skb->len = tmp + len; + sk->prot->queue_xmit (sk, dev, skb, 1); + return (len); +} + +static int +raw_write (volatile struct sock *sk, unsigned char *buff, int len, int noblock, + unsigned flags) +{ + return (raw_sendto (sk, buff, len, noblock, flags, NULL, 0)); +} + +static void +raw_close (volatile struct sock *sk, int timeout) +{ + sk->inuse = 1; + sk->state = TCP_CLOSE; + delete_ip_protocol ((struct ip_protocol *)sk->pair); + free_s ((void *)sk->pair, sizeof (struct ip_protocol)); + release_sock (sk); +} + +static int +raw_init (volatile struct sock *sk) +{ + struct ip_protocol *p; + p = malloc (sizeof (*p)); + if (p == NULL) return (-ENOMEM); + + p->handler = raw_rcv; + p->protocol = sk->protocol; + p->data = (void *)sk; + add_ip_protocol (p); + + /* we need to remember this somewhere. */ + sk->pair = (volatile struct sock *)p; + + return (0); +} + + +int +raw_recvfrom (volatile struct sock *sk, unsigned char *to, int len, + int noblock, + unsigned flags, struct sockaddr_in *sin, int *addr_len) +{ + /* this should be easy, if there is something there we + return it, otherwise we block. */ + int copied=0; + struct sk_buff *skb; + if (len == 0) return (0); + if (len < 0) return (-EINVAL); + if (addr_len) + { + verify_area (addr_len, sizeof(*addr_len)); + put_fs_long (sizeof (*sin), addr_len); + } + sk->inuse = 1; + while (sk->rqueue == NULL) + { + if (noblock) + { + release_sock (sk); + return (-EAGAIN); + } + release_sock (sk); + cli(); + if (sk->rqueue == NULL) + { + interruptible_sleep_on (sk->sleep); + if (current->signal & ~current->blocked) + { + return (-ERESTARTSYS); + } + } + sti(); + } + skb = sk->rqueue; + + if (!(flags & MSG_PEEK)) + { + if (skb->next == skb ) + { + sk->rqueue = NULL; + } + else + { + sk->rqueue = sk->rqueue ->next; + skb->prev->next = skb->next; + skb->next->prev = skb->prev; + } + } + copied = min (len, skb->len); + verify_area (to, copied); + memcpy_tofs (to, skb->h.raw, copied); + /* copy the address. */ + if (sin) + { + struct sockaddr_in addr; + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = skb->daddr; + verify_area (sin, sizeof (*sin)); + memcpy_tofs(sin, &addr, sizeof (*sin)); + } + + if (!(flags & MSG_PEEK)) + { + free_skb (skb, FREE_READ); + } + release_sock (sk); + return (copied); + +} + +int +raw_read (volatile struct sock *sk, unsigned char *buff, int len, int noblock, + unsigned flags) +{ + return (raw_recvfrom (sk, buff, len, noblock, flags, NULL, NULL)); +} + + +int udp_connect (volatile struct sock *sk, struct sockaddr_in *usin, + int addr_len); + +int udp_select (volatile struct sock *sk, int sel_type, select_table *wait); + + +struct proto raw_prot = +{ + sock_wmalloc, + sock_rmalloc, + sock_wfree, + sock_rfree, + sock_rspace, + sock_wspace, + raw_close, + raw_read, + raw_write, + raw_sendto, + raw_recvfrom, + ip_build_header, + udp_connect, + NULL, + ip_queue_xmit, + ip_retransmit, + NULL, + NULL, + raw_rcv, + udp_select, + NULL, + raw_init, + 128, + 0, + {NULL,} +}; diff --git a/net/tcp/sock.c b/net/tcp/sock.c new file mode 100644 index 0000000..09ee78f --- /dev/null +++ b/net/tcp/sock.c @@ -0,0 +1,1661 @@ +/* sock.c */ +/* + Copyright (C) 1992 Ross Biro + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + The Author may be reached as bir7@leland.stanford.edu or + C/O Department of Mathematics; Stanford University; Stanford, CA 94305 +*/ +#include <linux/errno.h> +#include <linux/types.h> +#include <linux/socket.h> +#include <netinet/in.h> +#include <linux/kernel.h> +#include <linux/sched.h> +#include <linux/timer.h> +#include <linux/sock_ioctl.h> +#include <asm/memory.h> +#include "../kern_sock.h" +#include "timer.h" +#include "ip.h" +#include "tcp.h" +#include "udp.h" +#include "sock.h" +#include <asm/segment.h> +#include <asm/system.h> +#include <linux/fcntl.h> + +#ifdef MEM_DEBUG +#define MPRINTK printk +#else +#define MPRINTK dummy_routine +#endif + +#define min(a,b) ((a)<(b)?(a):(b)) +#define swap(a,b) {unsigned long c; c=a; a=b; b=c;} + +extern struct proto tcp_prot; +extern struct proto udp_prot; +extern struct proto raw_prot; +extern struct proto packet_prot; + +static int ip_proto_init(void); +static int ip_proto_create(struct socket *sock, int protocol); +static int ip_proto_dup(struct socket *newsock, struct socket *oldsock); +static int ip_proto_release(struct socket *sock, struct socket *peer); +static int ip_proto_bind(struct socket *sock, struct sockaddr *umyaddr, + int sockaddr_len); +static int ip_proto_connect(struct socket *sock, struct sockaddr *uservaddr, + int sockaddr_len, int flags); +static int ip_proto_socketpair(struct socket *sock1, struct socket *sock2); +static int ip_proto_accept(struct socket *sock, struct socket *newsock, int flags); +static int ip_proto_getname(struct socket *sock, struct sockaddr *usockaddr, + int *usockaddr_len, int peer); +static int ip_proto_read(struct socket *sock, char *ubuf, int size, + int nonblock); +static int ip_proto_write(struct socket *sock, char *ubuf, int size, + int nonblock); +static int ip_proto_select(struct socket *sock, int which, select_table *wait); +static int ip_proto_ioctl(struct socket *sock, unsigned int cmd, + unsigned long arg); +static int ip_proto_listen(struct socket *sock, int backlog); + +static int ip_proto_send (struct socket *sock, void *buff, int len, + int nonblock, unsigned flags); +static int ip_proto_recv (struct socket *sock, void *buff, int len, + int nonblock, unsigned flags); +static int ip_proto_sendto (struct socket *sock, void *buff, int len, + int nonblock, unsigned flags, + struct sockaddr *addr, int addr_len); +static int ip_proto_recvfrom (struct socket *sock, void *buff, int len, + int nonblock, unsigned flags, + struct sockaddr *addr, int *addr_len); + +static int ip_proto_shutdown (struct socket *sock, int how); + + +static int ip_proto_setsockopt (struct socket *sock, int level, int optname, + char *optval, int optlen); +static int ip_proto_getsockopt (struct socket *sock, int level, int optname, + char *optval, int *optlen); +static int ip_proto_fcntl (struct socket *sock, unsigned int cmd, + unsigned long arg); + + +struct proto_ops inet_proto_ops = +{ + ip_proto_init, + ip_proto_create, + ip_proto_dup, + ip_proto_release, + ip_proto_bind, + ip_proto_connect, + ip_proto_socketpair, + ip_proto_accept, + ip_proto_getname, + ip_proto_read, + ip_proto_write, + ip_proto_select, + ip_proto_ioctl, + ip_proto_listen, + ip_proto_send, + ip_proto_recv, + ip_proto_sendto, + ip_proto_recvfrom, + ip_proto_shutdown, + ip_proto_setsockopt, + ip_proto_getsockopt, + ip_proto_fcntl +}; + +void +print_sk (volatile struct sock *sk) +{ + PRINTK (" wmem_alloc = %d\n", sk->wmem_alloc); + PRINTK (" rmem_alloc = %d\n", sk->rmem_alloc); + PRINTK (" send_head = %X\n", sk->send_head); + PRINTK (" state = %d\n",sk->state); + PRINTK (" wback = %X, rqueue = %X\n", sk->wback, sk->rqueue); + PRINTK (" wfront = %X\n", sk->wfront); + PRINTK (" daddr = %X, saddr = %X\n", sk->daddr,sk->saddr); + PRINTK (" num = %d", sk->num); + PRINTK (" next = %X\n", sk->next); + PRINTK (" send_seq = %d, acked_seq = %d, copied_seq = %d\n", + sk->send_seq, sk->acked_seq, sk->copied_seq); + PRINTK (" rcv_ack_seq = %d, window_seq = %d, fin_seq = %d\n", + sk->rcv_ack_seq, sk->window_seq, sk->fin_seq); + PRINTK (" prot = %X\n", sk->prot); + PRINTK (" pair = %X, back_log = %X\n", sk->pair,sk->back_log); + PRINTK (" inuse = %d , blog = %d\n", sk->inuse, sk->blog); + PRINTK (" dead = %d delay_acks=%d\n", sk->dead, sk->delay_acks); + PRINTK (" retransmits = %d, timeout = %d\n", sk->retransmits, sk->timeout); + PRINTK (" cong_window = %d, packets_out = %d\n", sk->cong_window, + sk->packets_out); +} + +void +print_skb(struct sk_buff *skb) +{ + PRINTK (" prev = %X, next = %X\n", skb->prev, skb->next); + PRINTK (" sk = %X link3 = %X\n", skb->sk, skb->link3); + PRINTK (" mem_addr = %X, mem_len = %d\n", skb->mem_addr, skb->mem_len); + PRINTK (" used = %d free = %d\n", skb->used,skb->free); +} + +/* just used to reference some pointers to keep gcc from over optimizing + my code so that it doesn't work. */ +void dummy_routine(void *dummy, ...) +{ + return; +} + +void +lock_skb (struct sk_buff *skb) +{ + if (skb->lock) + { + printk ("*** bug more than one lock on sk_buff. \n"); + } + skb->lock = 1; +} + + +void +free_skb (struct sk_buff *skb, int rw) +{ + if (skb->lock) + { + skb->free = 1; + return; + } + if (skb->sk) + { + if (rw) + { + skb->sk->prot->rfree (skb->sk, skb->mem_addr, skb->mem_len); + } + else + { + skb->sk->prot->wfree (skb->sk, skb->mem_addr, skb->mem_len); + } + } + else + { + free_s (skb->mem_addr, skb->mem_len); + } +} + +void +unlock_skb (struct sk_buff *skb, int rw) +{ + if (skb->lock != 1) + { + printk ("*** bug unlocking non-locked sk_buff. \n"); + } + skb->lock = 0; + if (skb->free) + free_skb (skb, rw); +} + +static int +sk_inuse( struct proto *prot, int num) +{ + volatile struct sock *sk; + for (sk = prot->sock_array[num & (SOCK_ARRAY_SIZE -1 )]; + sk != NULL; sk=sk->next) + { + if (sk->dummy_th.source == num) return (1); + } + return (0); +} + +unsigned short +get_new_socknum(struct proto *prot, unsigned short base) +{ + static int start=0; + /* used to cycle through the port numbers so the chances of + a confused connection drop. */ + + int i,j; + int best=0; + int size=32767; /* a big num. */ + volatile struct sock *sk; + start++; + if (base == 0) base = PROT_SOCK+1+(start % 1024); + if (base <= PROT_SOCK) + { + base += PROT_SOCK+(start % 1024); + } + + /* now look through the entire array and try to find an empty + ptr. */ + for (i = 0; i < SOCK_ARRAY_SIZE; i++) + { + j = 0; + sk = prot->sock_array[(i+base+1) & (SOCK_ARRAY_SIZE -1)]; + while (sk != NULL) + { + sk = sk->next; + j++; + } + if (j == 0) return (i+base+1); + if (j < size) + { + best = i; + size = j; + } + } + /* now make sure the one we want is not in use. */ + while (sk_inuse (prot, base +best+1)) + { + best += SOCK_ARRAY_SIZE; + } + return (best+base+1); + +} + +void +put_sock(unsigned short num, volatile struct sock *sk) +{ + volatile struct sock *sk1; + volatile struct sock *sk2; + int mask; + + PRINTK ("put_sock (num = %d, sk = %X\n", num, sk); + sk->num = num; + sk->next = NULL; + num = num & (SOCK_ARRAY_SIZE -1); + + /* we can't have an interupt renter here. */ + cli(); + if (sk->prot->sock_array[num] == NULL) + { + sk->prot->sock_array[num] = sk; + sti(); + return; + } + sti(); + for (mask = 0xff000000; mask != 0xffffffff; mask = (mask >> 8) | mask) + { + if (mask & sk->saddr) + { + mask = mask << 8; + break; + } + } + + PRINTK ("mask = %X\n", mask); + + cli(); + sk1 = sk->prot->sock_array[num]; + for (sk2 = sk1; sk2 != NULL; sk2=sk2->next) + { + if (!(sk2->saddr & mask)) + { + if (sk2 == sk1) + { + sk->next = sk->prot->sock_array[num]; + sk->prot->sock_array[num] = sk; + sti(); + return; + } + sk->next = sk2; + sk1->next= sk; + sti(); + return; + } + sk1 = sk2; + } + /* goes at the end. */ + sk->next = NULL; + sk1->next = sk; + sti(); +} + + +static void +remove_sock(volatile struct sock *sk1) +{ + volatile struct sock *sk2; + PRINTK ("remove_sock(sk1=%X)\n",sk1); + + /* we can't have this changing out from under us. */ + cli(); + sk2=sk1->prot->sock_array[sk1->num & (SOCK_ARRAY_SIZE -1)]; + if (sk2 == sk1) + { + sk1->prot->sock_array[sk1->num & (SOCK_ARRAY_SIZE -1)] = sk1->next; + sti(); + return; + } + while (sk2->next != sk1) + { + if (sk2 == NULL) + { + sti(); + PRINTK ("remove_sock: sock not found.\n"); + return; + } + sk2=sk2->next; + } + sk2->next = sk1->next; + sti(); +} + +void +destroy_sock(volatile struct sock *sk) +{ + + struct sk_buff *skb; + PRINTK ("destroying socket %X\n",sk); + /* just to be safe. */ + sk->inuse = 1; + + remove_sock (sk); + /* now we can no longer get new packets. */ + + delete_timer((struct timer *)&sk->time_wait); + + /* cleanup up the write buffer. */ + for (skb = sk->wfront; skb != NULL; ) + { + struct sk_buff *skb2; + skb2=skb->next; + free_skb(skb, FREE_WRITE); + skb=skb2; + } + + sk->wfront = NULL; + + if (sk->rqueue != NULL) + { + skb = sk->rqueue; + do { + struct sk_buff *skb2; + skb2=skb->next; + /* this will take care of closing sockets that were + listening and didn't accept everything. */ + + if (skb->sk != NULL && skb->sk != sk) + { + skb->sk->dead = 1; + skb->sk->prot->close (skb->sk, 0); + } + free_skb(skb, FREE_READ); + skb=skb2; + } while (skb != sk->rqueue); + } + + sk->rqueue = NULL; + + /* now we need to clean up the send head. */ + for (skb = sk->send_head; skb != NULL; ) + { + struct sk_buff *skb2; + /* we need to remove skb from the transmit queue. */ + cli(); + /* see if it's in a transmit queue. */ + if (skb->next != NULL) + { + if (skb->next != skb) + { + skb->next->prev = skb->prev; + skb->prev->next = skb->next; + } + else + { + int i; + for (i = 0; i < DEV_NUMBUFFS; i++) + { + if (skb->dev && skb->dev->buffs[i] == skb) + { + skb->dev->buffs[i]= NULL; + break; + } + } + } + } + sti(); + skb2=skb->link3; + free_skb(skb, FREE_WRITE); + skb=skb2; + } + + sk->send_head = NULL; + + /* and now the backlog. */ + + if (sk->back_log != NULL) + { + /* this should never happen. */ + printk ("cleaning back_log. \n"); + cli(); + skb = sk->back_log; + do { + struct sk_buff *skb2; + skb2=skb->next; + free_skb(skb, FREE_READ); + skb=skb2; + } while (skb != sk->back_log); + sti(); + } + + sk->back_log = NULL; + + /* now if everything is gone we can free the socket structure, + otherwise we need to keep it around until everything is gone. */ + if (sk->rmem_alloc == 0 && sk->wmem_alloc == 0) + { + free_s ((void *)sk,sizeof (*sk)); + } + else + { + /* this should never happen. */ + /* actually it can if an ack has just been sent. */ + PRINTK ("possible memory leak in socket = %X\n", sk); + print_sk (sk); + sk->destroy = 1; + sk->ack_backlog = 0; + sk->inuse = 0; + sk->time_wait.len = SOCK_DESTROY_TIME; + sk->timeout = TIME_DESTROY; + reset_timer ((struct timer *)&sk->time_wait); + } + +} + + +static int +ip_proto_fcntl (struct socket *sock, unsigned int cmd, unsigned long arg) +{ + volatile struct sock *sk; + sk=sock->data; + if (sk == NULL) + { + printk ("Warning: sock->data = NULL: %d\n" ,__LINE__); + return (0); + } + switch (cmd) + { + case F_SETOWN: + sk->proc = arg; + return (0); + + case F_GETOWN: + return (sk->proc); + + default: + return (-EINVAL); + } +} + +static int +ip_proto_setsockopt(struct socket *sock, int level, int optname, + char *optval, int optlen) +{ + volatile struct sock *sk; + int val; + /* This should really pass things on to the other levels. */ + if (level != SOL_SOCKET) return (-EOPNOTSUPP); + sk = sock->data; + if (sk == NULL) + { + printk ("Warning: sock->data = NULL: %d\n" ,__LINE__); + return (0); + } + verify_area (optval, sizeof (int)); + val = get_fs_long ((unsigned long *)optval); + switch (optname) + { + case SO_TYPE: + case SO_ERROR: + default: + return (-ENOPROTOOPT); + + case SO_DEBUG: /* not implemented. */ + case SO_DONTROUTE: + case SO_BROADCAST: + case SO_SNDBUF: + case SO_RCVBUF: + return (0); + + case SO_REUSEADDR: + if (val) + sk->reuse = 1; + else + sk->reuse = 1; + return (0); + + case SO_KEEPALIVE: + if (val) + sk->keepopen = 1; + else + sk->keepopen = 0; + return (0); + + case SO_OOBINLINE: + if (val) + sk->urginline = 1; + else + sk->urginline = 0; + return (0); + + case SO_NO_CHECK: + if (val) + sk->no_check = 1; + else + sk->no_check = 0; + return (0); + + case SO_PRIORITY: + if (val >= 0 && val < DEV_NUMBUFFS) + { + sk->priority = val; + } + else + { + return (-EINVAL); + } + return (0); + + } +} + +static int +ip_proto_getsockopt(struct socket *sock, int level, int optname, + char *optval, int *optlen) +{ + volatile struct sock *sk; + int val; + /* This should really pass things on to the other levels. */ + if (level != SOL_SOCKET) return (-EOPNOTSUPP); + sk = sock->data; + if (sk == NULL) + { + printk ("Warning: sock->data = NULL: %d\n" ,__LINE__); + return (0); + } + switch (optname) + { + default: + return (-ENOPROTOOPT); + + case SO_DEBUG: /* not implemented. */ + case SO_DONTROUTE: + case SO_BROADCAST: + case SO_SNDBUF: + case SO_RCVBUF: + val = 0; + break; + + case SO_REUSEADDR: + val = sk->reuse; + break; + + case SO_KEEPALIVE: + val = sk->keepopen; + break; + + case SO_TYPE: + if (sk->prot == &tcp_prot) + val = SOCK_STREAM; + else + val = SOCK_DGRAM; + break; + + case SO_ERROR: + val = sk->err; + sk->err = 0; + break; + + case SO_OOBINLINE: + val = sk->urginline; + break; + + case SO_NO_CHECK: + val = sk->no_check; + break; + + case SO_PRIORITY: + val = sk->priority; + break; + } + verify_area (optlen, sizeof (int)); + put_fs_long (sizeof(int),(unsigned long *) optlen); + + verify_area(optval, sizeof (int)); + put_fs_long (val, (unsigned long *)optval); + return (0); +} + +static int +ip_proto_listen(struct socket *sock, int backlog) +{ + volatile struct sock *sk; + sk = sock->data; + if (sk == NULL) + { + printk ("Warning: sock->data = NULL: %d\n" ,__LINE__); + return (0); + } + sk->state = TCP_LISTEN; + return (0); +} + +/* Hardware should be inited here. */ +static int ip_proto_init(void) +{ + int i; + struct device *dev; + struct ip_protocol *p; + seq_offset = CURRENT_TIME*250; + /* add all the protocols. */ + for (i = 0; i < SOCK_ARRAY_SIZE; i++) + { + tcp_prot.sock_array[i] = NULL; + udp_prot.sock_array[i] = NULL; + raw_prot.sock_array[i] = NULL; + } + + for (p = ip_protocol_base; p != NULL;) + { + struct ip_protocol *tmp; + /* add all the protocols. */ + tmp = p->next; + add_ip_protocol (p); + p = tmp; + } + + /* add the devices */ + for (dev = dev_base; dev != NULL; dev=dev->next) + { + if (dev->init) + dev->init(dev); + } + timer_table[NET_TIMER].fn = net_timer; + return (0); +} + +static int +ip_proto_create (struct socket *sock, int protocol) +{ + volatile struct sock *sk; + struct proto *prot; + int err; + + sk = malloc (sizeof (*sk)); + if (sk == NULL) + return (-ENOMEM); + sk->num = 0; + + + switch (sock->type) + { + case SOCK_STREAM: + case SOCK_SEQPACKET: + if (protocol && protocol != IP_TCP) + { + free_s ((void *)sk, sizeof (*sk)); + return (-EPROTONOSUPPORT); + } + sk->no_check = TCP_NO_CHECK; + prot = &tcp_prot; + break; + + case SOCK_DGRAM: + if (protocol && protocol != IP_UDP) + { + free_s ((void *)sk, sizeof (*sk)); + return (-EPROTONOSUPPORT); + } + sk->no_check = UDP_NO_CHECK; + prot=&udp_prot; + break; + + case SOCK_RAW: + if (!suser()) + { + free_s ((void *)sk, sizeof (*sk)); + return (-EPERM); + } + + if (!protocol) + { + free_s ((void *)sk, sizeof (*sk)); + return (-EPROTONOSUPPORT); + } + prot = &raw_prot; + sk->reuse = 1; + sk->no_check = 0; /* doesn't matter no checksum is preformed + anyway. */ + sk->num = protocol; + break; + + case SOCK_PACKET: + if (!suser()) + { + free_s ((void *)sk, sizeof (*sk)); + return (-EPERM); + } + + if (!protocol) + { + free_s ((void *)sk, sizeof (*sk)); + return (-EPROTONOSUPPORT); + } + prot = &packet_prot; + sk->reuse = 1; + sk->no_check = 0; /* doesn't matter no checksum is preformed + anyway. */ + sk->num = protocol; + break; + + + default: + free_s ((void *)sk, sizeof (*sk)); + return (-ESOCKTNOSUPPORT); + + } + sk->protocol = protocol; + sk->wmem_alloc = 0; + sk->rmem_alloc = 0; + sk->pair = NULL; + sk->opt = NULL; + sk->send_seq = 0; + sk->acked_seq = 0; + sk->copied_seq = 0; + sk->fin_seq = 0; + sk->proc = 0; + sk->rtt = TCP_WRITE_TIME; + sk->packets_out = 0; + sk->cong_window = 1; /* start with only sending one packet at a time. */ + sk->exp_growth = 1; /* if set cong_window grow exponentially every time + we get an ack. */ + sk->urginline = 0; + sk->intr = 0; + sk->linger = 0; + sk->destroy = 0; + sk->reuse = 0; + sk->priority = 1; + sk->shutdown = 0; + sk->urg = 0; + sk->keepopen = 0; + sk->done = 0; + sk->ack_backlog = 0; + sk->window = 0; + sk->bytes_rcv = 0; + sk->state = TCP_CLOSE; + sk->dead = 0; + sk->ack_timed = 0; + + /* this is how many unacked bytes we will accept for + this socket. */ + + sk->max_unacked = 2048; /* needs to be at most 2 full packets. */ + + /* how many packets we should send before forcing an ack. + if this is set to zero it is the same as sk->delay_acks = 0 */ + + sk->max_ack_backlog = MAX_ACK_BACKLOG; + sk->inuse = 0; + sk->delay_acks = 1; /* default to waiting a while before sending + acks. */ + sk->wback = NULL; + sk->wfront = NULL; + sk->rqueue = NULL; + sk->mtu = 576; + sk->prot = prot; + sk->sleep = sock->wait; + sk->daddr = 0; + sk->saddr = MY_IP_ADDR; + sk->err = 0; + sk->next = NULL; + sk->pair = NULL; + sk->send_tail = NULL; + sk->send_head = NULL; + sk->time_wait.len = TCP_CONNECT_TIME; + sk->time_wait.when = 0; + sk->time_wait.sk = sk; + sk->time_wait.next = NULL; + sk->timeout = 0; + sk->back_log = NULL; + sk->blog = 0; + sock->data =(void *) sk; + sk->dummy_th.doff = sizeof (sk->dummy_th)/4; + sk->dummy_th.res1=0; + sk->dummy_th.res2=0; + sk->dummy_th.urg_ptr = 0; + sk->dummy_th.fin = 0; + sk->dummy_th.syn = 0; + sk->dummy_th.rst = 0; + sk->dummy_th.psh = 0; + sk->dummy_th.ack = 0; + sk->dummy_th.urg = 0; + sk->dummy_th.dest = 0; + if (sk->num) + { + put_sock (sk->num, sk); + } + else + { + sk->num = get_new_socknum(sk->prot, 0); + } + /* make sure there was a free socket. */ + if (sk->num == 0) + { + destroy_sock(sk); + return (-EAGAIN); + } + put_sock(sk->num, sk); + sk->dummy_th.source = net16(sk->num); + if (sk->prot->init) + { + err = sk->prot->init(sk); + if (err != 0) + { + destroy_sock (sk); + return (err); + } + } + return (0); +} + +static int +ip_proto_dup (struct socket *newsock, struct socket *oldsock) +{ + return (ip_proto_create (newsock, + ((volatile struct sock *)(oldsock->data))->protocol)); +} + +/* the peer socket should always be NULL. */ +static int +ip_proto_release(struct socket *sock, struct socket *peer) +{ + volatile struct sock *sk; + sk = sock->data; + if (sk == NULL) return (0); + wake_up (sk->sleep); + /* start closing the connection. This may take a while. */ + /* if linger is set, we don't return until the close is + complete. Other wise we return immediately. The + actually closing is done the same either way. */ + if (sk->linger == 0) + { + sk->prot->close(sk,0); + sk->dead = 1; + } + else + { + sk->prot->close(sk, 0); + cli(); + while (sk->state != TCP_CLOSE) + { + interruptible_sleep_on (sk->sleep); + if (current->signal & ~current->blocked) + { + sti(); + return (-ERESTARTSYS); + } + } + sti(); + sk->dead = 1; + } + + sk->inuse = 1; + /* this will destroy it. */ + release_sock (sk); + sock->data = NULL; + return (0); +} + + +static int +ip_proto_bind (struct socket *sock, struct sockaddr *uaddr, + int addr_len) +{ + struct sockaddr_in addr; + volatile struct sock *sk, *sk2; + unsigned short snum; + sk = sock->data; + if (sk == NULL) + { + printk ("Warning: sock->data = NULL: %d\n" ,__LINE__); + return (0); + } + /* check this error. */ + if (sk->state != TCP_CLOSE) return (-EIO); + verify_area (uaddr, addr_len); + memcpy_fromfs (&addr, uaddr, min (sizeof (addr), addr_len)); + if (addr.sin_family && addr.sin_family != AF_INET) + return (-EIO); /* this needs to be changed. */ + snum = net16(addr.sin_port); + PRINTK ("bind sk =%X to port = %d\n", sk, snum); + print_sk (sk); + sk = sock->data; + + /* we can't just leave the socket bound wherever it is, it might be bound + to a priveledged port. However, since there seems to be a bug here, + we will leave it if the port is not priveledged(sp?) */ + + if (snum == 0) + { + if ( sk->num > PROT_SOCK) return (0); + snum = get_new_socknum (sk->prot, 0); + } + + if (snum <= PROT_SOCK && !suser()) + return (-EPERM); + + if (my_ip_addr(addr.sin_addr.s_addr) || addr.sin_addr.s_addr == 0) + sk->saddr = addr.sin_addr.s_addr; + PRINTK ("sock_array[%d] = %X:\n", snum & (SOCK_ARRAY_SIZE -1), + sk->prot->sock_array[snum & (SOCK_ARRAY_SIZE -1)]); + print_sk (sk->prot->sock_array[snum & (SOCK_ARRAY_SIZE -1)]); + + /* make sure we are allowed to bind here. */ + for (sk2 = sk->prot->sock_array[snum & (SOCK_ARRAY_SIZE -1)]; + sk2 != NULL; + sk2 = sk2->next) + { + if (sk2->num != snum) continue; + if (sk2->saddr != sk->saddr) continue; + if (!sk->reuse) return (-EADDRINUSE); + if (!sk2->reuse) return (-EADDRINUSE); + } + remove_sock (sk); + put_sock(snum, sk); + sk->dummy_th.source = net16(sk->num); + sk->daddr = 0; + sk->dummy_th.dest = 0; + return (0); +} + +static int +ip_proto_connect (struct socket *sock, struct sockaddr * uaddr, + int addr_len, int flags) +{ + volatile struct sock *sk; + int err; + sock->conn = NULL; + sk = sock->data; + if (sk == NULL) + { + printk ("Warning: sock->data = NULL: %d\n" ,__LINE__); + return (0); + } + if (sk->prot->connect == NULL) + return (-EOPNOTSUPP); + + if (sk->intr == 0) + { + err = sk->prot->connect (sk, (struct sockaddr_in *)uaddr, addr_len); + if (err < 0) return (err); + } + + sock->state = SS_CONNECTED; + + if (flags & O_NONBLOCK) return (0); + + cli(); /* avoid the race condition */ + + while (sk->state != TCP_ESTABLISHED && sk->state < TCP_CLOSING) + { + interruptible_sleep_on (sk->sleep); + if (current->signal & ~current->blocked) + { + sti(); + sk->intr = 1; + return (-ERESTARTSYS); + } + } + sti(); + sk->intr = 0; + if (sk->state != TCP_ESTABLISHED && sk->err) + { + return (-sk->err); + } + return (0); +} + +static int +ip_proto_socketpair (struct socket *sock1, struct socket *sock2) +{ + return (-EOPNOTSUPP); +} + +static int +ip_proto_accept (struct socket *sock, struct socket *newsock, int flags) +{ + volatile struct sock *sk1, *sk2; + sk1= sock->data; + if (sk1 == NULL) + { + printk ("Warning: sock->data = NULL: %d\n" ,__LINE__); + return (0); + } + newsock->data = NULL; + if (sk1->prot->accept == NULL) return (-EOPNOTSUPP); + /* restore the state if we have been interrupted, and + then returned. */ + if (sk1->pair != NULL ) + { + sk2 = sk1->pair; + sk1->pair = NULL; + } + else + { + sk2 = sk1->prot->accept (sk1,flags); + if (sk2 == NULL) + return (-sk1->err); + } + newsock->data = (void *)sk2; + sk2->sleep = (void *)newsock->wait; + newsock->conn = NULL; + if (flags & O_NONBLOCK) + return (0); + + cli(); /* avoid the race. */ + while (sk2->state == TCP_SYN_RECV) + { + interruptible_sleep_on (sk2->sleep); + if (current->signal & ~current->blocked) + { + sti(); + sk1->pair = sk2; + sk2->sleep = NULL; + newsock->data = NULL; + return (-ERESTARTSYS); + } + } + sti(); + + if (sk2->state != TCP_ESTABLISHED && sk2->err) + { + int err; + err = -sk2->err; + destroy_sock (sk2); + newsock->data = NULL; + return (err); + } + newsock->state = SS_CONNECTED; + return (0); +} + +static int +ip_proto_getname(struct socket *sock, struct sockaddr *uaddr, + int *uaddr_len, int peer) +{ + struct sockaddr_in sin; + volatile struct sock *sk; + int len; + verify_area(uaddr_len, sizeof (len)); + len = get_fs_long(uaddr_len); + /* check this error. */ + if (len < sizeof (sin)) return (-EINVAL); + verify_area (uaddr, len); + sin.sin_family=AF_INET; + sk = sock->data; + if (sk == NULL) + { + printk ("Warning: sock->data = NULL: %d\n" ,__LINE__); + return (0); + } + if (peer) + { + if (sk->state != TCP_ESTABLISHED) + return (-ENOTCONN); + sin.sin_port = sk->dummy_th.dest; + sin.sin_addr.s_addr = sk->daddr; + } + else + { + sin.sin_port = sk->dummy_th.source; + sin.sin_addr.s_addr = sk->saddr; + } + len = sizeof (sin); + memcpy_tofs(uaddr, &sin, sizeof (sin)); + put_fs_long (len, uaddr_len); + return (0); +} + +static int +ip_proto_read (struct socket *sock, char *ubuf, int size, int noblock) +{ + volatile struct sock *sk; + sk = sock->data; + if (sk == NULL) + { + printk ("Warning: sock->data = NULL: %d\n" ,__LINE__); + return (0); + } + if (sk->shutdown & RCV_SHUTDOWN) + return (-EIO); + return (sk->prot->read (sk, ubuf, size, noblock,0)); +} + +static int +ip_proto_recv (struct socket *sock, void *ubuf, int size, int noblock, + unsigned flags) +{ + volatile struct sock *sk; + sk = sock->data; + if (sk == NULL) + { + printk ("Warning: sock->data = NULL: %d\n" ,__LINE__); + return (0); + } + if (sk->shutdown & RCV_SHUTDOWN) + return (-EIO); + return (sk->prot->read (sk, ubuf, size, noblock, flags)); +} + +static int +ip_proto_write (struct socket *sock, char *ubuf, int size, int noblock) +{ + volatile struct sock *sk; + sk = sock->data; + if (sk == NULL) + { + printk ("Warning: sock->data = NULL: %d\n" ,__LINE__); + return (0); + } + if (sk->shutdown & SEND_SHUTDOWN) + return (-EIO); + return (sk->prot->write (sk, ubuf, size, noblock, 0)); +} + + +static int +ip_proto_send (struct socket *sock, void *ubuf, int size, int noblock, + unsigned flags) +{ + volatile struct sock *sk; + sk = sock->data; + if (sk == NULL) + { + printk ("Warning: sock->data = NULL: %d\n" ,__LINE__); + return (0); + } + if (sk->shutdown & SEND_SHUTDOWN) + return (-EIO); + return (sk->prot->write (sk, ubuf, size, noblock, flags)); +} + + +static int +ip_proto_sendto (struct socket *sock, void *ubuf, int size, int noblock, + unsigned flags, struct sockaddr *sin, int addr_len ) +{ + volatile struct sock *sk; + sk = sock->data; + if (sk == NULL) + { + printk ("Warning: sock->data = NULL: %d\n" ,__LINE__); + return (0); + } + if (sk->shutdown & SEND_SHUTDOWN) + return (-EIO); + if (sk->prot->sendto == NULL) return (-EOPNOTSUPP); + return (sk->prot->sendto (sk, ubuf, size, noblock, flags, + (struct sockaddr_in *)sin, addr_len)); +} + +static int +ip_proto_recvfrom (struct socket *sock, void *ubuf, int size, int noblock, + unsigned flags, struct sockaddr *sin, int *addr_len ) +{ + volatile struct sock *sk; + sk = sock->data; + if (sk == NULL) + { + printk ("Warning: sock->data = NULL: %d\n" ,__LINE__); + return (0); + } + if (sk->shutdown & RCV_SHUTDOWN) + return (-EIO); + if (sk->prot->recvfrom == NULL) return (-EOPNOTSUPP); + return (sk->prot->recvfrom (sk, ubuf, size, noblock, flags, + (struct sockaddr_in*)sin, addr_len)); +} + +static int +ip_proto_shutdown (struct socket *sock, int how) +{ + volatile struct sock *sk; + /* this should really check to make sure the socket is + a tcp socket. */ + how++; /* maps 0->1 has the advantage of making bit 1 rcvs and + 1->2 bit 2 snds. + 2->3 */ + if (how & ~SHUTDOWN_MASK) return (-EINVAL); + sk = sock->data; + if (sk == NULL) + { + printk ("Warning: sock->data = NULL: %d\n" ,__LINE__); + return (0); + } + if (sk->state != TCP_ESTABLISHED) return (-ENOTCONN); + sk->shutdown |= how; + return (0); +} + +static int +ip_proto_select (struct socket *sock, int sel_type, select_table *wait ) +{ + volatile struct sock *sk; + sk = sock->data; + if (sk == NULL) + { + printk ("Warning: sock->data = NULL: %d\n" ,__LINE__); + return (0); + } + + if (sk->prot->select == NULL) + { + PRINTK ("select on non-selectable socket. \n"); + return (0); + } + return (sk->prot->select(sk, sel_type, wait)); +} + +/* these should be distributed to the different protocol routines. */ +static int +ip_proto_ioctl (struct socket *sock, unsigned int cmd, + unsigned long arg) +{ + volatile struct sock *sk; + sk = sock->data; + if (sk == NULL) + { + printk ("Warning: sock->data = NULL: %d\n" ,__LINE__); + return (0); + } + + PRINTK ("in ip_proto_ioctl\n"); + switch (cmd) + { + + case IP_SET_DEV: + if (!suser()) + return (-EPERM); + return (ip_set_dev((struct ip_config *)arg)); +#if 0 + case IP_ADD_ROUTE: + ip_add_route ((struct rtable *) arg); + return (0); +#endif + default: + if (!sk->prot->ioctl) + return (-EINVAL); + return (sk->prot->ioctl (sk, cmd, arg)); + } +} + +#ifdef MEM_DEBUG + +struct mem +{ + unsigned long check; + struct mem *other; + unsigned long len; + unsigned short buff[10]; +}; + +static void +print_mem (struct mem *m) +{ + int i; + MPRINTK("mem:\n"); + MPRINTK(" check=%X, other = %X\n", m->check, m->other); + MPRINTK(" len=%d buff:\n " , m->len); + for (i = 0; i < 10; i++) + { + MPRINTK ("0x%02X ",m->buff[i]); + } + MPRINTK ("\n"); +} + +static void * +smalloc (unsigned long size) +{ + struct mem *head, *tail; + static unsigned short count; + int i; + int sum; + unsigned char *ptr; + + MPRINTK ("smalloc (size = %d)\n",size); + head = malloc (size + 2*sizeof (*head)); + if (head == NULL) return (NULL); + tail = (struct mem *)((unsigned char *)(head+1) + size); + + head->other = tail; + tail->other = head; + + tail->len = size; + head->len = size; + for (i = 0; i < 10; i++) + { + tail->buff[i]=count++; + head->buff[i]=count; + } + + ptr = (unsigned char *)head; + head->check = 0; + sum = 0; + + for (i = 0; i < sizeof (*head); i ++) + { + sum+= ptr[i]; + } + + head->check = ~sum; + ptr = (unsigned char *)tail; + tail->check = 0; + sum = 0; + + for (i = 0; i < sizeof (*head); i ++) + { + sum+= ptr[i]; + } + + tail->check = ~sum; + MPRINTK ("head = %X:\n", head); + print_mem(head); + MPRINTK ("tail = %X:\n", tail); + print_mem(tail); + return (head+1); +} + +void +sfree (void *data, unsigned long len) +{ + int i; + int sum; + int csum; + unsigned char *ptr; + int bad = 0; + struct mem *head, *tail; + MPRINTK ("sfree(data=%X, len = %d)\n", data, len); + head = data; + head--; + tail = (struct mem *)((unsigned char *)(head+1) + len); + print_mem (head); + print_mem (tail); + if (head->other != tail) + { + MPRINTK ("sfree: head->other != tail:\n"); + bad = 1; + } + if (tail->other != head) + { + MPRINTK ("sfree: tail->other != head:\n"); + bad =1 ; + } + if (head ->len != len) + { + MPRINTK ("sfree: head->len != len"); + bad = 1; + } + if (tail ->len != len) + { + MPRINTK ("sfree: tail->len != len"); + bad = 1; + } + csum = head->check; + ptr = (unsigned char *)head; + head->check = 0; + sum = 0; + for (i = 0; i < sizeof (*head); i ++) + { + sum+= ptr[i]; + } + if (csum != ~sum) + { + MPRINTK ("sfree: head failed checksum\n"); + bad = 1; + } + csum = tail->check; + ptr = (unsigned char *)tail; + tail->check = 0; + sum = 0; + for (i = 0; i < sizeof (*head); i ++) + { + sum+= ptr[i]; + } + if (csum != ~sum) + { + MPRINTK ("sfree: tail failed checksum\n"); + bad = 1; + } + if (!bad) + free_s (head, len+2*sizeof (*head)); + else + schedule(); +} +#else +static void * +smalloc (unsigned long size) +{ + return (malloc (size)); +} +static void +sfree(void *data, unsigned long len) +{ + free_s(data,len); +} +#endif + +void * +sock_wmalloc(volatile struct sock *sk, unsigned long size, int force) +{ + void *tmp; + if (sk) + { + if (sk->wmem_alloc + size >= SK_WMEM_MAX && !force) + { + MPRINTK ("sock_wmalloc(%X,%d,%d) returning NULL\n", + sk, size, force); + return (NULL); + } + cli(); + sk->wmem_alloc+= size; + sti(); + } + if (sk) + tmp = smalloc (size); + else + tmp = malloc (size); + + MPRINTK ("sock_wmalloc(%X,%d,%d) returning %X\n",sk, size, force, tmp); + return (tmp); +} + +void * +sock_rmalloc(volatile struct sock *sk, unsigned long size, int force) +{ + struct mem *tmp; + if (sk ) + { + if (sk->rmem_alloc + size >= SK_RMEM_MAX && !force) + { + MPRINTK ("sock_rmalloc(%X,%d,%d) returning NULL\n",sk,size,force); + return (NULL); + } + cli(); + sk->rmem_alloc+= size; + sti(); + } + if (sk) + tmp = smalloc (size); + else + tmp = malloc (size); + + MPRINTK ("sock_rmalloc(%X,%d,%d) returning %X\n",sk, size, force, tmp); + return (tmp); +} + + +unsigned long +sock_rspace (volatile struct sock *sk) +{ + int amt; + if (sk != NULL) + { + if (sk->rmem_alloc >= SK_RMEM_MAX-2*MIN_WINDOW) return (0); + amt = min ((SK_RMEM_MAX-sk->rmem_alloc)/2-MIN_WINDOW, MAX_WINDOW); + if (amt < 0) return (0); + return (amt); + } + return (0); +} + +unsigned long +sock_wspace (volatile struct sock *sk) +{ + if (sk != NULL) + { + if (sk->shutdown & SEND_SHUTDOWN) return (0); + if (sk->wmem_alloc >= SK_WMEM_MAX) return (0); + return (SK_WMEM_MAX-sk->wmem_alloc ); + } + return (0); +} + + +void +sock_wfree (volatile struct sock *sk, void *mem, unsigned long size) +{ + MPRINTK ("sock_wfree (sk=%X, mem=%X, size=%d)\n",sk, mem, size); + if (sk) + { + sk->wmem_alloc -= size; + sfree(mem,size); + /* in case it might be waiting for more memory. */ + if (!sk->dead && sk->wmem_alloc > SK_WMEM_MAX/2) wake_up(sk->sleep); + if (sk->destroy && sk->wmem_alloc == 0 && sk->rmem_alloc == 0) + { + MPRINTK ("recovered lost memory, destroying sock = %X\n",sk); + delete_timer ((struct timer *)&sk->time_wait); + free_s ((void *)sk, sizeof (*sk)); + } + } + else + { + free_s (mem, size); + } +} + +void +sock_rfree (volatile struct sock *sk, void *mem, unsigned long size) +{ + MPRINTK ("sock_rfree (sk=%X, mem=%X, size=%d)\n",sk, mem, size); + if (sk) + { + sk->rmem_alloc -= size; + sfree(mem,size); + if (sk->destroy && sk->wmem_alloc == 0 && sk->rmem_alloc == 0) + { + delete_timer ((struct timer *)&sk->time_wait); + free_s ((void *)sk, sizeof (*sk)); + } + } + else + { + free_s (mem, size); + } +} + + +/* This routine must find a socket given a tcp header. Everyhting + is assumed to be in net order. */ + +volatile struct sock *get_sock (struct proto *prot, unsigned short num, + unsigned long raddr, + unsigned short rnum, unsigned long laddr) +{ + volatile struct sock *s; + PRINTK ("get_sock (prot=%X, num=%d, raddr=%X, rnum=%d, laddr=%X)\n", + prot, num, raddr, rnum, laddr); + + /* SOCK_ARRAY_SIZE must be a power of two. This will work better + than a prime unless 3 or more sockets end up using the same + array entry. This should not be a problem because most + well known sockets don't overlap that much, and for + the other ones, we can just be careful about picking our + socket number when we choose an arbitrary one. */ + + for (s=prot->sock_array[num&(SOCK_ARRAY_SIZE-1)]; s != NULL; s=s->next) + { + if (s->num == num) + { + /* we need to see if this is the socket that we want. */ + if (!ip_addr_match (s->daddr, raddr)) + continue; + if (s->dummy_th.dest != rnum && s->dummy_th.dest != 0) + continue; + if (!ip_addr_match (s->saddr, laddr)) + continue; + return (s); + } + } + return (NULL); +} + +void release_sock (volatile struct sock *sk) +{ + if (sk->blog) return; + /* see if we have any packets built up. */ + + cli(); + sk->inuse = 1; + while (sk->back_log != NULL) + { + struct sk_buff *skb; + sk->blog = 1; + skb = sk->back_log; + PRINTK ("release_sock: skb = %X:\n",skb); + print_skb(skb); + if (skb->next != skb) + { + sk->back_log = skb->next; + skb->prev->next = skb->next; + skb->next->prev = skb->prev; + } + else + { + sk->back_log = NULL; + } + sti(); + PRINTK ("sk->back_log = %X\n",sk->back_log); + if (sk->prot->rcv) + sk->prot->rcv(skb, skb->dev, sk->opt, + skb->saddr, skb->len, skb->daddr, 1, + /* only used for/by raw sockets. */ + (struct ip_protocol *)sk->pair); + cli(); + } + sk->blog = 0; + sk->inuse = 0; + sti(); + if (sk->dead && sk->state == TCP_CLOSE) + { + /* should be about 2 rtt's */ + sk->time_wait.len = min (sk->rtt * 2, TCP_DONE_TIME); + sk->timeout = TIME_DONE; + reset_timer ((struct timer *)&sk->time_wait); + } +} diff --git a/net/tcp/sock.h b/net/tcp/sock.h new file mode 100644 index 0000000..1642509 --- /dev/null +++ b/net/tcp/sock.h @@ -0,0 +1,182 @@ +/* sock.h */ +/* + Copyright (C) 1992 Ross Biro + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + The Author may be reached as bir7@leland.stanford.edu or + C/O Department of Mathematics; Stanford University; Stanford, CA 94305 +*/ +#ifndef _TCP_SOCK_H +#define _TCP_SOCK_H + +#define SOCK_ARRAY_SIZE 64 + +/* This structure really needs to be cleaned up. Most of it is + for tcp, and not used by any of the other protocols. */ + +struct sock +{ + struct options *opt; + unsigned long wmem_alloc; + unsigned long rmem_alloc; + unsigned long send_seq; + unsigned long acked_seq; + unsigned long copied_seq; + unsigned long rcv_ack_seq; + unsigned long window_seq; + unsigned long fin_seq; + unsigned long inuse:1, dead:1, urginline:1, + intr:1, blog:1, done:1, reuse:1, keepopen:1, linger:1, + delay_acks:1, timeout:3, destroy:1, ack_timed:1, no_check:1, + exp_growth:1; + int proc; + volatile struct sock *next; + volatile struct sock *pair; + struct sk_buff *send_tail; + struct sk_buff *send_head; + struct sk_buff *back_log; + long retransmits; + struct sk_buff *wback, *wfront, *rqueue; + struct proto *prot; + struct wait_queue **sleep; + unsigned long daddr; + unsigned long saddr; + unsigned short max_unacked; + unsigned short window; + unsigned short bytes_rcv; + unsigned short mtu; + unsigned short num; + unsigned short cong_window; + unsigned short packets_out; + unsigned short urg; + unsigned short shutdown; + short rtt; + unsigned char protocol; + unsigned char state; + unsigned char ack_backlog; + unsigned char err; + unsigned char max_ack_backlog; + unsigned char priority; + struct tcp_header dummy_th; /* I may be able to get rid of this. */ + struct timer time_wait; +}; + +struct proto +{ + void *(*wmalloc)(volatile struct sock *sk, unsigned long size, int force); + void *(*rmalloc)(volatile struct sock *sk, unsigned long size, int force); + void (*wfree)(volatile struct sock *sk, void *mem, unsigned long size); + void (*rfree)(volatile struct sock *sk, void *mem, unsigned long size); + unsigned long (*rspace)(volatile struct sock *sk); + unsigned long (*wspace)(volatile struct sock *sk); + void (*close)(volatile struct sock *sk, int timeout); + int (*read)(volatile struct sock *sk, unsigned char *to, int len, + int nonblock, unsigned flags); + int (*write)(volatile struct sock *sk, unsigned char *to, int len, + int nonblock, unsigned flags); + int (*sendto) (volatile struct sock *sk, unsigned char *from, int len, + int noblock, unsigned flags, struct sockaddr_in *usin, + int addr_len); + int (*recvfrom) (volatile struct sock *sk, unsigned char *from, int len, + int noblock, unsigned flags, struct sockaddr_in *usin, + int *addr_len); + int (*build_header) (struct sk_buff *skb, unsigned long saddr, + unsigned long daddr, struct device **dev, int type, + struct options *opt, int len); + int (*connect) (volatile struct sock *sk, struct sockaddr_in *usin, + int addr_len); + volatile struct sock *(*accept) (volatile struct sock *sk, int flags); + void (*queue_xmit) (volatile struct sock *sk, struct device *dev, + struct sk_buff *skb, int free); + void (*retransmit) (volatile struct sock *sk, int all); + void (*write_wakeup) (volatile struct sock *sk); + void (*read_wakeup) (volatile struct sock *sk); + int (*rcv)(struct sk_buff *buff, struct device *dev, struct options *opt, + unsigned long daddr, unsigned short len, + unsigned long saddr, int redo, struct ip_protocol *protocol); + int (*select)(volatile struct sock *sk, int which, select_table *wait); + int (*ioctl) (volatile struct sock *sk, int cmd, unsigned long arg); + int (*init) (volatile struct sock *sk); + unsigned short max_header; + unsigned long retransmits; + volatile struct sock *sock_array[SOCK_ARRAY_SIZE]; +}; + +#define TIME_WRITE 1 +#define TIME_CLOSE 2 +#define TIME_KEEPOPEN 3 +#define TIME_DESTROY 4 +#define TIME_DONE 5 /* used to absorb those last few packets. */ +#define SOCK_DESTROY_TIME 1000 /* about 10 seconds. */ + +/* used with free skb */ +#define FREE_READ 1 +#define FREE_WRITE 0 + +struct sk_buff +{ + struct sk_buff *next; + struct sk_buff *prev; + struct sk_buff *link3; + volatile struct sock *sk; + unsigned long when; /* used to compute rtt's. */ + struct device *dev; + void *mem_addr; + union + { + struct tcp_header *th; + struct enet_header *eth; + struct ip_header *iph; + struct udp_header *uh; + struct arp *arp; + unsigned char *raw; + unsigned long seq; + } h; + unsigned long mem_len; + unsigned long len; + unsigned long saddr; + unsigned long daddr; + unsigned long acked:1,used:1,free:1,arp:1, urg_used:1, lock:1; +}; + +#define PROT_SOCK 1024 +#define SK_WMEM_MAX 8192 +#define SK_RMEM_MAX 32767 +#define SHUTDOWN_MASK 3 +#define RCV_SHUTDOWN 1 +#define SEND_SHUTDOWN 2 + +void destroy_sock (volatile struct sock *sk); +unsigned short get_new_socknum (struct proto *, unsigned short); +void put_sock (unsigned short, volatile struct sock *); +void release_sock (volatile struct sock *sk); +volatile struct sock *get_sock(struct proto *, unsigned short, unsigned long, + unsigned short, unsigned long); +void print_sk (volatile struct sock *); +void print_skb (struct sk_buff *); +void *sock_wmalloc(volatile struct sock *sk, unsigned long size, int force); +void *sock_rmalloc(volatile struct sock *sk, unsigned long size, int force); +void sock_wfree(volatile struct sock *sk, void *mem, unsigned long size); +void sock_rfree(volatile struct sock *sk, void *mem, unsigned long size); +unsigned long sock_rspace(volatile struct sock *sk); +unsigned long sock_wspace(volatile struct sock *sk); +void free_skb (struct sk_buff *skb, int rw); +void lock_skb (struct sk_buff *skb); +void unlock_skb (struct sk_buff *skb, int rw); + +void dummy_routine(void *, ... ); + +#endif diff --git a/net/tcp/tcp.c b/net/tcp/tcp.c new file mode 100644 index 0000000..db36788 --- /dev/null +++ b/net/tcp/tcp.c @@ -0,0 +1,2524 @@ + /* tcp.c */ + /* + Copyright (C) 1992 Ross Biro + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + The Author may be reached as bir7@leland.stanford.edu or + C/O Department of Mathematics; Stanford University; Stanford, CA 94305 + */ + +#include <linux/types.h> +#include <linux/sched.h> +#include <linux/mm.h> +#include <asm/memory.h> +#include <linux/socket.h> +#include <netinet/in.h> +#include <linux/fcntl.h> +#include "timer.h" +#include "ip.h" +#include "icmp.h" +#include "tcp.h" +#include "sock.h" +#include <linux/errno.h> +#include <linux/timer.h> +#include <asm/system.h> +#include <asm/segment.h> +/* #include <signal.h>*/ +#include "../kern_sock.h" /* for PRINTK */ + +#define tmax(a,b) (before ((a),(b)) ? (b) : (a)) +#define swap(a,b) {unsigned long c; c=a; a=b; b=c;} + +extern struct proto tcp_prot; + +static int +min (unsigned int a, unsigned int b) +{ + if (a < b) return (a); + return (b); +} + +void +print_th (struct tcp_header *th) +{ + unsigned char *ptr; + ptr = (unsigned char *)(th + 1); + PRINTK ("tcp header:\n"); + PRINTK (" source=%d, dest=%d, seq =%d, ack_seq = %d\n", + net16(th->source), net16(th->dest), net32(th->seq), + net32(th->ack_seq)); + PRINTK (" fin=%d, syn=%d, rst=%d, psh=%d, ack=%d, urg=%d res1=%d res2=%d\n" + ,th->fin, th->syn, th->rst, th->psh, th->ack, th->urg, + th->res1, th->res2); + PRINTK (" window = %d, check = %d urg_ptr = %d\n", + net16(th->window), net16(th->check), net16(th->urg_ptr)); + PRINTK (" doff = %d\n",th->doff); + PRINTK ("options = %d %d %d %d\n", ptr[0], ptr[1], ptr[2], ptr[3]); + } + + /* This routine grabs the first thing off of a rcv queue. */ +static struct sk_buff * +get_firstr(volatile struct sock *sk) +{ + struct sk_buff *skb; + skb = sk->rqueue; + if (skb == NULL) return (NULL); + sk->rqueue = skb->next; + if (sk->rqueue == skb) + { + sk->rqueue = NULL; + } + else + { + sk->rqueue->prev=skb->prev; + sk->rqueue->prev->next = sk->rqueue; + } + return (skb); +} + +static long +diff (unsigned long seq1, unsigned long seq2) +{ + long d; + d=seq1-seq2; + if (d > 0) return (d); + /* I hope this returns what I want. */ + return (~d+1); +} + + /* enter the time wait state. */ +static void +tcp_time_wait (volatile struct sock *sk) +{ + sk->state = TCP_TIME_WAIT; + sk->time_wait.len = TCP_TIMEWAIT_LEN; + sk->timeout = TIME_CLOSE; + reset_timer ((struct timer *)&sk->time_wait); +} + +static void +tcp_retransmit (volatile struct sock *sk, int all) +{ + if (all) + { + ip_retransmit (sk, all); + return; + } + sk->rtt *= 2; /* exponential back off. */ + if (sk->cong_window > 1) + sk->cong_window = sk->cong_window / 2; + sk->exp_growth = 0; + + /* do the actuall retransmit. */ + ip_retransmit (sk, all); + +} + +/* this routine is called by the icmp module when it gets some + sort of error condition. If err < 0 then the socket should + be closed and the error returned to the user. If err > 0 + it's just the icmp type << 8 | icmp code. + header points to the first 8 bytes of the tcp header. We need + to find the appropriate port. */ + +void +tcp_err (int err, unsigned char *header, unsigned long daddr, + unsigned long saddr, struct ip_protocol *protocol) +{ + struct tcp_header *th; + volatile struct sock *sk; + + th = (struct tcp_header *)header; + sk = get_sock (&tcp_prot, net16(th->dest), saddr, th->source, daddr); + + if (sk == NULL) return; + + if (err & 0xff00 == (ICMP_SOURCE_QUENCH << 8)) + { + /* for now we will just trigger a linear backoff. The slow start + code should cause a real backoff here. */ + + if (sk->cong_window > 1) + sk->cong_window --; + + return; + } + + sk->err = icmp_err_convert[err & 0xff].errno; + if (icmp_err_convert[err & 0xff].fatal) + { + if (sk->state != TCP_ESTABLISHED) + sk->state = TCP_CLOSE; + sk->prot->close(sk, 0); + } + + return; + +} + +static int +tcp_select (volatile struct sock *sk, int sel_type, select_table *wait) +{ + switch (sel_type) + { + case SEL_IN: + select_wait (sk->sleep, wait); + if (sk->rqueue != NULL && + (between (sk->copied_seq, sk->rqueue->next->h.th->seq - 1, + sk->rqueue->next->h.th->seq + sk->rqueue->next->len) || + sk->state == TCP_LISTEN)) + { + return (1); + } + + switch (sk->state) + { + case TCP_LISTEN: + case TCP_ESTABLISHED: + case TCP_SYN_SENT: + case TCP_SYN_RECV: + return (0); + default: + return (1); + } + + case SEL_OUT: + select_wait (sk->sleep, wait); + if (sk->state != TCP_ESTABLISHED) return (1); + /* hack so it will probably be able to write something + if it says it's ok to write. */ + if (sk->prot->wspace(sk) >= MIN_WRITE_SPACE) return (1); + return (0); + + case SEL_EX: + select_wait(sk->sleep,wait); + if (sk->err) return (1); + if (sk->state == TCP_FIN_WAIT1 || + sk->state == TCP_FIN_WAIT2 || + sk->state == TCP_TIME_WAIT || + sk->state == TCP_LAST_ACK) + return (1); + return (0); + } + return (0); +} + +static int +tcp_ioctl (volatile struct sock *sk, int cmd, unsigned long arg) +{ + switch (cmd) + { + default: + return (-EINVAL); +#if 0 + case SIOCATMARK: + /* try to figure out if we need to read some urgent data. */ + if (sk->rqueue && sk->rqueue->next->th.urg) + { + int offset; + struct sk_buff *skb; + skb = sk->rqueue->next; + offset = sk->copied_seq +1 - skb->th.seq - skb->th.syn; + /* now we know we are at the urgent data. */ + if (offset >= skb->len) + { + verify_area ((void *)arg, sizeof (int)); + put_fs_long(1, (unsigned long *)arg); + return (0); + } + } + verify_area ((void *)arg, sizeof (int)); + put_fs_long(0, (unsigned long *)arg); + return (0); +#endif + } +} + + +/* this routine computes a tcp checksum */ +static unsigned short +tcp_check (struct tcp_header *th, int len, unsigned long saddr, + unsigned long daddr) +{ + unsigned long sum; + + if (saddr == 0) saddr = MY_IP_ADDR; + print_th (th); + __asm__("\t addl %%ecx,%%ebx\n" + "\t adcl %%edx,%%ebx\n" + "\t adcl $0, %%ebx\n" + : "=b" (sum) + : "0" (daddr), "c" (saddr), "d" ((net16(len) << 16) + IP_TCP*256) + : "cx","bx","dx" ); + + if (len > 3) + { + __asm__( + "\tclc\n" + "1:\n" + "\t lodsl\n" + "\t adcl %%eax, %%ebx\n" + "\t loop 1b\n" + "\t adcl $0, %%ebx\n" + : "=b" (sum) , "=S" (th) + : "0" (sum), "c" (len/4) ,"1" (th) + : "ax", "cx", "bx", "si" ); + } + + /* convert from 32 bits to 16 bits. */ + __asm__( + "\t movl %%ebx, %%ecx\n" + "\t shrl $16,%%ecx\n" + "\t addw %%cx, %%bx\n" + "\t adcw $0, %%bx\n" + : "=b" (sum) + : "0" (sum) + : "bx", "cx"); + + /* check for an extra word. */ + if ((len & 2) != 0) + { + __asm__("\t lodsw\n" + "\t addw %%ax,%%bx\n" + "\t adcw $0, %%bx\n" + : "=b" (sum), "=S" (th) + : "0" (sum) ,"1" (th) + : "si", "ax", "bx"); + } + + /* now check for the extra byte. */ + if ((len & 1) != 0) + { + __asm__("\t lodsb\n" + "\t movb $0,%%ah\n" + "\t addw %%ax,%%bx\n" + "\t adcw $0, %%bx\n" + : "=b" (sum) + : "0" (sum) ,"S" (th) + : "si", "ax", "bx"); + } + + /* we only want the bottom 16 bits, but we never cleared + the top 16. */ + return ((~sum) & 0xffff); +} + + +static void +tcp_send_check (struct tcp_header *th, unsigned long saddr, + unsigned long daddr, int len, volatile struct sock *sk) + { + + th->check = 0; + if (sk && sk->no_check) return; + th->check = tcp_check (th, len, saddr, daddr); + return; +} + + /* This routine sends an ack and also updates the window. */ + static void + tcp_send_ack (unsigned long sequence, unsigned long ack, + volatile struct sock *sk, + struct tcp_header *th, unsigned long daddr) + { + struct sk_buff *buff; + struct tcp_header *t1; + struct device *dev=NULL; + int tmp; + + /* we need to grab some memory, and put together an ack, and then + put it into the queue to be sent. */ + + buff=sk->prot->wmalloc(sk,MAX_ACK_SIZE,1); + if (buff == NULL) + { + /* force it to send an ack. */ + sk->ack_backlog++; + if (sk->timeout != TIME_WRITE && sk->state < TCP_CLOSING) + { + sk->timeout = TIME_WRITE; + sk->time_wait.len = 10; /* got to do it quickly. */ + reset_timer ((struct timer *)&sk->time_wait); + } + return; + } + + buff->mem_addr = buff; + buff->mem_len = MAX_ACK_SIZE; + buff->len=sizeof (struct tcp_header); + buff->sk = sk; + t1 = (struct tcp_header *)(buff + 1); + /* put in the ip_header and routing stuff. */ + tmp = sk->prot->build_header (buff, sk->saddr, daddr, &dev, + IP_TCP, sk->opt, MAX_ACK_SIZE); + if (tmp < 0) + { + sk->prot->wfree(sk, buff->mem_addr, buff->mem_len); + return; + } + buff->len += tmp; + t1 = (struct tcp_header *)((char *)t1 +tmp); + + memcpy (t1, th, sizeof (*t1)); /* this should probably be removed. */ + + /* swap the send and the receive. */ + t1->dest = th->source; + t1->source = th->dest; + t1->seq = net32(sequence); + t1->ack = 1; + sk->window = sk->prot->rspace(sk); + t1->window = net16(sk->window); + t1->res1=0; + t1->res2=0; + t1->rst = 0; + t1->urg = 0; + t1->syn = 0; + t1->psh = 0; + t1->fin = 0; + if (ack == sk->acked_seq) + { + sk->ack_backlog = 0; + sk->bytes_rcv = 0; + sk->ack_timed = 0; + if (sk->send_head == NULL && + sk->wfront == NULL) + { + delete_timer((struct timer *)&sk->time_wait); + sk->timeout = 0; + } + + } + t1->ack_seq = net32(ack); + t1->doff = sizeof (*t1)/4; + tcp_send_check (t1, sk->saddr, daddr, sizeof (*t1), sk); + sk->prot->queue_xmit(sk, dev, buff, 1); +} + +/* this routine builds a generic tcp header. */ +static int +tcp_build_header(struct tcp_header *th, volatile struct sock *sk, int push) +{ + + /* want to get rid of this. */ + memcpy (th,(void *) &(sk->dummy_th), sizeof (*th)); + th->seq = net32(sk->send_seq); + th->psh = (push == 0) ? 1 : 0; + th->doff = sizeof (*th)/4; + th->ack = 1; + th->fin = 0; + sk->ack_backlog = 0; + sk->bytes_rcv = 0; + sk->ack_timed = 0; + th->ack_seq = net32(sk->acked_seq); + sk->window = sk->prot->rspace(sk); + th->window = net16(sk->window); + + return (sizeof (*th)); +} + +/* This routine copies from a user buffer into a socket, and starts + the transmit system. */ + +static int +tcp_write(volatile struct sock *sk, unsigned char *from, + int len, int nonblock, unsigned flags) +{ + int copied=0; + int copy; + int tmp; + struct sk_buff *skb; + unsigned char *buff; + struct proto *prot; + struct device *dev=NULL; + + PRINTK ("in TCP_WRITE sk = %X:\n",sk); + print_sk (sk); + + sk->inuse = 1; /* no one else will use this socket. */ + prot = sk->prot; + while (len > 0) + { + /* first thing we do is make sure that we are established. */ + + while (sk->state != TCP_ESTABLISHED) + { + if (sk->state != TCP_SYN_SENT && + sk->state != TCP_SYN_RECV) + { + release_sock (sk); + if (sk->keepopen) + { + send_sig (SIGPIPE, current, 0); + return (-EINTR); + } + if (copied) return (copied); + if (sk->err) return (-sk->err); + return (-ENOTCONN); + } + + if (nonblock) + { + release_sock (sk); + return (-EAGAIN); + } + + /* now here is a race condition. + release_sock could cause the connection to + enter the established mode, if that is the + case, then we will block here for ever, because + we will have gotten our wakeup call before we + go to sleep. */ + release_sock (sk); + cli(); + if (sk->state != TCP_ESTABLISHED) + { + interruptible_sleep_on (sk->sleep); + if (current->signal & ~current->blocked) + { + sti(); + if (copied) return (copied); + return (-ERESTARTSYS); + } + } + sti(); + sk->inuse = 1; + } + /* we also need to worry about the window. The smallest we + will send is about 200 bytes. */ + + copy = min (sk->mtu, diff(sk->window_seq, sk->send_seq)); + if (copy < 200) copy = sk->mtu; + copy = min (copy, len); + + skb=prot->wmalloc (sk, copy + prot->max_header+sizeof (*skb),0); + + /* if we didn't get any memory, we need to sleep. */ + if (skb == NULL) + { + if (nonblock || copied) + { + break; + } + /* here is another race condition. */ + tmp = sk->wmem_alloc; + release_sock (sk); + /* again we will try to avoid it. */ + cli (); + if (tmp <= sk->wmem_alloc) + { + interruptible_sleep_on (sk->sleep); + if (current->signal & ~current->blocked) + { + sti(); + if (copied) return (copied); + return (-ERESTARTSYS); + } + } + sti(); + sk->inuse = 1; + continue; + } + skb->mem_addr = skb; + skb->mem_len = copy+prot->max_header+sizeof (*skb); + skb->len = 0; + skb->sk = sk; + buff =(unsigned char *)( skb+1); + /* we need to optimize this. Perhaps some hints here + would be good. */ + + tmp = prot->build_header (skb, sk->saddr, sk->daddr, &dev, + IP_TCP, sk->opt, skb->mem_len); + if (tmp < 0 ) + { + prot->wfree (sk, skb->mem_addr, skb->mem_len); + release_sock (sk); + return (tmp); + } + skb->len += tmp; + skb->dev = dev; + buff+=tmp; + tmp = tcp_build_header((struct tcp_header *)buff, sk, len-copy); + if (tmp < 0) + { + prot->wfree (sk, skb->mem_addr, skb->mem_len); + release_sock (sk); + return (tmp); + } + + if (flags & MSG_OOB) + { + ((struct tcp_header *)buff)->urg = 1; + ((struct tcp_header *)buff)->urg_ptr = copy; + } + skb->len += tmp; + memcpy_fromfs (buff+tmp, from, copy); + + tcp_send_check ((struct tcp_header *)buff, sk->saddr, sk->daddr, + copy +sizeof (struct tcp_header), sk); + + from += copy; + copied += copy; + len -= copy; + skb->len += copy; + skb->free = 0; + sk->send_seq += copy; + skb->h.seq = sk->send_seq; + if (after (sk->send_seq , sk->window_seq) || + sk->packets_out >= sk->cong_window) + { + PRINTK ("sk->cong_window = %d, sk->packets_out = %d\n", + sk->cong_window, sk->packets_out); + PRINTK ("sk->send_seq = %d, sk->window_seq = %d\n", + sk->send_seq, sk->window_seq); + skb->next = NULL; + if (sk->wback == NULL) + { + sk->wfront=skb; + } + else + { + sk->wback->next = skb; + } + sk->wback = skb; + } + else + { + prot->queue_xmit (sk, dev, skb,0); + } + } + sk->err = 0; + release_sock (sk); + return (copied); +} + + +static void +tcp_read_wakeup(volatile struct sock *sk) +{ + int tmp; + struct device *dev = NULL; + struct tcp_header *t1; + struct sk_buff *buff; + + if (!sk->ack_backlog ) return; + PRINTK ("in tcp read wakeup\n"); + /* we need to put code here to prevent this routine from being called. */ + /* being called once in a while is ok, so only check if this is the + second time in a row. */ + + /* we need to grab some memory, and put together an ack, and then + put it into the queue to be sent. */ + + buff=sk->prot->wmalloc(sk,MAX_ACK_SIZE,1); + if (buff == NULL) + { + /* try again real soon. */ + sk->timeout = TIME_WRITE; + sk->time_wait.len = 10; + reset_timer((struct timer *) &sk->time_wait); + return; + } + + buff->mem_addr = buff; + buff->mem_len = MAX_ACK_SIZE; + buff->len=sizeof (struct tcp_header); + buff->sk = sk; + + /* put in the ip_header and routing stuff. */ + tmp = sk->prot->build_header (buff, sk->saddr, sk->daddr, &dev, + IP_TCP, sk->opt, MAX_ACK_SIZE); + if (tmp < 0) + { + sk->prot->wfree(sk, buff->mem_addr, buff->mem_len); + return; + } + + buff->len += tmp; + t1 = (struct tcp_header *)((char *)(buff+1) +tmp); + + memcpy (t1,(void *) &sk->dummy_th, sizeof (*t1)); + t1->seq = net32(sk->send_seq); + t1->ack = 1; + t1->res1=0; + t1->res2=0; + t1->rst = 0; + t1->urg = 0; + t1->syn = 0; + t1->psh = 0; + sk->ack_backlog = 0; + sk->bytes_rcv = 0; + sk->window = sk->prot->rspace(sk); + t1->window = net16(sk->window); + t1->ack_seq = net32(sk->acked_seq); + t1->doff = sizeof (*t1)/4; + tcp_send_check (t1, sk->saddr, sk->daddr, sizeof (*t1), sk); + sk->prot->queue_xmit(sk, dev, buff, 1); +} + + +/* This routine frees used buffers. */ +/* It should consider sending an ack to let the + other end know we now have a bigger window. */ + +static void +cleanup_rbuf (volatile struct sock *sk) +{ + PRINTK ("cleaning rbuf for sk=%X\n",sk); + /* we have to loop through all the buffer headers, and + try to free up all the space we can. */ + while (sk->rqueue != NULL ) + { + struct sk_buff *skb; + skb=sk->rqueue->next; + if (!skb->used) break; + if (sk->rqueue == skb) + { + sk->rqueue = NULL; + } + else + { + skb->next->prev = skb->prev; + skb->prev->next = skb->next; + } + skb->sk = sk; + free_skb (skb, FREE_READ); + } + /* at this point we should send an ack if the difference in + the window, and the amount of space is bigger than + TCP_WINDOW_DIFF */ + PRINTK ("sk->window left = %d, sk->prot->rspace(sk)=%d\n", + sk->window - sk->bytes_rcv, sk->prot->rspace(sk)); + + if ((sk->prot->rspace(sk) > + (sk->window - sk->bytes_rcv + TCP_WINDOW_DIFF)) || + (sk->window - sk->bytes_rcv < 2*sk->mtu)) + { + /* force it to send an ack. */ + sk->ack_backlog++; + if (sk->timeout != TIME_WRITE && sk->state == TCP_ESTABLISHED) + { + sk->time_wait.len = TCP_ACK_TIME; + sk->timeout=TIME_WRITE; + reset_timer ((struct timer *)&sk->time_wait); + } + } + +} + +/* handle reading urgent data. */ +static int +tcp_read_urg(volatile struct sock * sk, + unsigned char *to, int len, unsigned flags) +{ + int copied = 0; + struct sk_buff *skb; + PRINTK ("tcp_read_urg(sk=%X, to=%X, len=%d, flags=%X)\n", + sk, to, len, flags); + print_sk(sk); + while (len > 0) + { + sk->inuse = 1; + while (sk->urg==0 || sk->rqueue == NULL) + { + /* now at this point, we may have gotten some data. */ + release_sock (sk); + if (sk->state > TCP_CLOSING) + { + if (copied) return (copied); + return (-ENOTCONN); + } + cli(); + if (sk->urg == 0 || sk->rqueue == NULL) + { + interruptible_sleep_on (sk->sleep); + if (current->signal & ~current->blocked) + { + sti(); + if (copied) return (copied); + return (-ERESTARTSYS); + } + } + sti(); + sk->inuse = 1; + } + /* now we have some urgent data, we must find it.*/ + for (skb = sk->rqueue->next; skb->next != sk->rqueue; + skb = skb->next) + { + int offset; + int amt; + if (!skb->h.th->urg) continue; + offset = 0; + amt = min(skb->h.th->urg_ptr,len); + verify_area (to, amt); + memcpy_tofs (to, (unsigned char *)(skb->h.th) + + skb->h.th->doff*4 + + offset, amt); + + if (!(flags & MSG_PEEK)) + { + skb->urg_used = 1; + sk->urg --; + } + release_sock (sk); + copied += amt; + return (copied); + } + } + return (0); +} + +/* This routine copies from a sock struct into the user buffer. */ +static int +tcp_read(volatile struct sock *sk, unsigned char *to, + int len, int nonblock, unsigned flags) +{ + int copied=0; /* will be used to say how much has been copied. */ + struct sk_buff *skb; + unsigned long offset; + unsigned long used; + + if (len == 0) return (0); + if (len < 0) + { + return (-EINVAL); + } + + /* this error should be checked. */ + if (sk->state == TCP_LISTEN) return (-ENOTCONN); + + /* urgent data needs to be handled specially. */ + if ((flags & MSG_OOB)) + return (tcp_read_urg (sk, to, len, flags)); + + /* so no-one else will use this socket. */ + sk->inuse = 1; + if (sk->rqueue != NULL) + skb=sk->rqueue->next; + else + skb = NULL; + + while ( len > 0) + { + PRINTK("tcp_read (sk=%X, to=%X, len=%d, nonblock=%d, flags=%X)\n", + sk, to, len, nonblock, flags); + while ( skb == NULL || before (sk->copied_seq+1, skb->h.th->seq) || + skb->used) /* skb->used just checks to see if we've + gone all the way around. */ + { + + PRINTK("skb = %X:\n",skb); + print_skb(skb); + print_sk (sk); + + cleanup_rbuf(sk); + + if (nonblock || ((flags & MSG_PEEK) && copied)) + { + release_sock (sk); + if (copied) return (copied); + return (-EAGAIN); + } + + release_sock (sk); /* now we may have some data waiting. */ + + + PRINTK ("tcp_read about to sleep. state = %d\n",sk->state); + cli(); + + if (sk->state == TCP_CLOSE || sk->state == TCP_TIME_WAIT) + { + sti(); + if (copied) return (copied); + if (sk->err) return (-sk->err); + if (!sk->done) + { + sk->done = 1; + return (0); + } + return (-ENOTCONN); + } + + if ( sk->rqueue == NULL || + before (sk->copied_seq+1, sk->rqueue->next->h.th->seq)) + { + interruptible_sleep_on (sk->sleep); + if (current->signal & ~current->blocked) + { + sti (); + if (copied) return (copied); + return (-ERESTARTSYS); + } + } + sti(); + PRINTK ("tcp_read woke up. \n"); + + sk->inuse = 1; + + if (sk->rqueue != NULL) + skb=sk->rqueue->next; + else + skb = NULL; + + } + + /* Copy anything from the current block that needs to go + into the user buffer. */ + + offset = sk->copied_seq+1 - skb->h.th->seq; + + if (skb->h.th->syn) offset --; + if (offset < skb->len ) + { + /* if there is urgent data we must either return or skip + over it. */ + if (skb->h.th->urg) + { + if (skb->urg_used) + { + if (flags & MSG_PEEK) break; + sk->copied_seq += skb->h.th->urg_ptr; + offset += skb->h.th->urg_ptr; + if (offset > skb->len) + { + skb->used = 1; + skb=skb->next; + continue; + } + } + else + { + break; + } + } + used = min(skb->len - offset, len); + + verify_area (to, used); + memcpy_tofs(to, ((unsigned char *)skb->h.th) + + skb->h.th->doff*4 + + offset, + used); + copied += used; + len -= used; + to += used; + if (!(flags & MSG_PEEK)) + sk->copied_seq += used; + + /* mark this data used if we are really reading it, and if + it doesn't contain any urgent data. And we have used all + the data. */ + if (!(flags & MSG_PEEK) && + (!skb->h.th->urg || skb->urg_used) && + (used + offset >= skb->len) ) + skb->used = 1; + + /* see if this is the end of a message or if the remaining data + is urgent. */ + if ( skb->h.th->psh || skb->h.th->urg) + { + break; + } + } + else /* already used this data, must be a retransmit. */ + { + skb->used = 1; + } + skb=skb->next; + } + cleanup_rbuf (sk); + release_sock (sk); + if (copied == 0 && nonblock) return (-EAGAIN); + return (copied); +} + +/* this routine will send a reset to the other tcp. */ +static void +tcp_reset(unsigned long saddr, unsigned long daddr, struct tcp_header *th, + struct proto *prot, struct options *opt, struct device *dev) +{ + /* we need to grab some memory, and put together a reset, and then + put it into the queue to be sent. */ + struct sk_buff *buff; + struct tcp_header *t1; + int tmp; + buff=prot->wmalloc(NULL, MAX_RESET_SIZE,1); + if (buff == NULL) return; + + PRINTK("tcp_reset buff = %X\n", buff); + buff->mem_addr = buff; + buff->mem_len = MAX_RESET_SIZE; + buff->len = sizeof (*t1); + buff->sk = NULL; + buff->dev = dev; + + t1=(struct tcp_header *)(buff + 1); + /* put in the ip_header and routing stuff. */ + tmp = prot->build_header (buff, saddr, daddr, &dev, IP_TCP, opt, + sizeof(struct tcp_header)); + if (tmp < 0) + { + prot->wfree (NULL,buff->mem_addr, buff->mem_len); + return; + } + t1 = (struct tcp_header *)((char *)t1 +tmp); + buff->len += tmp; + memcpy (t1, th, sizeof (*t1)); + /* swap the send and the receive. */ + t1->dest = th->source; + t1->source = th->dest; + t1->seq = th->ack_seq; /* add one so it will be in + the right range.*/ + t1->rst = 1; + t1->ack = 0; + t1->syn = 0; + t1->urg = 0; + t1->fin = 0; + t1->psh = 0; + t1->doff = sizeof (*t1)/4; + tcp_send_check (t1, saddr, daddr, sizeof (*t1), NULL); + prot->queue_xmit(NULL, dev, buff, 1); + +} + + +/* This routine handles a connection request. This should make sure + we haven't already responded. */ +/* Because of the way BSD works, we have to send a syn/ack now. This also + means it will be harder to close a socket which is listening. */ + +static void +tcp_conn_request(volatile struct sock *sk, struct sk_buff *skb, + unsigned long daddr, + unsigned long saddr, struct options *opt, struct device *dev) +{ + struct sk_buff *buff; + struct tcp_header *t1; + unsigned char *ptr; + volatile struct sock *newsk; + struct tcp_header *th; + int tmp; + th = skb->h.th; + + PRINTK ("tcp_conn_request (sk = %X, skb = %X, daddr = %X, sadd4= %X, \n" + " opt = %X, dev = %X)\n", + sk, skb, daddr, saddr, opt, dev); + + /* if the socket is dead, don't accept the connection. */ + if (!sk->dead) + { + wake_up(sk->sleep); + } + else + { + PRINTK ("tcp_conn_request on dead socket\n"); + tcp_reset (daddr, saddr, th, sk->prot, opt, dev); + free_skb (skb, FREE_READ); + return; + } + + + /* we need to build a new sock struct. */ + /* It is sort of bad to have a socket without an inode attached to + it, but the wake_up's will just wake up the listening socket, + and if the listening socket is destroyed before this is taken + off of the queue, this will take care of it. */ + + newsk = malloc(sizeof (struct sock)); + if (newsk == NULL) + { + /* just ignore the syn. It will get retransmitted. */ + free_skb (skb, FREE_READ); + return; + } + + + PRINTK ("newsk = %X\n", newsk); + memcpy ((void *)newsk, (void *)sk, sizeof (*newsk)); + newsk->wback = NULL; + newsk->wfront = NULL; + newsk->rqueue = NULL; + newsk->send_head = NULL; + newsk->send_tail = NULL; + newsk->back_log = NULL; + newsk->blog = 0; + newsk->intr = 0; + newsk->proc = 0; + newsk->done = 0; + + newsk->pair = NULL; + newsk->wmem_alloc = 0; + newsk->rmem_alloc = 0; + + newsk->max_unacked = MAX_WINDOW - TCP_WINDOW_DIFF; + + newsk->err = 0; + newsk->shutdown = 0; + newsk->ack_backlog = 0; + newsk->acked_seq = skb->h.th->seq+1; + newsk->fin_seq = skb->h.th->seq; + newsk->copied_seq = skb->h.th->seq; + newsk->state = TCP_SYN_RECV; + newsk->timeout = 0; + newsk->send_seq = timer_seq*SEQ_TICK-seq_offset; + newsk->rcv_ack_seq = newsk->send_seq; + newsk->urg =0; + newsk->retransmits = 0; + newsk->destroy = 0; + newsk->time_wait.sk = newsk; + newsk->time_wait.next = NULL; + newsk->dummy_th.source = skb->h.th->dest; + newsk->dummy_th.dest = skb->h.th->source; + /* swap these two, they are from our point of view. */ + newsk->daddr=saddr; + newsk->saddr=daddr; + + put_sock (newsk->num,newsk); + newsk->dummy_th.res1=0; + newsk->dummy_th.doff=6; + newsk->dummy_th.fin=0; + newsk->dummy_th.syn=0; + newsk->dummy_th.rst=0; + newsk->dummy_th.psh=0; + newsk->dummy_th.ack=0; + newsk->dummy_th.urg=0; + newsk->dummy_th.res2=0; + newsk->acked_seq = skb->h.th->seq+1; + newsk->copied_seq = skb->h.th->seq; + + if (skb->h.th->doff == 5) + { + newsk->mtu=dev->mtu-HEADER_SIZE; + } + else + { + ptr = (unsigned char *)(skb+1); + if (ptr[0] != 2 || ptr[1] != 4) + { + newsk->mtu=576-HEADER_SIZE; + } + else + { + newsk->mtu = min (ptr[2]*256+ptr[3]-HEADER_SIZE, + dev->mtu-HEADER_SIZE); + } + } + + print_sk (newsk); + buff=newsk->prot->wmalloc(newsk,MAX_SYN_SIZE,1); + if (buff == NULL) + { + sk->err = -ENOMEM; + newsk->dead = 1; + release_sock (newsk); + free_skb (skb, FREE_READ); + return; + } + + buff->mem_addr = buff; + buff->mem_len = MAX_SYN_SIZE; + buff->len=sizeof (struct tcp_header)+4; + buff->sk = newsk; + + t1=(struct tcp_header *)(buff + 1); + /* put in the ip_header and routing stuff. */ + + tmp = sk->prot->build_header (buff, newsk->saddr, newsk->daddr, &dev, + IP_TCP, NULL, MAX_SYN_SIZE); + + /* something went wrong. */ + if (tmp < 0) + { + sk->err = tmp; + sk->prot->wfree(newsk, buff->mem_addr, buff->mem_len); + newsk->dead = 1; + release_sock (newsk); + free_skb (skb, FREE_READ); + return; + } + + buff->len += tmp; + t1 = (struct tcp_header *)((char *)t1 +tmp); + + memcpy (t1, skb->h.th, sizeof (*t1)); + buff->h.seq = newsk->send_seq; + /* swap the send and the receive. */ + t1->dest = skb->h.th->source; + t1->source = newsk->dummy_th.source; + t1->seq = net32(newsk->send_seq++); + t1->ack = 1; + newsk->window = sk->prot->rspace(newsk); + t1->window = net16(newsk->window); + t1->res1=0; + t1->res2=0; + t1->rst = 0; + t1->urg = 0; + t1->psh = 0; + t1->syn = 1; + t1->ack_seq = net32(skb->h.th->seq+1); + t1->doff = sizeof (*t1)/4+1; + + ptr = (unsigned char *)(t1+1); + ptr[0]=2; + ptr[1]=4; + ptr[2]=((dev->mtu - HEADER_SIZE) >> 8) & 0xff; + ptr[3]=(dev->mtu - HEADER_SIZE) & 0xff; + + tcp_send_check (t1, daddr, saddr, sizeof (*t1)+4, newsk); + newsk->prot->queue_xmit(newsk, dev, buff, 0); + + newsk->time_wait.len = TCP_CONNECT_TIME; + PRINTK ("newsk->time_wait.sk = %X\n", newsk->time_wait.sk); + reset_timer ((struct timer *)&newsk->time_wait); + skb->sk = newsk; + /* charge the sock_buff to newsk. */ + sk->rmem_alloc -= skb->mem_len; + newsk->rmem_alloc += skb->mem_len; + + if (sk->rqueue == NULL) + { + skb->next = skb; + skb->prev = skb; + sk->rqueue = skb; + } + else + { + skb->next = sk->rqueue; + skb->prev = sk->rqueue->prev; + sk->rqueue->prev = skb; + skb->prev->next = skb; + } + release_sock (newsk); +} + +static void +tcp_close (volatile struct sock *sk, int timeout) +{ + /* we need to grab some memory, and put together a fin, and then + put it into the queue to be sent. */ + struct sk_buff *buff; + int need_reset = 0; + struct tcp_header *t1,*th; + struct proto *prot; + struct device *dev=NULL; + int tmp; + PRINTK ("tcp_close ((struct sock *)%X, %d)\n",sk, timeout); + sk->inuse = 1; + sk->keepopen = 0; + sk->shutdown = SHUTDOWN_MASK; + + if (!sk->dead) + wake_up (sk->sleep); + + + /* we need to flush the recv. buffs. */ + + if (sk->rqueue != NULL) + { + struct sk_buff *skb; + struct sk_buff *skb2; + skb = sk->rqueue; + do { + skb2=skb->next; + free_skb (skb, FREE_READ); + skb=skb2; + } while (skb != sk->rqueue); + need_reset = 1; + } + sk->rqueue = NULL; + + + switch (sk->state) + { + case TCP_FIN_WAIT1: + case TCP_FIN_WAIT2: + case TCP_LAST_ACK: + if (timeout) + tcp_time_wait(sk); + release_sock (sk); + if (!need_reset) + return; + break; + + case TCP_TIME_WAIT: + if (timeout) + sk->state = TCP_CLOSE; + release_sock (sk); + return; + + case TCP_LISTEN: + sk->state = TCP_CLOSE; + release_sock(sk); + return; + + case TCP_CLOSE: + + release_sock(sk); + return; + + + case TCP_ESTABLISHED: + case TCP_SYN_SENT: + case TCP_SYN_RECV: + + prot = (struct proto *)sk->prot; + th=(struct tcp_header *)&sk->dummy_th; + + buff=prot->wmalloc(sk, MAX_FIN_SIZE,1); + if (buff == NULL) + { + /* this will force it to try again later. */ + sk->state = TCP_ESTABLISHED; + sk->timeout = TIME_CLOSE; + sk->time_wait.len = 100; /* wait a second. */ + reset_timer ((struct timer *)&sk->time_wait); + return; + } + + buff->mem_addr = buff; + buff->mem_len = MAX_FIN_SIZE; + buff->sk = sk; + buff->len = sizeof (*t1); + t1=(struct tcp_header *)(buff + 1); + /* put in the ip_header and routing stuff. */ + tmp = prot->build_header (buff,sk->saddr, sk->daddr, &dev, + IP_TCP, sk->opt, + sizeof(struct tcp_header)); + if (tmp < 0) + { + prot->wfree (sk,buff->mem_addr, buff->mem_len); + PRINTK ("Unable to build header for fin.\n"); + release_sock(sk); + return; + } + t1 = (struct tcp_header *)((char *)t1 +tmp); + buff ->len += tmp; + buff->dev = dev; + memcpy (t1, th, sizeof (*t1)); + t1->seq = net32(sk->send_seq); + sk->send_seq++; + buff->h.seq = sk->send_seq; + t1->ack = 1; + /* ack everything immediately from now on. */ + sk->delay_acks = 0; + t1->ack_seq = net32(sk->acked_seq); + t1->window = net16(sk->prot->rspace(sk)); + t1->fin = 1; + t1->rst = need_reset; + t1->doff = sizeof (*t1)/4; + tcp_send_check (t1, sk->saddr, sk->daddr, sizeof (*t1), sk); + + if (sk->wfront == NULL) + { + prot->queue_xmit(sk, dev, buff, 0); + } + else + { + sk->time_wait.len = sk->rtt; + sk->timeout = TIME_WRITE; + reset_timer ((struct timer *)&sk->time_wait); + buff->next = NULL; + if (sk->wback == NULL) + { + sk->wfront=buff; + } + else + { + sk->wback->next = buff; + } + sk->wback = buff; + + } + sk->state = TCP_FIN_WAIT1; + } + release_sock (sk); +} + + +/* This routine takes stuff off of the write queue, and puts it in the + xmit queue. */ +static void +tcp_write_xmit (volatile struct sock *sk) +{ + struct sk_buff *skb; + while (sk->wfront != NULL && before (sk->wfront->h.seq, sk->window_seq) && + sk->packets_out < sk->cong_window) + { + skb = sk->wfront; + sk->wfront = skb->next; + if (sk->wfront == NULL) + sk->wback = NULL; + sk->prot->queue_xmit (sk, skb->dev, skb, skb->free); + } +} + + + +/* This routine deals with incoming acks, but not outgoing ones. */ + +static int +tcp_ack (volatile struct sock *sk, struct tcp_header *th, unsigned long saddr) +{ + unsigned long ack; + ack = net32(th->ack_seq); + + if (!between (ack , sk->rcv_ack_seq, sk->send_seq)) + { + if (after (ack, sk->send_seq) || sk->state != TCP_ESTABLISHED) + { + return (0); + } + if (sk->keepopen) + reset_timer ((struct timer *)&sk->time_wait); + sk->retransmits = 0; + return (1); + } + + sk->window_seq = ack + net16(th->window); + + + /* we don't want too many packets out there. */ + if (sk->cong_window < 2048 && ack != sk->rcv_ack_seq) + { + if (sk->exp_growth) + sk->cong_window *= 2; + else + sk->cong_window++; + } + + sk->rcv_ack_seq = ack; + + /* see if we can take anything off of the retransmit queue. */ + while (sk->send_head != NULL) + { + if (before (sk->send_head->h.seq, ack+1)) + { + struct sk_buff *oskb; + /* we have one less packet out there. */ + sk->packets_out --; + cli(); + oskb = sk->send_head; + /* estimate the rtt. */ + sk->rtt += ((jiffies - oskb->when) - sk->rtt)/2; + if (sk->rtt < 30) sk->rtt = 30; + sk->send_head = oskb->link3; + if (sk->send_head == NULL) + { + sk->send_tail = NULL; + } + /* we may need to remove this from the dev send list. */ + if (oskb->next != NULL) + { + if (oskb->next != oskb) + { + oskb->next->prev = oskb->prev; + oskb->prev->next = oskb->next; + } + else + { + int i; + for (i = 0; i < DEV_NUMBUFFS; i++) + { + if (oskb->dev->buffs[i] = oskb) + { + oskb->dev->buffs[i]= NULL; + break; + } + } + } + } + free_skb (oskb, FREE_WRITE); /* write. */ + sti(); + if (!sk->dead) + wake_up(sk->sleep); + } + else + { + break; + } + + } + + + /* at this point we need to check to see if we have anything + which needs to be retransmiteed. If we have failed to get + some acks i.e. had to retransmit something, and we succeded, we + should then attempt to retransmit everything right now. */ + + if (sk->retransmits && sk->send_head != NULL) + { + sk->prot->retransmit (sk,1); + } + sk->retransmits = 0; + + /* maybe we can take some stuff off of the write queue, and put it onto + the xmit queue. */ + if (sk->wfront != NULL && sk->packets_out < sk->cong_window) + { + if (after (sk->window_seq, sk->wfront->h.seq)) + { + tcp_write_xmit (sk); + } + } + else + { + if (sk->send_head == NULL && sk->ack_backlog == 0 && + sk->state != TCP_TIME_WAIT) + { + delete_timer((struct timer *)&sk->time_wait); + sk->timeout = 0; + } + else + { + if (sk->state == TCP_TIME_WAIT) + { + sk->time_wait.len = TCP_TIMEWAIT_LEN; + sk->timeout = TIME_CLOSE; + } + reset_timer ((struct timer *)&sk->time_wait); + } + } + + /* see if we are done. */ + if ( sk->state == TCP_TIME_WAIT) + { + if (sk->rcv_ack_seq == sk->send_seq && + sk->acked_seq == sk->fin_seq); + if (!sk->dead) wake_up (sk->sleep); + sk->state = TCP_CLOSE; + } + + if (sk->state == TCP_FIN_WAIT1) + { + if (sk->rcv_ack_seq == sk->send_seq) + sk->state = TCP_FIN_WAIT2; + } + + if (sk->state == TCP_LAST_ACK) + { + if (sk->rcv_ack_seq == sk->send_seq) + { + if (sk->acked_seq != sk->fin_seq) + { + tcp_time_wait(sk); + } + else + { + sk->state = TCP_CLOSE; + } + } + if (!sk->dead) wake_up (sk->sleep); + } + + return (1); +} + +/* This routine handles the data. If there is room in the buffer, it + will be have already been moved into it. If there is no room, + then we will just have to discard the packet. */ + +static int +tcp_data (struct sk_buff *skb, volatile struct sock *sk, + unsigned long saddr, unsigned short len) +{ + struct sk_buff *skb1, *skb2; + struct tcp_header *th; + + th = skb->h.th; + print_th (th); + skb->len = len - (th->doff*4); + + PRINTK("tcp_data len = %d sk = %X:\n",skb->len, sk); + print_sk(sk); + + sk->bytes_rcv += skb->len; + + if (skb->len == 0 && !th->fin && !th->urg && !th->psh) + { + /* don't want to keep passing ack's back and fourth. */ + if (!th->ack) + tcp_send_ack (sk->send_seq, sk->acked_seq,sk, th, saddr); + free_skb(skb, FREE_READ); + return (0); + } + + if (sk->shutdown & RCV_SHUTDOWN) + { + /* just ack everything. */ + sk->acked_seq = th->seq + skb->len + th->syn + th->fin; + tcp_send_ack (sk->send_seq, sk->acked_seq, sk, skb->h.th, saddr); + free_skb (skb, FREE_READ); + if (sk->state == TCP_TIME_WAIT && sk->acked_seq == sk->fin_seq) + { + if (!sk->dead) wake_up (sk->sleep); + sk->state = TCP_CLOSE; + } + return (0); + } + + /* now we have to walk the chain, and figure out where this one + goes into it. This is set up so that the last packet we received + will be the first one we look at, that way if everything comes + in order, there will be no performance loss, and if they come + out of order we will be able to fit things in nicely. */ + + if (sk->rqueue == NULL) + { + PRINTK ("tcp_data: skb = %X:\n",skb); + print_skb (skb); + + sk->rqueue = skb; + skb->next = skb; + skb->prev = skb; + skb1= NULL; + } + else + { + PRINTK ("tcp_data adding to chain sk = %X:\n",sk); + print_sk (sk); + + for (skb1=sk->rqueue; ; skb1=skb1->prev) + { + PRINTK ("skb1=%X\n",skb1); + print_skb(skb1); + PRINTK ("skb1->h.th->seq = %d\n", skb1->h.th->seq); + if (after ( th->seq+1, skb1->h.th->seq)) + { + skb->prev = skb1; + skb->next = skb1->next; + skb->next->prev = skb; + skb1->next = skb; + if (skb1 == sk->rqueue) + sk->rqueue = skb; + break; + } + if ( skb1->prev == sk->rqueue) + { + skb->next= skb1; + skb->prev = skb1->prev; + skb->prev->next = skb; + skb1->prev = skb; + skb1 = NULL; /* so we know we might be able to ack stuff. */ + break; + } + } + + PRINTK ("skb = %X:\n",skb); + print_skb (skb); + PRINTK ("sk now equals:\n"); + print_sk (sk); + + } + + th->ack_seq = th->seq + skb->len; + if (th->syn) th->ack_seq ++; + if (th->fin) th->ack_seq ++; + + if (before (sk->acked_seq, sk->copied_seq)) + { + printk ("*** tcp.c:tcp_data bug acked < copied\n"); + sk->acked_seq = sk->copied_seq; + } + + /* now figure out if we can ack anything. */ + if (skb1 == NULL || skb1->acked || before (th->seq, sk->acked_seq+1)) + { + if (before (th->seq, sk->acked_seq+1)) + { + sk->acked_seq = th->ack_seq; + skb->acked = 1; + + for (skb2=skb->next; skb2 != sk->rqueue->next; skb2=skb2->next) + { + if (before(skb2->h.th->seq, sk->acked_seq+1)) + { + sk->acked_seq = skb2->h.th->ack_seq; + skb2->acked = 1; + /* force an immediate ack. */ + sk->ack_backlog = sk->max_ack_backlog; + } + else + break; + } + + /* this also takes care of updating the window. */ + /* this if statement needs to be simplified. */ + + if (!sk->delay_acks || + sk->ack_backlog >= sk->max_ack_backlog || + sk->window < 2*sk->mtu + sk->bytes_rcv || + sk->bytes_rcv > sk->max_unacked || + th->fin) + { + tcp_send_ack (sk->send_seq, sk->acked_seq,sk,th, saddr); + } + else + { + sk->ack_backlog++; + sk->time_wait.len = TCP_ACK_TIME; + sk->timeout = TIME_WRITE; + reset_timer ((struct timer *)&sk->time_wait); + } + } + } + else + { + /* we missed a packet. Send an ack to try to resync things. */ + tcp_send_ack (sk->send_seq, sk->acked_seq, sk, th, saddr); + } + + /* now tell the user we may have some data. */ + if (!sk->dead) + { + wake_up (sk->sleep); + } + else + { + PRINTK ("data received on dead socket. \n"); + } + + if (sk->state > TCP_CLOSING && sk->acked_seq == sk->fin_seq) + { + sk->state = TCP_CLOSE; + } + + return (0); +} + +static int +tcp_urg (volatile struct sock *sk, struct tcp_header *th, unsigned long saddr) +{ + extern int kill_pg (int pg, int sig, int priv); + extern int kill_proc (int pid, int sig, int priv); + + if (!sk->dead) + wake_up(sk->sleep); + + if (sk->urginline) + { + th->urg = 0; + th->psh = 1; + return (0); + } + + sk->urg++; + + if (!sk->urg) + { + /* so if we get more urgent data, we don't + signal the user again. */ + if (sk->proc == 0) return (0); + if (sk->proc > 0) + { + kill_proc (sk->proc, SIGURG, 1); + } + else + { + kill_pg (-sk->proc, SIGURG, 1); + } + } + return (0); +} + +/* this deals with incoming fins. */ +static int +tcp_fin (volatile struct sock *sk, struct tcp_header *th, + unsigned long saddr, struct device *dev) +{ + struct sk_buff *buff; + struct tcp_header *t1; + int tmp; + PRINTK ("tcp_fin (sk=%X, th=%X, saddr=%X, dev=%X)\n", + sk, th, saddr, dev); + + if (!sk->dead) + { + wake_up (sk->sleep); + } + + /* after sending the fin, we aren't allowed to write anymore. */ + sk->shutdown |= SEND_SHUTDOWN; + + sk->err = 0; + switch (sk->state) + { + case TCP_SYN_RECV: + case TCP_SYN_SENT: + case TCP_ESTABLISHED: + sk->state = TCP_LAST_ACK; + break; + + default: + case TCP_FIN_WAIT1: + case TCP_TIME_WAIT: + sk->state = TCP_LAST_ACK; + /* start the timers. */ + sk->time_wait.len = TCP_TIMEWAIT_LEN; + sk->timeout = TIME_CLOSE; + reset_timer ((struct timer *)&sk->time_wait); + return (0); + + case TCP_FIN_WAIT2: + sk->state = TCP_CLOSE; + return (0); + } + + /* send an ack and our own fin. */ + buff=sk->prot->wmalloc(sk,MAX_ACK_SIZE,1); + if (buff == NULL) + { + /* we will ignore the fin. That way it will be sent again. */ + return (1); + } + + buff->mem_addr = buff; + buff->mem_len = MAX_ACK_SIZE; + buff->len=sizeof (struct tcp_header); + buff->sk = sk; + + t1 = (struct tcp_header *)(buff + 1); + /* put in the ip_header and routing stuff. */ + tmp = sk->prot->build_header (buff, sk->saddr, sk->daddr, &dev, + IP_TCP, sk->opt, MAX_ACK_SIZE); + if (tmp < 0) + { + sk->prot->wfree(sk, buff->mem_addr, buff->mem_len); + return (0); + } + + buff->len += tmp; + t1 = (struct tcp_header *)((char *)t1 +tmp); + + memcpy (t1, th, sizeof (*t1)); + + /* swap the send and the receive. */ + t1->dest = th->source; + t1->source = th->dest; + + + t1->seq = net32(sk->send_seq++); + + /* contains the one that needs to be acked. */ + sk->fin_seq = th->seq+1; + + buff->h.seq = sk->send_seq; + t1->window = net16(sk->prot->rspace(sk)); + + t1->res1=0; + t1->res2=0; + t1->rst = 0; + t1->urg = 0; + t1->syn = 0; + t1->psh = 0; + t1->ack = 1; + t1->fin = 1; + t1->ack_seq = net32(sk->acked_seq); + + t1->doff = sizeof (*t1)/4; + tcp_send_check (t1, sk->saddr, sk->daddr, sizeof (*t1), sk); + + /* can't just queue this up. It should go at the end of + the write queue. */ + if (sk->wback != NULL) + { + buff->next = NULL; + sk->wback->next = buff; + sk->wback = buff; + } + else + { + sk->prot->queue_xmit (sk, dev, buff,0); + } + + return (0); +} + + +/* this will accept the next outstanding connection. */ + +static volatile struct sock * +tcp_accept (volatile struct sock *sk, int flags) +{ + volatile struct sock *newsk; + struct sk_buff *skb; + + PRINTK ("tcp_accept(sk=%X, flags=%X)\n", sk, flags); + print_sk(sk); + /* we need to make sure that this socket is listening, and that + it has something pending. */ + + if (sk->state != TCP_LISTEN) + { + sk->err = EINVAL; + return (NULL); + } + /* avoid the race. */ + + sk->inuse = 1; + cli(); + while ( (skb = get_firstr(sk)) == NULL ) + { + if (flags & O_NONBLOCK) + { + sti(); + release_sock (sk); + sk->err = EAGAIN; + return (NULL); + } + + release_sock (sk); + interruptible_sleep_on (sk->sleep); + if (current->signal & ~current->blocked) + { + sti(); + sk->err = ERESTARTSYS; + return (NULL); + } + + sk->inuse = 1; + } + sti(); + + /* now all we need to do is return skb->sk. */ + newsk = skb->sk; + free_skb (skb, FREE_READ); + release_sock (sk); + return (newsk); +} + + + +/* this will initiate an outgoing connection. */ +static int +tcp_connect (volatile struct sock *sk, struct sockaddr_in *usin, int addr_len) +{ + struct sk_buff *buff; + struct sockaddr_in sin; + struct device *dev=NULL; + unsigned char *ptr; + int tmp; + struct tcp_header *t1; + if (sk->state != TCP_CLOSE) return (-EISCONN); + if (addr_len < 8) return (-EINVAL); + + verify_area (usin, addr_len); + memcpy_fromfs (&sin,usin, min(sizeof (sin), addr_len)); + + if (sin.sin_family && sin.sin_family != AF_INET) return (-EAFNOSUPPORT); + + sk->daddr = sin.sin_addr.s_addr; + sk->send_seq = timer_seq*SEQ_TICK-seq_offset; + sk->rcv_ack_seq = sk->send_seq -1; + sk->err = 0; + sk->dummy_th.dest = sin.sin_port; + + buff=sk->prot->wmalloc(sk,MAX_SYN_SIZE,0); + if (buff == NULL) + { + return (-ENOMEM); + } + sk->inuse = 1; + buff->mem_addr = buff; + buff->mem_len = MAX_SYN_SIZE; + buff->len=24; + buff->sk = sk; + t1=(struct tcp_header *)(buff + 1); + /* put in the ip_header and routing stuff. */ + /* We need to build the routing stuff fromt the things saved + in skb. */ + tmp = sk->prot->build_header (buff, sk->saddr, sk->daddr, &dev, + IP_TCP, NULL, MAX_SYN_SIZE); + if (tmp < 0) + { + sk->prot->wfree(sk, buff->mem_addr, buff->mem_len); + release_sock (sk); + return (-ENETUNREACH); + } + buff->len += tmp; + t1 = (struct tcp_header *)((char *)t1 +tmp); + + memcpy (t1, (void *)&(sk->dummy_th), sizeof (*t1)); + t1->seq = net32(sk->send_seq++); + buff->h.seq = sk->send_seq; + t1->ack = 0; + t1->window = 2; + t1->res1=0; + t1->res2=0; + t1->rst = 0; + t1->urg = 0; + t1->psh = 0; + t1->syn = 1; + t1->urg_ptr = 0; + t1->doff =6; + /* put in the tcp options to say mtu. */ + ptr=(unsigned char *)(t1+1); + ptr[0]=2; + ptr[1]=4; + ptr[2]=(dev->mtu- HEADER_SIZE) >> 8; + ptr[3]=(dev->mtu- HEADER_SIZE) & 0xff; + sk->mtu = dev->mtu - HEADER_SIZE; + tcp_send_check (t1, sk->saddr, sk->daddr, + sizeof (struct tcp_header) + 4, sk); + /* this must go first otherwise a really quick response will + get reset. */ + sk->state = TCP_SYN_SENT; + + sk->prot->queue_xmit(sk, dev, buff, 0); + + sk->time_wait.len = TCP_CONNECT_TIME; + reset_timer ((struct timer *)&sk->time_wait); + sk->retransmits = TCP_RETR1 - TCP_SYN_RETRIES; + release_sock (sk); + return (0); +} + + +/* this functions checks to see if the tcp header is actually + acceptible. */ + +static int +tcp_sequence (volatile struct sock *sk, struct tcp_header *th, short len, + struct options *opt, unsigned long saddr) +{ + /* this isn't quite right. sk->acked_seq could be more recent + than sk->window. This is however close enough. We will accept + slightly more packets than we should, but it should not cause + problems unless someone is trying to forge packets. */ + + if (between(th->seq, sk->acked_seq, sk->acked_seq + sk->window)|| + between(th->seq + len-sizeof (*th), sk->acked_seq+1, + sk->acked_seq + sk->window)) + { + return (1); + } + + /* if it's too far ahead, send an ack to let the other end + know what we expect. */ + if (after (th->seq, sk->acked_seq + sk->window)) + { + tcp_send_ack (sk->send_seq, sk->acked_seq, sk, th, saddr); + return (0); + } + + if (!th->rst) + { + if (len != th->doff*4 || th->fin || th->syn) + { + sk->delay_acks = 0; + } + + /* try to resync things. */ + tcp_send_ack (net32(th->ack_seq), sk->acked_seq, sk, th, saddr); + } + + /* in case it's just a late ack, let it through */ + if (th->ack && len == th->doff*4 && after (th->seq, sk->acked_seq - 4096) && + !th->fin && !th->syn) return (1); + + return (0); +} + +/* This deals with the tcp option. It isn't very general yet. */ +static void +tcp_options (volatile struct sock *sk, struct tcp_header *th) +{ + unsigned char *ptr; + ptr = (unsigned char *)(th + 1); + if (ptr[0] != 2 || ptr[1] != 4) + { + sk->mtu = min (sk->mtu, 576-HEADER_SIZE); + return; + } + sk->mtu = min (sk->mtu, ptr[2]*256 + ptr[3] - HEADER_SIZE); +} + +int +tcp_rcv(struct sk_buff *skb, struct device *dev, struct options *opt, + unsigned long daddr, unsigned short len, + unsigned long saddr, int redo, struct ip_protocol * protocol) +{ + struct tcp_header *th; + volatile struct sock *sk; + + th = skb->h.th; + /* find the socket. */ + sk=get_sock(&tcp_prot, net16(th->dest), saddr, th->source, daddr); + PRINTK("<<\n"); + PRINTK("len = %d, redo = %d, skb=%X\n", len, redo, skb); + + if (sk) + { + PRINTK ("sk = %X:\n",sk); + print_sk (sk); + } + + if (!redo) + { + if (th->check && tcp_check (th, len, saddr, daddr )) + { + skb->sk = NULL; + free_skb (skb, 0); + /* we don't release the socket because it was never + marked in use. */ + return (0); + } + + /*See if we know about the socket. */ + if (sk == NULL) + { + if (!th->rst) + tcp_reset (daddr, saddr, th, &tcp_prot, opt,dev); + skb->sk = NULL; + free_skb (skb, 0); + return (0); + } + + skb->len = len; + skb->sk = sk; + skb->acked = 0; + skb->used = 0; + skb->free = 0; + skb->urg_used = 0; + skb->saddr = daddr; + skb->daddr = saddr; + + th->seq = net32(th->seq); + + cli(); + + /* we may need to add it to the backlog here. */ + if (sk->inuse) + { + if (sk->back_log == NULL) + { + sk->back_log = skb; + skb->next = skb; + skb->prev = skb; + } + else + { + skb->next = sk->back_log; + skb->prev = sk->back_log->prev; + skb->prev->next = skb; + skb->next->prev = skb; + } + sti(); + return (0); + } + sk->inuse = 1; + sti(); + } + + /* charge the memory to the socket. */ + if (sk->rmem_alloc + skb->mem_len >= SK_RMEM_MAX) + { + skb->sk = NULL; + free_skb (skb, 0); + release_sock (sk); + return (0); + } + + sk->rmem_alloc += skb->mem_len; + + PRINTK ("About to do switch. \n"); + + /* now deal with it. */ + + switch (sk->state) + { + /* this should close the system down if it's waiting for an + ack that is never going to be sent. */ + case TCP_LAST_ACK: + if (th->rst) + { + sk->err = ECONNRESET; + sk->state = TCP_CLOSE; + if (!sk->dead) + { + wake_up (sk->sleep); + } + free_skb (skb, FREE_READ); + release_sock(sk); + return (0); + } + + case TCP_ESTABLISHED: + case TCP_FIN_WAIT1: + case TCP_FIN_WAIT2: + case TCP_TIME_WAIT: + + if (!tcp_sequence (sk, th, len, opt, saddr)) + { + free_skb (skb, FREE_READ); + release_sock(sk); + return (0); + } + if (th->rst) + { + sk->err = ECONNRESET; + sk->state = TCP_CLOSE; + if (!sk->dead) + { + wake_up (sk->sleep); + } + free_skb (skb, FREE_READ); + release_sock(sk); + return (0); + } + + if (opt->security != 0 || opt->compartment != 0 || th->syn) + { + sk->err = ECONNRESET; + sk->state = TCP_CLOSE; + tcp_reset (daddr, saddr, th, sk->prot, opt,dev); + if (!sk->dead) + { + wake_up (sk->sleep); + } + free_skb (skb, FREE_READ); + release_sock(sk); + return (0); + } + + if (th->ack) + { + if(!tcp_ack (sk, th, saddr)) + { + free_skb (skb, FREE_READ); + release_sock(sk); + return (0); + } + } + if (th->urg) + { + if (tcp_urg (sk, th, saddr)) + { + free_skb (skb, FREE_READ); + release_sock(sk); + return (0); + } + } + + if ( tcp_data (skb, sk, saddr, len)) + { + free_skb (skb, FREE_READ); + release_sock(sk); + return (0); + } + + if (!th->fin) + { + release_sock(sk); + return (0); + } + + tcp_fin (sk, th, saddr, dev); + release_sock(sk); + return (0); + + case TCP_CLOSE: + + if (sk->dead || sk->daddr) + { + PRINTK ("packet received for closed,dead socket\n"); + free_skb (skb, FREE_READ); + release_sock (sk); + return (0); + } + + if (!th->rst) + { + if (!th->ack) + th->ack_seq=0; + tcp_reset (daddr, saddr, th, sk->prot, opt,dev); + } + free_skb (skb, FREE_READ); + release_sock(sk); + return (0); + + case TCP_LISTEN: + if (th->rst) + { + free_skb (skb, FREE_READ); + release_sock(sk); + return (0); + } + if (th->ack) + { + tcp_reset (daddr, saddr, th, sk->prot, opt,dev ); + free_skb (skb, FREE_READ); + release_sock(sk); + return (0); + } + + if (th->syn) + { +/* if (opt->security != 0 || opt->compartment != 0) + { + tcp_reset (daddr, saddr, th, prot, opt,dev); + release_sock(sk); + return (0); + } */ + + /* now we just put the whole thing including the header + and saddr, and protocol pointer into the buffer. + We can't respond until the user tells us to accept + the connection. */ + + tcp_conn_request (sk, skb, daddr, saddr, opt, dev); + + release_sock(sk); + return (0); + } + + free_skb (skb, FREE_READ); + release_sock(sk); + return (0); + + default: + if (!tcp_sequence (sk, th, len, opt, saddr)) + { + free_skb (skb, FREE_READ); + release_sock(sk); + return (0); + } + + case TCP_SYN_SENT: + if (th->rst) + { + sk->err = ECONNREFUSED; + sk->state = TCP_CLOSE; + if (!sk->dead) + { + wake_up (sk->sleep); + } + free_skb (skb, FREE_READ); + release_sock(sk); + return (0); + } +/* if (opt->security != 0 || opt->compartment != 0 ) + { + sk->err = ECONNRESET; + sk->state = TCP_CLOSE; + tcp_reset (daddr, saddr, th, sk->prot, opt, dev); + if (!sk->dead) + { + wake_up (sk->sleep); + } + free_skb (skb, FREE_READ); + release_sock(sk); + return (0); + } */ + + if (!th->ack) + { + if (th->syn) + { + sk->state = TCP_SYN_RECV; + } + + free_skb (skb, FREE_READ); + release_sock(sk); + return (0); + } + + switch (sk->state) + { + case TCP_SYN_SENT: + if (!tcp_ack(sk, th, saddr)) + { + tcp_reset(daddr, saddr, th, sk->prot, opt,dev); + free_skb (skb, FREE_READ); + release_sock(sk); + return (0); + } + + /* if the syn bit is also set, switch to tcp_syn_recv, + and then to established. */ + + if (!th->syn) + { + free_skb (skb, FREE_READ); + release_sock (sk); + return (0); + } + + /* ack the syn and fall through. */ + sk->acked_seq = th->seq+1; + sk->fin_seq = th->seq; + tcp_send_ack (sk->send_seq, th->seq+1, sk, + th, sk->daddr); + + case TCP_SYN_RECV: + if (!tcp_ack(sk, th, saddr)) + { + tcp_reset(daddr, saddr, th, sk->prot, opt, dev); + free_skb (skb, FREE_READ); + release_sock(sk); + return (0); + } + + sk->state = TCP_ESTABLISHED; + /* now we need to finish filling out some of the tcp + header. */ + + /* we need to check for mtu info. */ + tcp_options(sk, th); + sk->dummy_th.dest = th->source; + sk->copied_seq = sk->acked_seq-1; + if (!sk->dead) + { + wake_up (sk->sleep); + } + + /* now process the rest like we were already in the established + state. */ + if (th->urg) + if (tcp_urg (sk, th, saddr)) + { + free_skb (skb, FREE_READ); + release_sock(sk); + return (0); + } + if (tcp_data (skb, sk, saddr, len)) + free_skb (skb, FREE_READ); + + if (th->fin) + tcp_fin(sk, th, saddr, dev); + + release_sock(sk); + return (0); + } + + if (th->urg) + { + if (tcp_urg (sk, th, saddr)) + { + free_skb (skb, FREE_READ); + release_sock (sk); + return (0); + } + } + + if (tcp_data (skb, sk, saddr, len)) + { + free_skb (skb, FREE_READ); + release_sock (sk); + return (0); + } + + if (!th->fin) + { + release_sock(sk); + return (0); + } + tcp_fin (sk, th, saddr, dev); + release_sock(sk); + return (0); + } +} + + +/* this routine sends a packet with an out of date sequence number. It + assumes the other end will try to ack it. */ + +static void +tcp_write_wakeup(volatile struct sock *sk) +{ + struct sk_buff *buff; + struct tcp_header *t1; + struct device *dev=NULL; + int tmp; + if (sk -> state != TCP_ESTABLISHED) return; + + buff=sk->prot->wmalloc(sk,MAX_ACK_SIZE,1); + /* no big loss. */ + if (buff == NULL) return; + + buff->mem_addr = buff; + buff->mem_len = MAX_ACK_SIZE; + buff->len=sizeof (struct tcp_header); + buff->free = 1; + buff->sk = sk; + PRINTK ("in tcp_write_wakeup\n"); + t1=(struct tcp_header *)(buff + 1); + + /* put in the ip_header and routing stuff. */ + tmp = sk->prot->build_header (buff, sk->saddr, sk->daddr, &dev, + IP_TCP, sk->opt, MAX_ACK_SIZE); + if (tmp < 0) + { + sk->prot->wfree(sk, buff->mem_addr, buff->mem_len); + return; + } + + buff->len += tmp; + t1 = (struct tcp_header *)((char *)t1 +tmp); + + memcpy (t1,(void *) &sk->dummy_th, sizeof (*t1)); + + /* use a previous sequence. This should cause the other end + to send an ack. */ + t1->seq = net32(sk->send_seq-1); + t1->ack = 1; + t1->res1= 0; + t1->res2= 0; + t1->rst = 0; + t1->urg = 0; + t1->psh = 0; + t1->fin = 0; + t1->syn = 0; + t1->ack_seq = net32(sk->acked_seq); + t1->window = net16(sk->prot->rspace(sk)); + t1->doff = sizeof (*t1)/4; + tcp_send_check (t1, sk->saddr, sk->daddr, sizeof (*t1), sk); + /* send it and free it. This will prevent the timer from + automatically being restarted. */ + sk->prot->queue_xmit(sk, dev, buff, 1); + +} + +struct proto tcp_prot = +{ + sock_wmalloc, + sock_rmalloc, + sock_wfree, + sock_rfree, + sock_rspace, + sock_wspace, + tcp_close, + tcp_read, + tcp_write, + NULL, + NULL, + ip_build_header, + tcp_connect, + tcp_accept, + ip_queue_xmit, + tcp_retransmit, + tcp_write_wakeup, + tcp_read_wakeup, + tcp_rcv, + tcp_select, + tcp_ioctl, + NULL, + 128, + 0, + {NULL,} +}; + + + + diff --git a/net/tcp/tcp.h b/net/tcp/tcp.h new file mode 100644 index 0000000..878ba03 --- /dev/null +++ b/net/tcp/tcp.h @@ -0,0 +1,133 @@ +/* tcp.h */ +/* + Copyright (C) 1992 Ross Biro + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + The Author may be reached as bir7@leland.stanford.edu or + C/O Department of Mathematics; Stanford University; Stanford, CA 94305 +*/ +#ifndef _TCP_TCP_H +#define _TCP_TCP_H + +struct tcp_header +{ + unsigned short source; + unsigned short dest; + unsigned long seq; + unsigned long ack_seq; + unsigned short res1:4, doff:4, fin:1, syn:1, rst:1, psh:1, + ack:1, urg:1,res2:2; + unsigned short window; + unsigned short check; + unsigned short urg_ptr; +}; + +enum { + TCP_ESTABLISHED=1, + TCP_SYN_SENT, + TCP_SYN_RECV, + TCP_CLOSING, /* not a valid state, just a seperator so we can use + < tcp_closing or > tcp_closing for checks. */ + TCP_FIN_WAIT1, + TCP_FIN_WAIT2, + TCP_TIME_WAIT, + TCP_CLOSE, + TCP_LAST_ACK, + TCP_LISTEN +}; + +#define MAX_SYN_SIZE 44 + sizeof (struct sk_buff) + MAX_HEADER +#define MAX_FIN_SIZE 40 + sizeof (struct sk_buff) + MAX_HEADER +#define MAX_ACK_SIZE 40 + sizeof (struct sk_buff) + MAX_HEADER +#define MAX_RESET_SIZE 40 + sizeof (struct sk_buff) + MAX_HEADER +#define MAX_WINDOW 12000 +#define MIN_WINDOW 2048 +#define MAX_ACK_BACKLOG 2 +#define MIN_WRITE_SPACE 2048 +#define TCP_WINDOW_DIFF 2048 + +#define TCP_RETR1 7 /* this is howmany retries it does + before it tries to figure out + if the gateway is down. */ + +#define TCP_RETR2 10 /* this should take between 3 and + ten minutes ( 1024 * rtt). */ + + +#define TCP_TIMEOUT_LEN 720000 /* should be about 2 hrs. */ +#define TCP_TIMEWAIT_LEN 6000 /* How long to wait to sucessfully + close the socket, about 60 seconds. */ +#define TCP_ACK_TIME 35 /* time to delay before sending an ack. */ +#define TCP_DONE_TIME 2500 /* maximum time to wait before actually destroying + a socket. */ +#define TCP_WRITE_TIME 100 /* initial time to wait for an ack, + after last transmit. */ +#define TCP_CONNECT_TIME 200 /* time to retransmit first syn. */ +#define TCP_SYN_RETRIES 30 /* number of times to retry openning a connection. + */ + +#define TCP_NO_CHECK 0 /* turn to one if you want the default to be no + checksum . */ + +void print_th (struct tcp_header *); +#define HEADER_SIZE 64 + + + /* this next routines deal with comparing 32 bit unsigned ints and + worry about wrap around. The general strategy is to do a normal + compare so long as neither of the numbers is within 4k of wrapping. + Otherwise we must check for the wrap. */ + + static inline int + before (unsigned long seq1, unsigned long seq2) + { + /* this inequality is strict. */ + if (seq1 == seq2) return (0); + if (seq1 < seq2) + { + if ((unsigned long)seq2-(unsigned long)seq1 < 32767UL) + { + return (1); + } + else + { + return (0); + } + } + /* now we know seq1 > seq2. So all we need to do is check to see + if seq1 has wrapped. */ + if (seq2 < 4096UL && seq1 > (0xffffffUL - 4096UL)) + { + return (1); + } + return (0); + + } + + static inline int + after (unsigned long seq1, unsigned long seq2) + { + return (before (seq2, seq1)); + } + + /* is s2<=s1<=s3 ? */ + static inline int + between (unsigned long seq1, unsigned long seq2, unsigned long seq3) + { + return (after (seq1+1, seq2) && before (seq1, seq3+1)); + } + +#endif diff --git a/net/tcp/timer.c b/net/tcp/timer.c new file mode 100644 index 0000000..fb0653f --- /dev/null +++ b/net/tcp/timer.c @@ -0,0 +1,301 @@ +/* timer.c */ +/* + Copyright (C) 1992 Ross Biro + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 1, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + The Author may be reached as bir7@leland.stanford.edu or + C/O Department of Mathematics; Stanford University; Stanford, CA 94305 + */ +#include <linux/types.h> +#include <linux/errno.h> +#include <linux/socket.h> +#include <netinet/in.h> +#include <linux/kernel.h> +#include <linux/sched.h> +#include <linux/timer.h> +#include <asm/system.h> +#include "timer.h" +#include "ip.h" +#include "tcp.h" +#include "sock.h" +#include "arp.h" +#include "../kern_sock.h" + +static struct timer *timer_base=NULL; +unsigned long seq_offset; + +void +delete_timer (struct timer *t) +{ + struct timer *tm; + PRINTK ("delete_timer (t=%X)\n",t); + if (timer_base == NULL) return; + cli(); + if (t == timer_base) + { + timer_base = t->next; + if (timer_base != NULL) + { + timer_table[NET_TIMER].expires = timer_base->when; + timer_active |= 1 << NET_TIMER; + } + else + { + timer_active &= ~(1 << NET_TIMER); + } + sti(); + return; + } + for (tm = timer_base;tm->next != NULL ;tm=tm->next) + { + if (tm->next == t) + { + tm->next = t->next; + sti(); + return; + } + } + sti(); +} + + +void +reset_timer (struct timer *t) +{ + struct timer *tm; + + delete_timer (t); + t->when = timer_seq + t->len; + PRINTK ("reset_timer (t=%X) when = %d jiffies = %d\n",t, t->when, jiffies); + if (t == NULL) + { + printk ("*** reset timer NULL timer\n"); + __asm__ ("\t int $3\n"::); + } + /* first see if it goes at the beginning. */ + cli(); + if (timer_base == NULL) + { + t->next = NULL; + timer_base = t; + timer_table[NET_TIMER].expires = t->when; + timer_active |= 1 << NET_TIMER; + sti(); + return; + } + if (before (t->when, timer_base->when)) + { + t->next = timer_base; + timer_base = t; + timer_table[NET_TIMER].expires = t->when; + timer_active |= 1 << NET_TIMER; + sti(); + return; + } + for (tm = timer_base; ; tm=tm->next) + { + if (tm->next == NULL || before (t->when,tm->next->when)) + { + t->next = tm->next; + tm->next = t; + sti(); + return; + } + } +} + +void +net_timer (void) +{ + volatile struct sock *sk; + + /* now we will only be called whenever we need to do something, but + we must be sure to process all of the sockets that need it. */ + + while (timer_base != NULL && after (timer_seq+1 ,timer_base->when)) + { + int why; + sk = timer_base->sk; + cli(); + if (sk->inuse) + { + sti(); + break; + } + sk->inuse = 1; + sti(); + PRINTK ("net_timer: found sk=%X\n",sk); + why = sk->timeout; + + if (sk->keepopen) + { + sk->time_wait.len = TCP_TIMEOUT_LEN; + sk->timeout = TIME_KEEPOPEN; + reset_timer (timer_base); + } + else + { + sk->timeout = 0; + delete_timer(timer_base); + } + + /* always see if we need to send an ack. */ + if (sk->ack_backlog) + { + sk->prot->read_wakeup(sk); + if (!sk->dead) wake_up (sk->sleep); + } + + /* now we need to figure out why the socket was on the timer. */ + switch (why) + { + + case TIME_DONE: + if (!sk->dead || sk->state != TCP_CLOSE) + { + printk ("non dead socket in time_done\n"); + release_sock (sk); + break; + } + destroy_sock (sk); + break; + + case TIME_DESTROY: /* we've waited for a while for all + the memory assosiated with the + socket to be freed. We need to + print an error message. */ + PRINTK ("possible memory leak. sk = %X\n", sk); + print_sk (sk); + reset_timer ((struct timer *)&sk->time_wait); + sk->inuse = 0; + break; + + case TIME_CLOSE: /* we've waited long enough, close the + socket. */ + + sk->state = TCP_CLOSE; + delete_timer ((struct timer *)&sk->time_wait); + /* kill the arp entry + in case the hardware has changed. */ + arp_destroy (sk->daddr); + if (!sk->dead) + wake_up (sk->sleep); + release_sock(sk); + break; + + case TIME_WRITE: /* try to retransmit. */ + if (sk->send_head != NULL) + { + sk->retransmits ++; + if (sk->retransmits > TCP_RETR1) + { + arp_destroy (sk->daddr); + ip_route_check (sk->daddr); + } + + if (sk->retransmits > TCP_RETR2) + { + sk->err = ETIMEDOUT; + arp_destroy (sk->daddr); + if (sk->state == TCP_FIN_WAIT1 || + sk->state == TCP_FIN_WAIT2 || + sk->state == TCP_LAST_ACK) + { + sk->state = TCP_TIME_WAIT; + sk->timeout = TIME_CLOSE; + sk->time_wait.len = TCP_TIMEWAIT_LEN; + reset_timer ((struct timer *)&sk->time_wait); + release_sock(sk); + break; + } + else /* sk->state == ... */ + { + sk->prot->close (sk,1); + break; + } + } + else /* sk->retransmites .. */ + { + sk->prot->retransmit (sk, 1); + release_sock (sk); + } + break; + } + /* if we have stuff which hasn't been written because the + window is too small, fall throught to TIME_KEEPOPEN */ + if (sk->wfront == NULL) + { + release_sock (sk); + break; + } + + /* this basically assumes tcp here. */ + /* exponential fall back. */ + sk->rtt *= 2; + sk->time_wait.len = sk->rtt*2; + sk->timeout = TIME_WRITE; + reset_timer ((struct timer *)&sk->time_wait); + + case TIME_KEEPOPEN: /* send something to keep the + connection open. */ + sk->retransmits ++; + if (sk->retransmits > TCP_RETR1) + { + arp_destroy (sk->daddr); + ip_route_check (sk->daddr); + + } + if (sk->retransmits > TCP_RETR2) + { + arp_destroy (sk->daddr); + sk->err = ETIMEDOUT; + if (sk->state == TCP_FIN_WAIT1 || + sk->state == TCP_FIN_WAIT2) + { + sk->state = TCP_TIME_WAIT; + if (!sk->dead) + wake_up (sk->sleep); + release_sock(sk); + } + else /* sk->state == */ + { + sk->prot->close (sk, 1); + } + break; + } + else /* sk->retransmits. */ + { + if (sk->prot->write_wakeup != NULL) + sk->prot->write_wakeup(sk); + release_sock (sk); + break; + } + + default: + release_sock(sk); + break; + } /* switch */ + } /* while (timer_base != ... */ + + /* Now we need to reset the timer. */ + if (timer_base != NULL) + { + timer_table[NET_TIMER].expires = timer_base->when; + timer_active |= 1 << NET_TIMER; + } +} + + diff --git a/net/tcp/timer.h b/net/tcp/timer.h new file mode 100644 index 0000000..c0bd9fe --- /dev/null +++ b/net/tcp/timer.h @@ -0,0 +1,41 @@ +/* timer.h */ +/* + Copyright (C) 1992 Ross Biro + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 1, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + The Author may be reached as bir7@leland.stanford.edu or + C/O Department of Mathematics; Stanford University; Stanford, CA 94305 +*/ +#ifndef _TCP_TIMER_H +#define _TCP_TIMER_H + +struct timer +{ + unsigned long len; + volatile struct sock *sk; + unsigned long when; + struct timer *next; +}; + + +void delete_timer (struct timer *); +void reset_timer (struct timer *); +void net_timer (void); + +#define SEQ_TICK 3 +#define timer_seq jiffies +extern unsigned long seq_offset; +#endif diff --git a/net/tcp/udp.c b/net/tcp/udp.c new file mode 100644 index 0000000..23529e0 --- /dev/null +++ b/net/tcp/udp.c @@ -0,0 +1,635 @@ +/* udp.c */ +/* + Copyright (C) 1992 Ross Biro + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + The Author may be reached as bir7@leland.stanford.edu or + C/O Department of Mathematics; Stanford University; Stanford, CA 94305 +*/ + +#include <linux/types.h> +#include <linux/sched.h> +#include <linux/fcntl.h> +#include <linux/socket.h> +#include <netinet/in.h> +#include "timer.h" +#include "ip.h" +#include "tcp.h" +#include "sock.h" +#include <linux/errno.h> +#include <linux/timer.h> +#include <asm/system.h> +#include <asm/segment.h> +#include "../kern_sock.h" /* for PRINTK */ +#include "udp.h" +#include "icmp.h" + +#define min(a,b) ((a)<(b)?(a):(b)) + +static void +print_uh(struct udp_header *uh) +{ + PRINTK("source = %d, dest = %d\n", net16(uh->source), net16(uh->dest)); + PRINTK("len = %d, check = %d\n", net16(uh->len), net16(uh->check)); +} + + +int +udp_select (volatile struct sock *sk, int sel_type, select_table *wait) +{ + select_wait(sk->sleep, wait); + switch (sel_type) + { + case SEL_IN: + if (sk->rqueue != NULL) + { + return (1); + } + return (0); + + case SEL_OUT: + if (sk->prot->wspace(sk) >= MIN_WRITE_SPACE) + { + return (1); + } + return (0); + + case SEL_EX: + if (sk->err) return (1); /* can this ever happen? */ + return (0); + } + return (0); +} + +/* this routine is called by the icmp module when it gets some + sort of error condition. If err < 0 then the socket should + be closed and the error returned to the user. If err > 0 + it's just the icmp type << 8 | icmp code. + header points to the first 8 bytes of the tcp header. We need + to find the appropriate port. */ + +void +udp_err (int err, unsigned char *header, unsigned long daddr, + unsigned long saddr, struct ip_protocol *protocol) +{ + struct tcp_header *th; + volatile struct sock *sk; + + th = (struct tcp_header *)header; + sk = get_sock (&udp_prot, net16(th->dest), saddr, th->source, daddr); + + if (sk == NULL) return; + if (err & 0xff00 == (ICMP_SOURCE_QUENCH << 8)) + { + if (sk->cong_window > 1) + sk->cong_window = sk->cong_window/2; + return; + } + + sk->err = icmp_err_convert[err & 0xff].errno; + if (icmp_err_convert[err & 0xff].fatal) + { + sk->prot->close(sk, 0); + } + + return; + +} + +static unsigned short +udp_check (struct udp_header *uh, int len, + unsigned long saddr, unsigned long daddr) +{ + unsigned long sum; + PRINTK ("udp_check (uh=%X, len = %d, saddr = %X, daddr = %X)\n", + uh, len, saddr, daddr); + + print_uh (uh); + + __asm__("\t addl %%ecx,%%ebx\n" + "\t adcl %%edx,%%ebx\n" + "\t adcl $0, %%ebx\n" + : "=b" (sum) + : "0" (daddr), "c" (saddr), "d" ((net16(len) << 16) + IP_UDP*256) + : "cx","bx","dx" ); + + if (len > 3) + { + __asm__( + "\tclc\n" + "1:\n" + "\t lodsl\n" + "\t adcl %%eax, %%ebx\n" + "\t loop 1b\n" + "\t adcl $0, %%ebx\n" + : "=b" (sum) , "=S" (uh) + : "0" (sum), "c" (len/4) ,"1" (uh) + : "ax", "cx", "bx", "si" ); + } + + /* convert from 32 bits to 16 bits. */ + __asm__( + "\t movl %%ebx, %%ecx\n" + "\t shrl $16,%%ecx\n" + "\t addw %%cx, %%bx\n" + "\t adcw $0, %%bx\n" + : "=b" (sum) + : "0" (sum) + : "bx", "cx"); + + + /* check for an extra word. */ + if ((len & 2) != 0) + { + __asm__("\t lodsw\n" + "\t addw %%ax,%%bx\n" + "\t adcw $0, %%bx\n" + : "=b" (sum), "=S" (uh) + : "0" (sum) ,"1" (uh) + : "si", "ax", "bx"); + } + + /* now check for the extra byte. */ + if ((len & 1) != 0) + { + __asm__("\t lodsb\n" + "\t movb $0,%%ah\n" + "\t addw %%ax,%%bx\n" + "\t adcw $0, %%bx\n" + : "=b" (sum) + : "0" (sum) ,"S" (uh) + : "si", "ax", "bx"); + } + /* we only want the bottom 16 bits, but we never cleared + the top 16. */ + return ((~sum) & 0xffff); +} + +static void +udp_send_check (struct udp_header *uh, unsigned long saddr, + unsigned long daddr, int len, volatile struct sock *sk) +{ + uh->check = 0; + if (sk && sk->no_check) return; + uh->check = udp_check (uh, len, saddr, daddr); +} + +static int +udp_loopback (volatile struct sock *sk, unsigned short port, + unsigned char *from, + int len, unsigned long daddr, unsigned long saddr) +{ + struct udp_header *uh; + struct sk_buff *skb; + volatile struct sock *pair; + sk->inuse = 1; + + PRINTK ("udp_loopback \n"); + + pair = get_sock (sk->prot, net16(port), saddr, + sk->dummy_th.source, daddr); + + if (pair == NULL) return (0); + + skb = pair->prot->rmalloc (pair, + sizeof (*skb) + sizeof (*uh) + len + 4, + 0); + + /* if we didn't get the memory, just drop the packet. */ + if (skb == NULL) return (len); + + skb->mem_addr = skb; + skb->mem_len = sizeof (*skb) + len + sizeof (*uh) + 4; + + skb->daddr = saddr; + skb->saddr = daddr; + + skb->len = len; + skb->h.raw = (unsigned char *)(skb+1); + + uh = skb->h.uh; + uh -> source = sk->dummy_th.source; + uh -> dest = port; + uh -> len = len + sizeof (*uh); + verify_area (from , len); + memcpy_fromfs(uh+1, from, len); + pair->inuse = 1; + if (pair->rqueue == NULL) + { + pair->rqueue = skb; + skb->next = skb; + skb->prev = skb; + } + else + { + skb->next = pair->rqueue; + skb->prev = pair->rqueue->prev; + skb->prev->next = skb; + skb->next->prev = skb; + } + wake_up (pair->sleep); + release_sock (pair); + release_sock (sk); + return (len); + +} + +static int +udp_sendto (volatile struct sock *sk, unsigned char *from, int len, + int noblock, + unsigned flags, struct sockaddr_in *usin, int addr_len) +{ + /* this should be easy, we just send the packet. */ + struct sk_buff *skb; + struct udp_header *uh; + unsigned char *buff; + unsigned long saddr; + int copied=0; + int amt; + struct device *dev=NULL; + struct sockaddr_in sin; + + /* check the flags. */ + if (flags) return (-EINVAL); + if (len < 0) return (-EINVAL); + if (len == 0) return (0); + + PRINTK ("sendto len = %d\n", len); + + /* get and verify the address. */ + if (usin) + { + if (addr_len < sizeof (sin)) + return (-EINVAL); + verify_area (usin, sizeof (sin)); + memcpy_fromfs (&sin, usin, sizeof(sin)); + if (sin.sin_family && + sin.sin_family != AF_INET) + return (-EINVAL); + if (sin.sin_port == 0) + return (-EINVAL); + } + else + { + if (sk->state != TCP_ESTABLISHED) + return (-EINVAL); + sin.sin_family = AF_INET; + sin.sin_port = sk->dummy_th.dest; + sin.sin_addr.s_addr = sk->daddr; + } + + /* check for a valid saddr. */ + saddr = sk->saddr; + if ((saddr & 0xff000000) == 0) + { + saddr = MY_IP_ADDR; + } + + /* if it's a broadcast, make sure we get it. */ + if ((sin.sin_addr.s_addr & 0xff000000) == 0) + { + int err; + err = udp_loopback (sk, sin.sin_port, from, len, + sin.sin_addr.s_addr, saddr); + if (err < 0) + return (err); + } + + sk->inuse = 1; + + while (len > 0) + { + int tmp; + skb = sk->prot->wmalloc (sk, len + sizeof (*skb) + + sk->prot->max_header, 0); + /* this should never happen, but it is possible. */ + + if (skb == NULL) + { + printk ("udp_sendto: write buffer full?\n"); + print_sk(sk); + release_sock (sk); + if (copied || !noblock) + return (copied); + return (-EAGAIN); + } + + skb->mem_addr = skb; + skb->mem_len = len + sizeof (*skb) + sk->prot->max_header; + skb->sk = sk; + skb->free = 1; + skb->arp = 0; + + /* now build the ip and dev header. */ + buff = (unsigned char *)(skb+1); + tmp = sk->prot->build_header (skb, saddr, + sin.sin_addr.s_addr, &dev, + IP_UDP, sk->opt, skb->mem_len); + if (tmp < 0 ) + { + sk->prot->wfree (sk, skb->mem_addr, skb->mem_len); + release_sock (sk); + return (tmp); + } + buff += tmp; + + /* we shouldn't do this, instead we should just + let the ip protocol fragment the packet. */ + amt = min (len + tmp + sizeof (*uh), dev->mtu); + + PRINTK ("amt = %d, dev = %X, dev->mtu = %d\n", + amt, dev, dev->mtu); + + skb->len = amt; + amt -= tmp; + + uh = (struct udp_header *)buff; + uh->len = net16(amt); + uh->source = sk->dummy_th.source; + uh->dest = sin.sin_port; + + amt -= sizeof (*uh); + buff += sizeof (*uh); + + verify_area (from, amt); + memcpy_fromfs( buff, from, amt); + + len -= amt; + copied += amt; + from += amt; + udp_send_check (uh, saddr, sin.sin_addr.s_addr, + amt+sizeof (*uh), sk); + + sk->prot->queue_xmit (sk, dev, skb, 1); + } + release_sock (sk); + return (copied); +} + +static int +udp_write (volatile struct sock *sk, unsigned char *buff, int len, int noblock, + unsigned flags) +{ + return (udp_sendto (sk, buff, len, noblock, flags, NULL, 0)); +} + +int +udp_recvfrom (volatile struct sock *sk, unsigned char *to, int len, + int noblock, + unsigned flags, struct sockaddr_in *sin, int *addr_len) +{ + /* this should be easy, if there is something there we + return it, otherwise we block. */ + int copied=0; + struct sk_buff *skb; + if (len == 0) return (0); + if (len < 0) return (-EINVAL); + if (addr_len) + { + verify_area (addr_len, sizeof(*addr_len)); + put_fs_long (sizeof (*sin), addr_len); + } + sk->inuse = 1; + while (sk->rqueue == NULL) + { + if (noblock) + { + release_sock (sk); + return (-EAGAIN); + } + release_sock (sk); + cli(); + if (sk->rqueue == NULL) + { + interruptible_sleep_on (sk->sleep); + if (current->signal & ~current->blocked) + { + return (-ERESTARTSYS); + } + } + sti(); + } + skb = sk->rqueue; + + if (!(flags & MSG_PEEK)) + { + if (skb->next == skb ) + { + sk->rqueue = NULL; + } + else + { + sk->rqueue = sk->rqueue ->next; + skb->prev->next = skb->next; + skb->next->prev = skb->prev; + } + } + copied = min (len, skb->len); + verify_area (to, copied); + memcpy_tofs (to, skb->h.raw + sizeof (struct udp_header), copied); + /* copy the address. */ + if (sin) + { + struct sockaddr_in addr; + addr.sin_family = AF_INET; + addr.sin_port = skb->h.uh->source; + addr.sin_addr.s_addr = skb->daddr; + verify_area (sin, sizeof (*sin)); + memcpy_tofs(sin, &addr, sizeof (*sin)); + } + + if (!(flags & MSG_PEEK)) + { + free_skb (skb, FREE_READ); + } + release_sock (sk); + return (copied); + +} + + +int +udp_read (volatile struct sock *sk, unsigned char *buff, int len, int noblock, + unsigned flags) +{ + return (udp_recvfrom (sk, buff, len, noblock, flags, NULL, NULL)); +} + +int +udp_connect (volatile struct sock *sk, struct sockaddr_in *usin, int addr_len) +{ + struct sockaddr_in sin; + if (addr_len < sizeof (sin)) return (-EINVAL); + verify_area (usin, sizeof (sin)); + memcpy_fromfs (&sin, usin, sizeof (sin)); + if (sin.sin_family && sin.sin_family != AF_INET) + return (-EAFNOSUPPORT); + sk->daddr = sin.sin_addr.s_addr; + sk->dummy_th.dest = sin.sin_port; + sk->state = TCP_ESTABLISHED; + return(0); +} + +static void +udp_close(volatile struct sock *sk, int timeout) +{ + sk->inuse = 1; + sk->state = TCP_CLOSE; + if (sk->dead) + destroy_sock (sk); + else + release_sock (sk); +} + +int +udp_rcv(struct sk_buff *skb, struct device *dev, struct options *opt, + unsigned long daddr, unsigned short len, + unsigned long saddr, int redo, struct ip_protocol *protocol) +{ + /* all we need to do is get the socket, and then do a checksum. */ + struct proto *prot=&udp_prot; + volatile struct sock *sk; + struct udp_header *uh; + + uh = (struct udp_header *) skb->h.uh; + + if (dev->add_arp) dev->add_arp (saddr, skb, dev); + + sk = get_sock (prot, net16(uh->dest), saddr, uh->source, daddr); + + /* if we don't know about the socket, forget about it. */ + if (sk == NULL && + (daddr & 0xff000000 != 0) && (daddr & 0xff000000 != 0xff000000)) + { + icmp_reply (skb, ICMP_DEST_UNREACH, ICMP_PORT_UNREACH, dev); + skb->sk = NULL; + free_skb (skb, 0); + return (0); + } + + + if (!redo) + { + if (uh->check && udp_check (uh, len, saddr, daddr)) + { + PRINTK ("bad udp checksum\n"); + skb->sk = NULL; + free_skb (skb, 0); + return (0); + } + + skb->sk = sk; + skb->dev = dev; + skb->len = len; + + /* these are supposed to be switched. */ + skb->daddr = saddr; + skb->saddr = daddr; + + /* Now deal with the in use. */ + cli(); + if (sk->inuse) + { + if (sk->back_log == NULL) + { + sk->back_log = skb; + skb->next = skb; + skb->prev = skb; + } + else + { + skb->next = sk->back_log; + skb->prev = sk->back_log->prev; + skb->prev->next = skb; + skb->next->prev = skb; + } + sti(); + return (0); + } + sk->inuse = 1; + sti(); + } + + /* charge it too the socket. */ + if (sk->rmem_alloc + skb->mem_len >= SK_RMEM_MAX) + { + skb->sk = NULL; + free_skb (skb, 0); + release_sock (sk); + return (0); + } + + sk->rmem_alloc += skb->mem_len; + + /* At this point we should print the thing out. */ + PRINTK ("<< \n"); + print_sk (sk); + + /* now add it to the data chain and wake things up. */ + if (sk->rqueue == NULL) + { + sk->rqueue = skb; + skb->next = skb; + skb->prev = skb; + } + else + { + skb->next = sk->rqueue; + skb->prev = sk->rqueue->prev; + skb->prev->next = skb; + skb->next->prev = skb; + } + + skb->len = len - sizeof (*uh); + + if (!sk->dead) + wake_up (sk->sleep); + + release_sock (sk); + return (0); +} + + + +struct proto udp_prot = +{ + sock_wmalloc, + sock_rmalloc, + sock_wfree, + sock_rfree, + sock_rspace, + sock_wspace, + udp_close, + udp_read, + udp_write, + udp_sendto, + udp_recvfrom, + ip_build_header, + udp_connect, + NULL, + ip_queue_xmit, + ip_retransmit, + NULL, + NULL, + udp_rcv, + udp_select, + NULL, + NULL, + 128, + 0, + {NULL,} +}; + diff --git a/net/tcp/udp.h b/net/tcp/udp.h new file mode 100644 index 0000000..646926e --- /dev/null +++ b/net/tcp/udp.h @@ -0,0 +1,36 @@ +/* udp.h */ +/* + Copyright (C) 1992 Ross Biro + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + The Author may be reached as bir7@leland.stanford.edu or + C/O Department of Mathematics; Stanford University; Stanford, CA 94305 +*/ +#ifndef _TCP_UDP_H +#define _TCP_UDP_H + +struct udp_header +{ + unsigned short source; + unsigned short dest; + unsigned short len; + unsigned short check; +}; + +extern struct proto udp_prot; +#define UDP_NO_CHECK 1 + +#endif diff --git a/net/tcp/we.c b/net/tcp/we.c new file mode 100644 index 0000000..58b8208 --- /dev/null +++ b/net/tcp/we.c @@ -0,0 +1,679 @@ +/* we.c an wd8003 and wd8013 ethernet driver for linux. */ +/* + Copyright (C) 1992 Ross Biro + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + The Author may be reached as bir7@leland.stanford.edu or + C/O Department of Mathematics; Stanford University; Stanford, CA 94305 +*/ +/* The bsd386 version was used as an example in order to write this + code */ + +/* + The driver was significantly modified by Bob Harris to allow the + software to operate with either the wd8003 or wd8013 boards. The + wd8013 boards will operate using full memory on board (as specified + by the user in Space.c) and the 16 bit wide interface. The driver + will autodetect which board it is using on boot (i.e. "using 16 bit I/F"). + In addition, the interrupts structure was significantly modified to + respond to all the chips interrupts and to keep track of statistics. + The statistics are not currently used. Debug messages can be toggled + by setting the wd_debug variable to a non-zero number. The driver + can detect an open or shorted cable - the wd8013 board functions after + the problem is corrected, but the wd8003 board does not always recover. + The driver is gradually being migrated toward the National Semiconductor + recommendations. Constructive comments or suggestions can be sent to: + + Bob Harris, rth@sparta.com + 7926 Jones Branch Drive, Suite 900 + McLean, Va. 22102 +*/ +/* Note: My driver was full of bugs. Basically if it works, credit + Bob Harris. If it's broken blame me. -RAB */ + +#include <linux/config.h> +#include <linux/kernel.h> +#include <linux/sched.h> +#include <linux/fs.h> +#include <linux/tty.h> +#include <linux/types.h> +#include <linux/ptrace.h> +#include <asm/system.h> +#include <asm/segment.h> +#include <asm/io.h> +#include <asm/memory.h> +#include <errno.h> +#include <linux/fcntl.h> +#include <netinet/in.h> + +#include "dev.h" +#include "eth.h" +#include "timer.h" +#include "ip.h" +#include "tcp.h" +#include "sock.h" +#include "arp.h" + +#include "wereg.h" + +static unsigned char interrupt_mask; +/* format of status byte. + bit + 0 start + 1 open + 2 transmitter in use */ + +#define START 1 +#define OPEN 2 +#define TRS_BUSY 0x400 +#define IN_INT 8 + +/* We need to get rid of all these statics and move them into the + device structure that way we can have more than one wd8003 board + in the system at once. */ + +static volatile unsigned int status; + +static struct enet_statistics stats; /* Statistics collection */ +static unsigned char max_pages; /* Board memory/256 */ +static unsigned char wd_debug = 0; /* turns on/off debug messages */ +static unsigned char dconfig = WD_DCONFIG; /* default data configuration */ +static int tx_aborted = 0; /* Empties tx bit bucket */ + +static int +max(int a, int b) +{ + if (a>b) return (a); + return (b); +} + +static void +wd_start(struct device *dev) +{ + unsigned char cmd; + interrupt_mask=RECV_MASK|TRANS_MASK; + cli(); + cmd = inb_p(WD_COMM); + cmd &= ~(CSTOP|CPAGE); + cmd |= CSTART; + outb_p(cmd, WD_COMM); + outb_p(interrupt_mask,WD_IMR); + sti(); + status |= START; +} + +int +wd8003_open(struct device *dev) +{ + unsigned char cmd; + int i; + /* we probably don't want to be interrupted here. */ + cli(); + /* This section of code is mostly copied from the bsd driver which is + mostly copied from somewhere else. */ + /* The somewhere else is probably the cmwymr(sp?) dos packet driver */ + + cmd=inb_p(WD_COMM); + cmd|=CSTOP; + cmd &= ~(CSTART|CPAGE); + outb_p(cmd, WD_COMM); + outb_p(0, WD_IMR); + sti(); + outb_p( dconfig,WD_DCR); + /*Zero the remote byte count. */ + outb_p(0, WD_RBY0); + outb_p(0, WD_RBY1); + outb_p(WD_MCONFIG,WD_RCC); + outb_p(WD_TCONFIG,WD_TRC); + outb_p(0,WD_TRPG); /* Set the transmit page start = 0 */ + outb_p( max_pages,WD_PSTOP); /* (read) page stop = top of board memory */ + outb_p(WD_TXBS,WD_PSTRT); /* (read) page start = cur = bnd = top of tx memory */ + outb_p(WD_TXBS,WD_BNDR); + /* clear interrupt status. */ + outb_p(0xff,WD_ISR); + /* we don't want no stinking interrupts. */ + outb_p(0 ,WD_IMR); + cmd|=1<<CPAGE_SHIFT; + outb_p(cmd,WD_COMM); + /* set the ether address. */ + for (i=0; i < ETHER_ADDR_LEN; i++) + { + outb_p(dev->dev_addr[i],WD_PAR0+i); + } + /* National recommends setting the boundry < current page register */ + outb_p(WD_TXBS+1,WD_CUR); /* Set the current page = page start + 1 */ + /* set the multicast address. */ + for (i=0; i < ETHER_ADDR_LEN; i++) + { + outb_p(dev->broadcast[i],WD_MAR0+i); + } + + cmd&=~(CPAGE|CRDMA); + cmd|= 4<<CRDMA_SHIFT; + outb_p(cmd, WD_COMM); + outb_p(WD_RCONFIG,WD_RCC); + status = OPEN; + wd_start(dev); + return (0); +} + +/* This routine just calls the ether rcv_int. */ +static int +wdget(struct wd_ring *ring, struct device *dev) +{ + unsigned char *fptr; + unsigned long len; + fptr = (unsigned char *)(ring +1); + len = ring->count-4; + return (dev_rint(fptr, len, 0, dev)); +} + +int +wd8003_start_xmit(struct sk_buff *skb, struct device *dev) +{ + unsigned char cmd; + int len; + cli(); + if (status & TRS_BUSY) + { + /* put in a time out. */ + if (jiffies - dev->trans_start < 30) + return (1); + printk ("wd8003 transmit timed out. \n"); + } + status |= TRS_BUSY; + sti(); + + if (!skb->arp) + { + if ( dev->rebuild_header (skb+1, dev)) + { + skb->dev = dev; + arp_queue (skb); + status &= ~TRS_BUSY; + return (0); + } + } + + memcpy ((unsigned char *)dev->mem_start, skb+1, skb->len); + + len = skb->len; + + /* now we need to set up the card info. */ + dev->trans_start = jiffies; + len=max(len, ETHER_MIN_LEN); /* actually we should zero out + the extra memory. */ +/* printk ("start_xmit len - %d\n", len);*/ + cli(); + cmd=inb_p(WD_COMM); + cmd &= ~CPAGE; + outb_p(cmd, WD_COMM); + + interrupt_mask |= TRANS_MASK; + if (!(status & IN_INT)) + outb (interrupt_mask, WD_IMR); + + outb_p(len&0xff,WD_TB0); + outb_p(len>>8,WD_TB1); + cmd |= CTRANS; + outb_p(cmd,WD_COMM); + sti(); + + if (skb->free) + { + free_skb (skb, FREE_WRITE); + } + + return (0); +} + +/* tell the card about the new boundary. */ + +static void +wd_put_bnd(unsigned char bnd, struct device *dev ) +{ + + unsigned char cmd; + + /* Ensure page 0 selected */ + cmd = inb_p( CR ); + if (cmd & 0x40) { + outb_p(cmd & (~CPAGE1), WD_COMM); /* select page 0 */ + outb_p(bnd, WD_BNDR); + outb_p(cmd | CPAGE1, WD_COMM); /* reselect page 1 */ + } else { + outb_p(bnd, WD_BNDR); + } +} + +static unsigned char +wd_get_bnd( struct device *dev ) +{ + + unsigned char cmd, bnd; + + /* Ensure page 0 selected */ + cmd = inb_p(WD_COMM); + if (cmd & 0x40) { + outb_p(cmd & (~CPAGE1), WD_COMM); /* select page 0 */ + bnd = inb_p(WD_BNDR); + outb_p(cmd | CPAGE1, WD_COMM); /* reselect page 1 */ + return (bnd); + } else { + return (inb_p(WD_BNDR)); + } +} + +static unsigned char +wd_get_cur( struct device *dev ) +{ + + unsigned char cmd, cur; + + /* Ensure page 1 selected */ + cmd = inb_p(WD_COMM); + if (cmd & 0x40) { + return (inb_p(WD_CUR)); + } else { + outb_p(cmd | CPAGE1, WD_COMM); /* select page 1 */ + cur = inb_p(WD_CUR); + outb_p(cmd & (~CPAGE1), WD_COMM); /* reselect page 0 */ + return (cur); + } +} + +/* This routine handles the packet recieved interrupt. */ +/* Debug routines slow things down, but reveal bugs... */ +/* Modified Boundry Page Register to follow Current Page */ + +static void +wd_rcv( struct device *dev ) +{ + + unsigned char pkt; /* Next packet page start */ + unsigned char bnd; /* Last packet page end */ + unsigned char cur; /* Future packet page start */ + unsigned char cmd; /* Command register save */ + struct wd_ring *ring; + int done=0; + + /* Calculate next packet location */ + cur = wd_get_cur( dev ); + bnd = wd_get_bnd( dev ); + if( (pkt = bnd + 1) == max_pages ) + pkt = WD_TXBS; + + while( done != 1) + { + if (pkt != cur) + { + + /* Position pointer to packet in card ring buffer */ + ring = (struct wd_ring *) (dev->mem_start + (pkt << 8)); + + /* Ensure a valid packet */ + if( ring->status & 1 ) + { + /* Too small and too big packets are + filtered by the board */ + if( wd_debug ) + printk("\nwd8013 - wdget: bnd = %d, pkt = %d, " + "cur = %d, status = %d, len = %d, next = %d", + bnd, pkt, cur, ring->status, ring->count, + ring->next); + + stats.rx_packets++; /* count all receives */ + done = wdget( ring, dev ); /* get the packet */ + + /* see if we need to process this packet again. */ + if (done == -1) continue; + + /* Calculate next packet location */ + pkt = ring->next; + + /* Compute new boundry - tell the chip */ + if( (bnd = pkt - 1) < WD_TXBS ) + bnd = max_pages - 1; + wd_put_bnd(bnd, dev); + + /* update our copy of cur. */ + cur = wd_get_cur(dev); + } + else + { /* Bad packet in ring buffer - + should not happen due to hardware filtering */ + printk("wd8013 - bad packet: len = %d, status = x%x, " + "bnd = %d, pkt = %d, cur = %d\n" + "trashing receive buffer!", + ring->count, ring->status, bnd, pkt, + cur); + /* Reset bnd = cur-1 */ + if( ( bnd = wd_get_cur( dev ) - 1 ) < WD_TXBS ) + bnd = max_pages - 1; + wd_put_bnd( bnd, dev ); + break; /* return */ + } + + } + else + { + done = dev_rint(NULL, 0,0, dev); + } + } + + /* reset to page 0 */ + cmd = inb_p(WD_COMM); + if (cmd & 0x40) + { + outb_p(cmd & ~(CPAGE1), WD_COMM); /* select page 0 */ + } +} + +/* This routine handles the interrupt case of receiver overruns */ + +static void +wd_rx_over( struct device *dev ) +{ + unsigned char cmd, dummy; + + /* Nothing actually has been overwritten */ + /* the chip has stopped at the boundry */ + /* but we must get it going again - according to National Semiconductor */ + printk ("wd_rx_over\n"); + cmd = inb_p( CR ); /* get current command register */ + cmd = (cmd&~(STA|PS0|PS1))|STOP; /* toggle start and stop bits, select page 0 */ + outb_p( cmd, CR ); + dummy = inb_p( RBCR0 ); /* required to detect reset status */ + dummy = inb_p( RBCR1 ); + wd_rcv( dev ); /* clear out received packets */ + + if( inb_p( ISR ) & PRX ) + outb_p( PRX, ISR ); /* acknowledge RX interrupt */ + while( ( inb_p( ISR ) & RST ) == 0 ); /* wait for reset to be completed */ + outb_p( RST, ISR ); /* acknowledge RST interrupt */ + outb_p( (cmd&~STOP)|STA, CR ); /* Start NIC */ + outb_p( WD_TCONFIG, TCR ); /* resume normal mode */ +} + +/* + * This get's the transmit interrupts. It assumes command page 0 is set, and + * returns with command page 0 set. + */ + +static void +wd_trs( struct device *dev ) +{ + unsigned char cmd, errors; + int len; + + if( wd_debug ) + printk("\nwd_trs() - TX complete, status = x%x", inb_p(TSR)); + + if( ( errors = inb_p( TSR ) & PTXOK ) || tx_aborted ){ + if( (errors&~0x02) == 0 ){ + stats.tx_packets++; + tx_aborted = 0; + } + + /* attempt to start a new transmission. */ + len = dev_tint( (unsigned char *)dev->mem_start, dev ); + if( len != 0 ){ + len=max(len, ETHER_MIN_LEN); + cmd=inb_p(WD_COMM); + outb_p(len&0xff,WD_TB0); + outb_p(len>>8,WD_TB1); + cmd |= CTRANS; + outb_p(cmd,WD_COMM); + interrupt_mask |= TRANS_MASK; + } + else + { + status &= ~TRS_BUSY; + interrupt_mask &= ~TRANS_MASK; + return; + } + } + else{ /* TX error occurred! - H/W will reschedule */ + if( errors & CRS ){ + stats.tx_carrier_errors++; + printk("\nwd8013 - network cable short!"); + } + if (errors & COL ) + stats.collisions += inb_p( NCR ); + if (errors & CDH ) + stats.tx_heartbeat_errors++; + if (errors & OWC ) + stats.tx_window_errors++; + } +} + +void +wd8003_interrupt(int reg_ptr) +{ + unsigned char cmd; + unsigned char errors; + unsigned char isr; + struct device *dev; + struct pt_regs *ptr; + int irq; + int count = 0; + + ptr = (struct pt_regs *)reg_ptr; + irq = -(ptr->orig_eax+2); + for (dev = dev_base; dev != NULL; dev = dev->next) + { + if (dev->irq == irq) break; + } + if (dev == NULL) + { + printk ("we.c: irq %d for unknown device\n", irq); + return; + } + sti(); /* this could take a long time, we should have interrupts on. */ + + cmd = inb_p( CR );/* Select page 0 */ + if( cmd & (PS0|PS1 ) ){ + cmd &= ~(PS0|PS1); + outb_p(cmd, CR ); + } + + if (wd_debug) + printk("\nwd8013 - interrupt isr = x%x", inb_p( ISR ) ); + + status |= IN_INT; + + do{ /* find out who called */ + + /* Check for overrunning receive buffer first */ + if ( ( isr = inb_p( ISR ) ) & OVW ) { /* Receiver overwrite warning */ + stats.rx_over_errors++; + if( wd_debug ) + printk("\nwd8013 overrun bnd = %d, cur = %d", wd_get_bnd( dev ), wd_get_cur( dev ) ); + wd_rx_over( dev ); /* performs wd_rcv() as well */ + outb_p( OVW, ISR ); /* acknowledge interrupt */ + } + else if ( isr & PRX ) { /* got a packet. */ + wd_rcv( dev ); + outb_p( PRX, ISR ); /* acknowledge interrupt */ + } + /* This completes rx processing... whats next */ + + if ( inb_p( ISR ) & PTX ) { /* finished sending a packet. */ + wd_trs( dev ); + outb_p( PTX, ISR ); /* acknowledge interrupt */ + } + + if (inb_p( ISR ) & RXE ) { /* recieve error */ + stats.rx_errors++; /* general errors */ + errors = inb_p( RSR ); /* detailed errors */ + if (errors & CRC ) + stats.rx_crc_errors++; + if (errors & FAE ) + stats.rx_frame_errors++; + if (errors & FO ) + stats.rx_fifo_errors++; + if (errors & MPA ) + stats.rx_missed_errors++; + outb_p( RXE, ISR ); /* acknowledge interrupt */ + } + + if (inb_p( ISR ) & TXE ) { /* transmit aborted! */ + stats.tx_errors++; /* general errors */ + errors = inb_p( TSR ); /* get detailed errors */ + if (errors & ABT ){ + stats.tx_aborted_errors++; + printk("\nwd8013 - network cable open!"); + } + if (errors & FU ) + stats.tx_fifo_errors++; + printk("\nwd8013 - TX FIFO underrun!"); + + /* Cannot do anymore - empty the bit bucket */ + tx_aborted = 1; + wd_trs( dev ); + tx_aborted = 0; + + outb_p( TXE, ISR ); /* acknowledge interrupt */ + } + + if( inb_p( ISR ) & CNTE ){ /* Tally counters overflowing */ + errors = inb_p( CNTR0 ); + errors = inb_p( CNTR1 ); + errors = inb_p( CNTR2 ); + outb_p( CNTE, ISR ); /* acknowledge interrupt */ + } + if( inb_p( ISR ) & RST ) /* Reset has been performed */ + outb_p( RST, ISR ); /* acknowledge interrupt */ + + if( wd_debug ){ + if( ( isr = inb_p( ISR ) ) != 0 ) + printk("\nwd8013 - ISR not cleared = x%x", isr ); + } + if( ++count > max_pages + 1 ){ + printk("\nwd8013_interrupt - infinite loop detected, isr = x%x, count = %d", isr, count ); + } + + } while( inb_p( ISR ) != 0 ); + + status &= ~IN_INT; +} + + +static struct sigaction wd8003_sigaction = +{ + wd8003_interrupt, + 0, + 0, + NULL +}; + +void +wd8003_init(struct device *dev) +{ + unsigned char csum; + int i; + csum = 0; + for (i = 0; i < 8; i++) + { + csum += inb_p(WD_ROM+i); + } + if (csum != WD_CHECK) + { + printk ("Warning WD8013 board not found at i/o = %X.\n",dev->base_addr); + + /* make sure no one can attempt to open the device. */ + status = OPEN; + return; + } + printk("wd8013"); + /* initialize the rest of the device structure. */ + dev->mtu = 1500; /* eth_mtu */ + dev->hard_start_xmit = wd8003_start_xmit; + dev->open = wd8003_open; + dev->hard_header = eth_hard_header; + dev->add_arp = eth_add_arp; + dev->type_trans = eth_type_trans; + dev->hard_header_len = sizeof (struct enet_header); + dev->addr_len = ETHER_ADDR_LEN; + dev->type = ETHER_TYPE; + dev->queue_xmit = dev_queue_xmit; + dev->rebuild_header = eth_rebuild_header; + for (i = 0; i < DEV_NUMBUFFS; i++) + dev->buffs[i] = NULL; + +#ifndef FORCE_8BIT + /* check for 16 bit board - it doesn't have register 0/8 aliasing */ + for (i = 0; i < 8; i++) { + if( inb_p( EN_SAPROM+i ) != inb_p( EN_CMD+i) ){ + csum = inb_p( EN_REG1 ); /* fiddle with 16bit bit */ + outb( csum ^ BUS16, EN_REG1 ); /* attempt to clear 16bit bit */ + if( (csum & BUS16) == (inb_p( EN_REG1 ) & BUS16) ) { + printk(", using 16 bit I/F "); + dconfig |= 1; /* use word mode of operation */ + outb_p( LAN16ENABLE|MEMMASK, EN_REG5); + outb( csum , EN_REG1 ); + break; /* We have a 16bit board here! */ + } + outb( csum , EN_REG1 ); + } + } +#endif /* FORCE_8BIT */ + + /* mapin the interface memory. */ + outb_p(WD_IMEM,WD_CTL); + + /* clear the interface memory */ + for (i = dev->mem_start; i < dev->mem_end; i++) + { + *((unsigned char *)i) = 0; + if (*((unsigned char *)i) != 0) + { + printk ("WD Memory error.\n"); + if( (i - dev->mem_start) > 4096 ) + break; + else + status = OPEN; + } + } + /* Calculate how many pages of memory on board */ + max_pages = ( i - dev->mem_start )/256; + + /* need to set up the dev->mem_end and dev->rmem_end */ + dev->rmem_end = i; + dev->mem_end = i; + + /* print the initialization message, and the + ethernet address. */ + printk (", %d pages memory, ethernet Address: ", max_pages ); + for (i = 0; i <ETHER_ADDR_LEN; i++) + { + dev->dev_addr[i]=inb_p(WD_ROM+i); + dev->broadcast[i]=0xff; + printk ("%2.2X ",dev->dev_addr[i]); + } + + /* Clear the statistics */ + for( i = 0; i < sizeof( struct enet_statistics ); i++ ) + ((char *)&stats)[i] = 0; + + printk ("\n"); + status = 0; + + if (irqaction (dev->irq, &wd8003_sigaction)) + { + printk ("Unable to get IRQ%d for wd8013 board\n", dev->irq); + } +} diff --git a/net/tcp/wereg.h b/net/tcp/wereg.h new file mode 100644 index 0000000..6a7df89 --- /dev/null +++ b/net/tcp/wereg.h @@ -0,0 +1,478 @@ +/* wereg.h */ +/* + Copyright (C) 1992 Ross Biro + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 1, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + The Author may be reached as bir7@leland.stanford.edu or + C/O Department of Mathematics; Stanford University; Stanford, CA 94305 +*/ +/* This is based on if_wereg.h from bsd386 */ + +/* Uncomment the next line if you are having troubles with your + 8 bit card being recognized as 16 bit. */ +/* #define FORCE_8BIT */ + +struct wd_ring +{ + unsigned char status; /* status */ + /* format of status + bit + 0 packet ok + 1 crc error + 2 frame alignment error + 3 fifo overrun + */ +#define STRECVD 0xf1 + unsigned char next; /* pointer to next packet. */ + unsigned short count; /*packet lenght in bytes + 4 */ +}; + +/* Format of command register. + bits + 0 stop + 1 start + 2 transmit packet + 3-5 Remote DMA command + 6-7 Page Select */ + +#define CSTOP 0x1 +#define CSTART 0x2 +#define CTRANS 0x4 +#define CRDMA 0x38 +#define CRDMA_SHIFT 3 +#define CPAGE 0xc0 +#define CPAGE_SHIFT 6 + +#define CPAGE1 0x40 + + +#define CPAGE1 0x40 + +/* interrupt status defenitions + bits + 0 Recv. + 1 Transmit + 2 RcvErr + 3 Transmit Err + 4 Overwrite warning + 5 Counter overflow + 6 Remote DMA complete + 7 Reset Status */ + +#define IRCV 0x1 +#define ITRS 0x2 +#define IRCE 0x4 +#define ITRE 0x8 +#define IOVER 0x10 +#define ICOUNTERS 0x20 +#define IDMA 0x40 +#define IRESET 0x80 +#define IOVER 0x10 +#define ICOUNTERS 0x20 +#define IDMA 0x40 +#define IRESET 0x80 + +/* transmit status format + bits + 0 Packet transmitted ok. + 1 Non Deferred transmition + 2 Transmit collied + 3 Transmit aborted + 4 Carrier Sense Lost + 5 Fifo Underrun + 6 CD Heartbeat + 7 Out of Window Collision */ + +#define TROK 0x1 +#define TRAB 0x4 + +/* Some ID stuff */ +#define WD_ID1 0x03 +#define WD_ID2 0x05 +#define WD_CHECK 0xff +#define WD_PAGE 256 /* page size in bytes. */ +#define WD_TXBS 6 /* size of transmit buffer in pages. */ +#define WD_MAX_PAGES 32 /* Number of pages off ram on card (8k) */ +#define WD_NIC 16 /* i/o base offset to NIC */ + +/* Some configuration stuff. */ +/* where the memory is mapped in. */ +#define WD_MEM (dev->mem_start) +#define WD_BUFFEND (dev->mem_end) +#define WD_MEMSIZE (WD_BUFFEND-WD_MEM) +#define WD_BASE (dev->base_addr) + +#define TRANS_MASK 0xa +#define RECV_MASK 0x5 +#define WD_DCONFIG 0x48 +#define WD_RCONFIG 0x4 +#define WD_MCONFIG 0x20 +#define WD_TCONFIG 0x0 +#define WD_IMEM (((WD_MEM>>13) & 0x3f)|0x40) + +/* WD registers. */ +#define WD_ROM (WD_BASE+8) +#define WD_CTL (WD_BASE+0) + +/* WD NIC register offsets */ +#define WD_COMM (WD_BASE+WD_NIC+0x00) /* command register */ +#define WD_PSTRT (WD_BASE+WD_NIC+0x01) /* page start register */ +#define WD_PSTOP (WD_BASE+WD_NIC+0x02) /* page stop register */ +#define WD_BNDR (WD_BASE+WD_NIC+0x03) /* Boundary Pointer */ +#define WD_TRST (WD_BASE+WD_NIC+0x04) /* Transmit Status */ +#define WD_TRPG (WD_BASE+WD_NIC+0x04) /* Transmit Page */ +#define WD_TB0 (WD_BASE+WD_NIC+0x05) /* Transmit byte count, low */ +#define WD_TB1 (WD_BASE+WD_NIC+0x06) /* Transmit byte count, high */ +#define WD_ISR (WD_BASE+WD_NIC+0x07) /* Interrupt status register */ +#define WD_RBY0 (WD_BASE+WD_NIC+0x0a) /* remote byte count low. */ +#define WD_RBY1 (WD_BASE+WD_NIC+0x0b) /* remote byte count high. */ +#define WD_RCC (WD_BASE+WD_NIC+0x0c) /* receive configuration */ +#define WD_TRC (WD_BASE+WD_NIC+0x0d) /* transmit configuration */ +#define WD_DCR (WD_BASE+WD_NIC+0x0e) /* data configuration */ +#define WD_IMR (WD_BASE+WD_NIC+0x0f) /* Interrupt Mask register. */ +#define WD_PAR0 (WD_BASE+WD_NIC+0x01) +#define WD_CUR (WD_BASE+WD_NIC+0x07) +#define WD_MAR0 (WD_BASE+WD_NIC+0x08) + +/* rth additions */ + +#define EN_CMD (WD_BASE+0) +#define EN_REG1 (WD_BASE+1) +#define EN_REG5 (WD_BASE+5) +#define EN_SAPROM (WD_BASE+8) +#define EN_REGE (WD_BASE+0x0e) +#define EN_OFFSET 16 + +/* WD Commands for EN_CMD */ +#define EN_RESET +#define EN_MEMEN 0x40 +#define EN_MEM_MASK 0x3f + +/* WD Bus Register bits */ +#define BUS16 1 + +/* WD REG5 Commands */ +#define MEM16ENABLE 0x80 +#define LAN16ENABLE 0x40 +#define MEMMASK 0x1f +#define BIT19 0x1 + +/* Memory test pattern to use */ +#define TESTPATTERN 0x5a + +/* Western Digital Additional Registers */ + +/* National Semiconductor Definitions */ + +/* Page 0 */ +#define CR (WD_BASE+WD_NIC+0) /* RW - Command */ +#define CLDA0 (WD_BASE+WD_NIC+1) /* R - Current Local DMA Address 0 */ +#define PSTART (WD_BASE+WD_NIC+1) /* W - Page Start Register */ +#define CLDA1 (WD_BASE+WD_NIC+2) /* R - Current Local DMA Address 1 */ +#define PSTOP (WD_BASE+WD_NIC+2) /* W - Page Stop Register */ +#define BNRY (WD_BASE+WD_NIC+3) /* RW - Boundry Pointer */ +#define TSR (WD_BASE+WD_NIC+4) /* R - Transmit Status Register */ +#define TPSR (WD_BASE+WD_NIC+4) /* W - Transmit Page Start */ +#define NCR (WD_BASE+WD_NIC+5) /* R - Number of Collisions */ +#define TBCR0 (WD_BASE+WD_NIC+5) /* W - Transmit Byte Count 0 */ +#define FIFO (WD_BASE+WD_NIC+6) /* R - FIFO */ +#define TBCR1 (WD_BASE+WD_NIC+6) /* W - Transmit Byte Count 1 */ +#define ISR (WD_BASE+WD_NIC+7) /* RW - Interrupt Status Register */ +#define CRDA0 (WD_BASE+WD_NIC+8) /* R - Current Remote DMA Address 0 */ +#define RSAR0 (WD_BASE+WD_NIC+8) /* W - Remote Start Address 0 */ +#define CRDA1 (WD_BASE+WD_NIC+9) /* R - Current Remote DMA Address 1 */ +#define RSAR1 (WD_BASE+WD_NIC+9) /* W - Remote Start Address 1 */ + /* R - Reserved */ +#define RBCR0 (WD_BASE+WD_NIC+0x0a) /* W - Remote Byte Count 0 */ + /* R - Reserved */ +#define RBCR1 (WD_BASE+WD_NIC+0x0b) /* W - Remote Byte Count 1 */ +#define RSR (WD_BASE+WD_NIC+0x0c) /* R - Receive Status Register */ +#define RCR (WD_BASE+WD_NIC+0x0c) /* W - Receive Configuration */ +#define CNTR0 (WD_BASE+WD_NIC+0x0d) /* R - Frame Alignment Errors 0 */ +#define TCR (WD_BASE+WD_NIC+0x0d) /* W - Transmit Configuration */ +#define CNTR1 (WD_BASE+WD_NIC+0x0e) /* R - Frame Alignment Errors 1 */ +#define DCR (WD_BASE+WD_NIC+0x0e) /* W - Data Configuration */ +#define CNTR2 (WD_BASE+WD_NIC+0x0f) /* R - Missed Packet Errors */ +#define IMR (WD_BASE+WD_NIC+0x0f) /* W - Interrupt Mask Register */ + +/* Page 1 */ + /* RW - Command */ +#define PAR0 (WD_BASE+WD_NIC+0x01) /* RW - Physical Address 0 */ +#define PAR1 (WD_BASE+WD_NIC+0x02) /* RW - Physical Address 1 */ +#define PAR2 (WD_BASE+WD_NIC+0x03) /* RW - Physical Address 2 */ +#define PAR3 (WD_BASE+WD_NIC+0x04) /* RW - Physical Address 3 */ +#define PAR4 (WD_BASE+WD_NIC+0x04) /* RW - Physical Address 4 */ +#define PAR5 (WD_BASE+WD_NIC+0x05) /* RW - Physical Address 5 */ +#define PAR6 (WD_BASE+WD_NIC+0x06) /* RW - Physical Address 6 */ +#define CURR (WD_BASE+WD_NIC+0x07) /* RW - Current Page */ +#define MAR0 (WD_BASE+WD_NIC+0x08) /* RW - Multicast Address 0 */ +#define MAR1 (WD_BASE+WD_NIC+0x09) /* RW - Multicast Address 1 */ +#define MAR2 (WD_BASE+WD_NIC+0x0a) /* RW - Multicast Address 2 */ +#define MAR3 (WD_BASE+WD_NIC+0x0b) /* RW - Multicast Address 3 */ +#define MAR4 (WD_BASE+WD_NIC+0x0c) /* RW - Multicast Address 4 */ +#define MAR5 (WD_BASE+WD_NIC+0x0d) /* RW - Multicast Address 5 */ +#define MAR6 (WD_BASE+WD_NIC+0x0e) /* RW - Multicast Address 6 */ +#define MAR7 (WD_BASE+WD_NIC+0x0f) /* RW - Multicast Address 7 */ + +/* Page 2 */ +/* Page 2 Registers are RW opposite Page 0 */ +/* and should be used for diagnostic purposes only */ + +/* Command Register bits */ +#define STOP 1 /* In progress jobs finished, software reset */ +#define STA 2 /* Activate the NIC */ +#define TXP 4 /* Initiate TX packet */ +#define RD0 8 /* Remote DMA commands */ +#define RD1 0x10 +#define RD2 0x20 +#define PS0 0x40 /* Page Select */ +#define PS1 0x80 /* 00 = 0, 01 = 1, 10 = 2, 11 = reserved */ + +#define PAGE0 ~(PS0|PS1) /* Remember to AND this */ +#define PAGE1 PS0 /* these can be OR'd */ +#define PAGE2 PS1 +#define NO_DMA RD2 + +/* Interrupt Status Register bits */ +#define PRX 1 /* Packet received with no errors */ +#define PTX 2 /* Packet transmitted with no errors */ +#define RXE 4 /* Packet received with errors */ +#define TXE 8 /* Transmit aborted with errors */ +#define OVW 0x10 /* Overwrite warning */ +#define CNT 0x20 /* Counter overflow warning */ +#define RDC 0x40 /* Remote DMA complete */ +#define RST 0x80 /* Reset status - does not cause interrupts */ + +/* Interrupt Mask Register - 1 = enabled */ +#define PRXE 1 /* Packet received */ +#define PTXE 2 /* Packet transmitted */ +#define RXEE 4 /* Receive error */ +#define TXEE 8 /* Transmit error */ +#define OVWE 0x10 /* Overwrite error */ +#define CNTE 0x20 /* Counter overflow */ +#define RDCE 0x40 /* Remote DMA complete */ + +/* Data Configuration Register */ +#define WTS 1 /* Word Transfer 0 = byte, 1 = word */ +#define BOS 2 /* Byte Order 0 = 8086, 1 = 68000 */ +#define LAS 4 /* Long Address 0 = 16bit, 1 = 32 bit DMA */ +#define LS 8 /* Loopback = 0, 1 = Normal */ +#define AR 0x10 /* Autoinitialize = 1 DMA, 0 = software */ +#define FT0 0x20 /* FIFO Threshold (word mode /2 ) */ +#define FT1 0x40 /* 00 = 2, 01 = 4, 10 = 8, 11 = 12 bytes */ + +/* Transmit Configuration Register */ +#define CRCI 1 /* CRC inhibit = 1, append = 0 */ +#define LB0 2 /* Loopback control 00 = normal loopback */ +#define LB1 4 /* 01 = internal, 10 = external1, 11 = external2 */ +#define ATD 8 /* Auto Transmit Enable = 1 tx inhibit enabled */ +#define OFST 0x10 /* Collision offset 1 = modify to low priority mode */ + +/* Transmitter Status Register */ +#define PTXOK 1 /* Packet transmitted without error */ + /* reserved */ +#define COL 4 /* Transmit collided, check NCR for count */ +#define ABT 8 /* Transmit aborted - 16 tries */ +#define CRS 0x10 /* Carrier Sense lost */ +#define FU 0x20 /* FIFO underrun */ +#define CDH 0x40 /* CD Heartbeat failed */ +#define OWC 0x80 /* Out of window collision */ + +/* Receive configuration Register */ +#define SEP 1 /* Save error packets = 1 */ +#define ARUNT 2 /* Accept RUNT packets < 64 bytes */ +#define AB 4 /* Accept Broadcast packets */ +#define AM 8 /* Accept Multicast packets */ +#define PRO 0x10 /* Promiscuous mode */ +#define MON 0x20 /* Monitor mode */ + +/* Receive Status Register */ +#define PRX 1 /* Packet received without error */ +#define CRC 2 /* CRC error */ +#define FAE 4 /* Frame Alignment error */ +#define FO 8 /* FIFO overrun error */ +#define MPA 0x10 /* Missed packet */ +#define PHY 0x20 /* Physical = 0, Multicast/Broadcast = 1 */ +#define DIS 0x40 /* Receiver disabled (monitor mode) */ +#define DFR 0x80 /* Deferring - jabber on line */ + + +/* rth additions */ + +#define EN_CMD (WD_BASE+0) +#define EN_REG1 (WD_BASE+1) +#define EN_REG5 (WD_BASE+5) +#define EN_SAPROM (WD_BASE+8) +#define EN_REGE (WD_BASE+0x0e) +#define EN_OFFSET 16 + +/* WD Commands for EN_CMD */ +#define EN_RESET +#define EN_MEMEN 0x40 +#define EN_MEM_MASK 0x3f + +/* WD Bus Register bits */ +#define BUS16 1 + +/* WD REG5 Commands */ +#define MEM16ENABLE 0x80 +#define LAN16ENABLE 0x40 +#define MEMMASK 0x1f +#define BIT19 0x1 + +/* Memory test pattern to use */ +#define TESTPATTERN 0x5a + +/* Western Digital Additional Registers */ + +/* National Semiconductor Definitions */ + +/* Page 0 */ +#define CR (WD_BASE+WD_NIC+0) /* RW - Command */ +#define CLDA0 (WD_BASE+WD_NIC+1) /* R - Current Local DMA Address 0 */ +#define PSTART (WD_BASE+WD_NIC+1) /* W - Page Start Register */ +#define CLDA1 (WD_BASE+WD_NIC+2) /* R - Current Local DMA Address 1 */ +#define PSTOP (WD_BASE+WD_NIC+2) /* W - Page Stop Register */ +#define BNRY (WD_BASE+WD_NIC+3) /* RW - Boundry Pointer */ +#define TSR (WD_BASE+WD_NIC+4) /* R - Transmit Status Register */ +#define TPSR (WD_BASE+WD_NIC+4) /* W - Transmit Page Start */ +#define NCR (WD_BASE+WD_NIC+5) /* R - Number of Collisions */ +#define TBCR0 (WD_BASE+WD_NIC+5) /* W - Transmit Byte Count 0 */ +#define FIFO (WD_BASE+WD_NIC+6) /* R - FIFO */ +#define TBCR1 (WD_BASE+WD_NIC+6) /* W - Transmit Byte Count 1 */ +#define ISR (WD_BASE+WD_NIC+7) /* RW - Interrupt Status Register */ +#define CRDA0 (WD_BASE+WD_NIC+8) /* R - Current Remote DMA Address 0 */ +#define RSAR0 (WD_BASE+WD_NIC+8) /* W - Remote Start Address 0 */ +#define CRDA1 (WD_BASE+WD_NIC+9) /* R - Current Remote DMA Address 1 */ +#define RSAR1 (WD_BASE+WD_NIC+9) /* W - Remote Start Address 1 */ + /* R - Reserved */ +#define RBCR0 (WD_BASE+WD_NIC+0x0a) /* W - Remote Byte Count 0 */ + /* R - Reserved */ +#define RBCR1 (WD_BASE+WD_NIC+0x0b) /* W - Remote Byte Count 1 */ +#define RSR (WD_BASE+WD_NIC+0x0c) /* R - Receive Status Register */ +#define RCR (WD_BASE+WD_NIC+0x0c) /* W - Receive Configuration */ +#define CNTR0 (WD_BASE+WD_NIC+0x0d) /* R - Frame Alignment Errors 0 */ +#define TCR (WD_BASE+WD_NIC+0x0d) /* W - Transmit Configuration */ +#define CNTR1 (WD_BASE+WD_NIC+0x0e) /* R - Frame Alignment Errors 1 */ +#define DCR (WD_BASE+WD_NIC+0x0e) /* W - Data Configuration */ +#define CNTR2 (WD_BASE+WD_NIC+0x0f) /* R - Missed Packet Errors */ +#define IMR (WD_BASE+WD_NIC+0x0f) /* W - Interrupt Mask Register */ + +/* Page 1 */ + /* RW - Command */ +#define PAR0 (WD_BASE+WD_NIC+0x01) /* RW - Physical Address 0 */ +#define PAR1 (WD_BASE+WD_NIC+0x02) /* RW - Physical Address 1 */ +#define PAR2 (WD_BASE+WD_NIC+0x03) /* RW - Physical Address 2 */ +#define PAR3 (WD_BASE+WD_NIC+0x04) /* RW - Physical Address 3 */ +#define PAR4 (WD_BASE+WD_NIC+0x04) /* RW - Physical Address 4 */ +#define PAR5 (WD_BASE+WD_NIC+0x05) /* RW - Physical Address 5 */ +#define PAR6 (WD_BASE+WD_NIC+0x06) /* RW - Physical Address 6 */ +#define CURR (WD_BASE+WD_NIC+0x07) /* RW - Current Page */ +#define MAR0 (WD_BASE+WD_NIC+0x08) /* RW - Multicast Address 0 */ +#define MAR1 (WD_BASE+WD_NIC+0x09) /* RW - Multicast Address 1 */ +#define MAR2 (WD_BASE+WD_NIC+0x0a) /* RW - Multicast Address 2 */ +#define MAR3 (WD_BASE+WD_NIC+0x0b) /* RW - Multicast Address 3 */ +#define MAR4 (WD_BASE+WD_NIC+0x0c) /* RW - Multicast Address 4 */ +#define MAR5 (WD_BASE+WD_NIC+0x0d) /* RW - Multicast Address 5 */ +#define MAR6 (WD_BASE+WD_NIC+0x0e) /* RW - Multicast Address 6 */ +#define MAR7 (WD_BASE+WD_NIC+0x0f) /* RW - Multicast Address 7 */ + +/* Page 2 */ +/* Page 2 Registers are RW opposite Page 0 */ +/* and should be used for diagnostic purposes only */ + +/* Command Register bits */ +#define STOP 1 /* In progress jobs finished, software reset */ +#define STA 2 /* Activate the NIC */ +#define TXP 4 /* Initiate TX packet */ +#define RD0 8 /* Remote DMA commands */ +#define RD1 0x10 +#define RD2 0x20 +#define PS0 0x40 /* Page Select */ +#define PS1 0x80 /* 00 = 0, 01 = 1, 10 = 2, 11 = reserved */ + +#define PAGE0 ~(PS0|PS1) /* Remember to AND this */ +#define PAGE1 PS0 /* these can be OR'd */ +#define PAGE2 PS1 +#define NO_DMA RD2 + +/* Interrupt Status Register bits */ +#define PRX 1 /* Packet received with no errors */ +#define PTX 2 /* Packet transmitted with no errors */ +#define RXE 4 /* Packet received with errors */ +#define TXE 8 /* Transmit aborted with errors */ +#define OVW 0x10 /* Overwrite warning */ +#define CNT 0x20 /* Counter overflow warning */ +#define RDC 0x40 /* Remote DMA complete */ +#define RST 0x80 /* Reset status - does not cause interrupts */ + +/* Interrupt Mask Register - 1 = enabled */ +#define PRXE 1 /* Packet received */ +#define PTXE 2 /* Packet transmitted */ +#define RXEE 4 /* Receive error */ +#define TXEE 8 /* Transmit error */ +#define OVWE 0x10 /* Overwrite error */ +#define CNTE 0x20 /* Counter overflow */ +#define RDCE 0x40 /* Remote DMA complete */ + +/* Data Configuration Register */ +#define WTS 1 /* Word Transfer 0 = byte, 1 = word */ +#define BOS 2 /* Byte Order 0 = 8086, 1 = 68000 */ +#define LAS 4 /* Long Address 0 = 16bit, 1 = 32 bit DMA */ +#define LS 8 /* Loopback = 0, 1 = Normal */ +#define AR 0x10 /* Autoinitialize = 1 DMA, 0 = software */ +#define FT0 0x20 /* FIFO Threshold (word mode /2 ) */ +#define FT1 0x40 /* 00 = 2, 01 = 4, 10 = 8, 11 = 12 bytes */ + +/* Transmit Configuration Register */ +#define CRCI 1 /* CRC inhibit = 1, append = 0 */ +#define LB0 2 /* Loopback control 00 = normal loopback */ +#define LB1 4 /* 01 = internal, 10 = external1, 11 = external2 */ +#define ATD 8 /* Auto Transmit Enable = 1 tx inhibit enabled */ +#define OFST 0x10 /* Collision offset 1 = modify to low priority mode */ + +/* Transmitter Status Register */ +#define PTXOK 1 /* Packet transmitted without error */ + /* reserved */ +#define COL 4 /* Transmit collided, check NCR for count */ +#define ABT 8 /* Transmit aborted - 16 tries */ +#define CRS 0x10 /* Carrier Sense lost */ +#define FU 0x20 /* FIFO underrun */ +#define CDH 0x40 /* CD Heartbeat failed */ +#define OWC 0x80 /* Out of window collision */ + +/* Receive configuration Register */ +#define SEP 1 /* Save error packets = 1 */ +#define ARUNT 2 /* Accept RUNT packets < 64 bytes */ +#define AB 4 /* Accept Broadcast packets */ +#define AM 8 /* Accept Multicast packets */ +#define PRO 0x10 /* Promiscuous mode */ +#define MON 0x20 /* Monitor mode */ + +/* Receive Status Register */ +#define PRX 1 /* Packet received without error */ +#define CRC 2 /* CRC error */ +#define FAE 4 /* Frame Alignment error */ +#define FO 8 /* FIFO overrun error */ +#define MPA 0x10 /* Missed packet */ +#define PHY 0x20 /* Physical = 0, Multicast/Broadcast = 1 */ +#define DIS 0x40 /* Receiver disabled (monitor mode) */ +#define DFR 0x80 /* Deferring - jabber on line */ + + + + + diff --git a/tools/build.c b/tools/build.c index 3573df9..d7005c6 100644 --- a/tools/build.c +++ b/tools/build.c @@ -32,7 +32,7 @@ #define MINIX_HEADER 32 #define GCC_HEADER 1024 -#define SYS_SIZE 0x5000 +#define SYS_SIZE 0x7000 #define DEFAULT_MAJOR_ROOT 0 #define DEFAULT_MINOR_ROOT 0 diff --git a/tools/version.h b/tools/version.h index d9dc35e..97a8056 100644 --- a/tools/version.h +++ b/tools/version.h @@ -1,5 +1,5 @@ -#define UTS_RELEASE "0.97.pl3-34" -#define UTS_VERSION "09/05/92" -#define LINUX_COMPILE_TIME "17:58:09" +#define UTS_RELEASE "0.98-21" +#define UTS_VERSION "09/29/92" +#define LINUX_COMPILE_TIME "20:36:17" #define LINUX_COMPILE_BY "root" #define LINUX_COMPILE_HOST "home" |