Commit ed6ac3a1 authored by Linus Torvalds's avatar Linus Torvalds

Import 1.3.88

parent f806c6db
This document contains a list of the latest releases of the most
important packages for Linux.
LINUX_UPTODATE - "Keep your Linux system up to date".
The installation information were removed because redundant.
For comments, fixed, etc write to
Alessandro Sigala <ssigala@globalnet.it>
Last updated: 12 Apr 1996.
Author: Alessandro Sigala `ssigala@globalnet.it'.
Last updated: 11 Apr 1996.
Current Releases
****************
This short document describe what you need and where to get
most of the new stuff for your Linux box (intended for systems that have
already upgraded to ELF binaries).
- Kernel modules 1.3.69
- PPP daemon 2.2.0e
- Dynamic linker (ld.so) 1.7.14
- GNU CC 2.7.2
- Binutils 2.6.0.12
- Linux C Library 5.3.9
- Linux C++ Library 2.7.1.4
- Termcap 2.0.7
- Procps 0.99a
- Gpm 1.06
- SysVinit 2.60
The ftp site mainly used in this document is sunsite.unc.edu.
What you really need to upgrade
*******************************
The current releases of the linux software are:
Linux Kernel 1.3.xx :-)
Kernel modules 1.3.57
PPP daemon 2.2.0e
Binutils 2.6.0.12
Dynamic linker (ld.so) 1.7.14
Linux C Library 5.3.9
Linux C++ Library 2.7.1.4
Termcap 2.0.7
GNU CC 2.7.2
Procps 0.99a
Dynamic linker
==============
What do you really need to upgrade for using the latest 1.3.x kernel:
- Modules 1.3.57 for using the kernel modules
- Procps 0.99a for using free, ps, pstree, top and friends
- PPP 2.2.0e for using pppd, pppstats, pppon, etc
You may upgrade the dynamic linker to the latest release only to
solve some bugs.
This document may also be useful to answer the questions like:
SysVinit
========
* Q: 'free' displays some strange lines
A: upgrade the procps package
The FIFO behavior is changed in latest 1.3.x kernel releases. You may
upgrade to this version if the older version break.
* Q: 'pppd' displays "the PPP protocol is not available"
A: upgrade the PPP package
PPP daemon and utilities
========================
... and so :)
To use the PPP protocol with the 1.3.x linux kernel, you need to
upgrade the PPP package to version 2.2.0e.
----------------------------------------------------------------------------
Procps utilities
================
** NOTES
In the latest 1.3.x kernel releases the /proc filesystem structure
was changed, so you need to upgrade the Procps package to version 0.99a.
- Take a look at the documentation that come with every package
before doing anything!
Installation notes
******************
- All the installation operation must be done as root.
Kernel Modules
==============
- If you want to use the latest GCC release (2.7.2) you must upgrade
your C Library, the C++ Library, the dynamic linker and the binutils.
The current kernel modules release is 1.3.57, but you need the
experimental release 1.3.69 to use newer binutils 2.6.0.x, because
modules compiled with new binutils can't be loaded by modules 1.3.57.
- After installed any new library, run the program `ldconfig' to update
the dynamic linker cache (you may also need to modify the file
/etc/ld.so.conf).
The Linux C Library
===================
----------------------------------------------------------------------------
The current Linux C Library release is 5.3.9. In this release there
are some important changes that may break other programs, then read the
`release.libc-5.3.9' file carefully! You need to patch and recompile
the `make' utility, or get it precompiled from the address written in
the next section of this file. If you don't want to patch and
recompile the binaries you may try the release 5.2.18.
* The dynamic linker.
The Termcap Library
===================
Get the file ld.so-1.7.14.tar.gz and unpack into a directory. You should
have no problem installing this package, simply cd into the package
directory and type `make install'.
The current Termcap release is 2.0.7. If you upgrade to this release
read the `README' file contained into the package to get some important
information about the `tgetent' function changes!
----------------------------------------------------------------------------
Where to get the files
**********************
* The Linux C Library.
Binutils
========
*** NOTE: read the release.libc-5.3.9 file before installing the
libraries!
ftp://sunsite.unc.edu/pub/Linux/GCC/binutils-2.6.0.12.bin.tar.gz
Installation notes:
ftp://sunsite.unc.edu/pub/Linux/GCC/release.binutils-2.6.0.12
Get the libc-5.3.9.bin.tar.gz file and unpack into the root directory
GNU CC
======
i.e. into the root directory type:
ftp://sunsite.unc.edu/pub/Linux/GCC/gcc-2.7.2.bin.tar.gz
Installation notes:
ftp://sunsite.unc.edu/pub/Linux/GCC/release.gcc-2.7.2
tar xvfz libc-5.3.9.bin.tar.gz
Linux C Library
===============
you also need to make the symbolic links to the new library into the /lib
directory
The latest 5.3.9 release:
ftp://sunsite.unc.edu/pub/Linux/GCC/libc-5.3.9.bin.tar.gz
Installation notes:
ftp://sunsite.unc.edu/pub/Linux/GCC/release.libc-5.3.9
i.e. into the /lib directory type:
Patched make binary:
ftp://sunsite.unc.edu/pub/Linux/devel/make/make-3.74-direntfix-elf.tgz
rm -f libc.so.5
sln libc.so.5.3.9 libc.so.5
rm -f libm.so.5
sln libm.so.5.0.5 libm.so.5
The 5.2.18 release:
ftp://sunsite.unc.edu/pub/Linux/GCC/libc-5.2.18.bin.tar.gz
Installation notes:
ftp://sunsite.unc.edu/pub/Linux/GCC/release.libc-5.2.18
*** Note 1:
Linux C++ Library
=================
<cutted from release.libc-5.3.9>
ftp://sunsite.unc.edu/pub/Linux/GCC/libg++-2.7.1.4.bin.tar.gz
Installation notes:
ftp://sunsite.unc.edu/pub/Linux/GCC/release.libg++-2.7.1.4
The structure DIR, defined in sysdeps/linux/dirstream.h, was changed in
release 5.2.0. If you upgrade from release 5.1.4 or earlier to release
5.2.0 or later, you must reboot after installing the new libraries.
Dynamic Linker
==============
*** Note 2:
ftp://sunsite.unc.edu/pub/Linux/GCC/ld.so-1.7.14.tar.gz
You must patch and recompile your GNU 'make' utility!
Termcap Library
===============
<cutted from release.libc-5.3.9>
ftp://sunsite.unc.edu/pub/Linux/GCC/termcap-2.0.7.tar.gz
A dirent bug, which erroneously defined d->reclen to d->namlen if USE_GNU
was defined, has been fixed. Unfortunately, some GNU packages depend on
this bug. GNU make 3.xx is one of them. A patch is included here.
Modules utilities
=================
here the patch:
RCS file: /home/cvs/gnu/make/dir.c,v
retrieving revision 1.1.1.1
diff -c -r1.1.1.1 dir.c
*** 1.1.1.1 1995/06/25 03:27:16
--- dir.c 1995/06/25 03:55:22
***************
*** 20,26 ****
#if defined (POSIX) || defined (HAVE_DIRENT_H) || defined (__GNU_LIBRARY__)
#include <dirent.h>
! #ifndef __GNU_LIBRARY__
#define D_NAMLEN(d) strlen((d)->d_name)
#else /* GNU C library. */
#define D_NAMLEN(d) ((d)->d_namlen)
--- 20,26 ----
#if defined (POSIX) || defined (HAVE_DIRENT_H) || defined (__GNU_LIBRARY__)
#include <dirent.h>
! #ifndef __BAD_GNU_LIBRARY__
#define D_NAMLEN(d) strlen((d)->d_name)
#else /* GNU C library. */
#define D_NAMLEN(d) ((d)->d_namlen)
===================================================================
RCS file: /home/cvs/gnu/make/glob/glob.c,v
retrieving revision 1.1.1.1
diff -c -r1.1.1.1 glob.c
*** 1.1.1.1 1995/06/25 03:27:18
--- glob/glob.c 1995/06/25 03:56:01
***************
*** 64,70 ****
#if defined (POSIX) || defined (HAVE_DIRENT_H) || defined (__GNU_LIBRARY__)
#include <dirent.h>
! #ifndef __GNU_LIBRARY__
#define D_NAMLEN(d) strlen((d)->d_name)
#else /* GNU C library. */
#define D_NAMLEN(d) ((d)->d_namlen)
--- 64,70 ----
#if defined (POSIX) || defined (HAVE_DIRENT_H) || defined (__GNU_LIBRARY__)
#include <dirent.h>
! #ifndef __BAD_GNU_LIBRARY__
#define D_NAMLEN(d) strlen((d)->d_name)
#else /* GNU C library. */
#define D_NAMLEN(d) ((d)->d_namlen)
The latest public release
ftp://sunsite.unc.edu/pub/Linux/kernel/modules-1.3.57.tar.gz
The latest experimental release
http://www.pi.se/blox/
----------------------------------------------------------------------------
PPP Daemon and utilities
========================
* The Linux C++ Library.
ftp://sunsite.unc.edu/pub/Linux/system/Network/serial/ppp-2.2.0e.tar.gz
*** NOTE: read the release.libg++-2.7.1.4 file before installing the
libraries!
Procps utilities
================
Get the libg++-2.7.1.4.bin.tar.gz file and unpack into the root directory
ftp://sunsite.unc.edu/pub/Linux/system/Status/ps/procps-0.99a.tgz
i.e. into the root directory type:
Gpm mouse utilities
===================
tar xvfz libg++-2.7.1.4.bin.tar.gz
ftp://iride.unipv.it/pub/gpm/gpm-1.06.tar.gz
ftp://sunsite.unc.edu/pub/Linux/system/Daemons/gpm-1.06.tar.gz
*** NOTE:
SysVinit utilities
==================
You may have troubles with the binaries linked with the old 2.6 libraries
(for example: umssync), dumping core or doing strange stuff.
To resolve the problems you need to recompile the sources of the binaries.
----------------------------------------------------------------------------
* The binutils.
*** NOTE: read the release.binutils-2.6.0.12 file before installing the
libraries!
Get the binutils-2.6.0.12.bin.tar.gz file and unpack it into the root
directory
i.e. into the root directory type:
tar xvfz binutils-2.6.0.12.bin.tar.gz
*** NOTE:
<cutted from release.binutils-2.6.0.12>
If you don't need the cross assemblers/linkers for m68k-linux,
m68k-linuxaout, sparc-sun-solaris2, sparc-sun-sunos4.1 nor alpha-linux,
please do
1. su root
2. cd /usr
3. rm -rf m68k-linux m68k-linuxaout sparc-sun-solaris2 sparc-sun-sunos4.1 alpha-linux
----------------------------------------------------------------------------
* The GNU CC compiler.
** NOTE: read the release.gcc-2.7.2 file before installing the package!
Get the gcc-2.7.2.bin.tar.gz file and unpack it into the root
directory
i.e. into the root directory type:
tar xvfz gcc-2.7.2.bin.tar.gz
You may want to remove the old compiler. Simply cd into the
/usr/lib/gcc-lib/i486-linux and remove the old compiler directory tree.
----------------------------------------------------------------------------
* The termcap library.
*** NOTE: read first the documentation that come with the package!
Get the file termcap-2.0.7.tar.gz and unpack into a directory. You should
have no problem installing this package, simply cd into the package
directory and type `make' then `make install'.
*** NOTE:
<cutted from the README of the package>
The linux entry in the new termcap is larger than 1024 chars.
But your application may only have a 1024 byte buffer. You may see
tgetent: warning: termcap entry too long
message when you run it in the Linux console. You can pass NULL to
tgetent () to let termcap malloc the buffer. elm and zsh are two
applications I know which use termcap and have this problem.
----------------------------------------------------------------------------
* The kernel modudes utilities.
*** NOTE: read first the documentation that come with the package!
Get the file modules-1.3.57.tar.gz and unpack into a directory. You should
have no problem installing this package, simply cd into the package
directory and type `make' then `make install'.
----------------------------------------------------------------------------
* The PPP daemon utilities.
*** NOTE: read first the documentation that come with the package!
Get the file ppp-2.2.0e.tar.gz and unpack into a directory. You should
have no problem installing this package, simply cd into the package
directory and type `make' then `make install'.
----------------------------------------------------------------------------
* The procps utilities.
*** NOTE: read first the documentation that come with the package!
Get the file procps-0.99a.tar.gz and unpack into a directory. You should
have no problem installing this package, simply cd into the package
directory and type `make' then `make install'.
----------------------------------------------------------------------------
This is where you can find all that is described in this document.
### sunsite.unc.edu:/pub/Linux/GCC
binutils-2.6.0.12.bin.tar.gz Binutils 2.6.0.12 (as,ld etc)
gcc-2.7.2.bin.tar.gz GNU CC 2.7.2 (ELF and a.out)
ld.so-1.7.14.tar.gz The dynamic linker
libc-5.3.9.bin.tar.gz The C library
libg++-2.7.1.4.bin.tar.gz The C++ library
termcap-2.0.7.tar.gz Termcap 2.0.7
release.binutils-2.6.0.12
release.gcc-2.7.2
release.libc-5.3.9 info (contains the patch for 'make')
release.libg++-2.7.1.4
### sunsite.unc.edu:/pub/Linux/kernel
modules-1.3.57.tar.gz Utils the kernel modules
### sunsite.unc.edu:/pub/Linux/system/Network/serial
ppp-2.2.0e.tar.gz The pppd daemon and utils for PPP
### sunsite.unc.edu:/pub/Linux/system/Status/ps
procps-0.99a.tgz ps, pstree, free, etc
----------------------------------------------------------------------------
For comments, fixed, etc write to
Alessandro Sigala <ssigala@globalnet.it>
At the time of writing:
ftp://sunsite.unc.edu/pub/Linux/Incoming/sysvinit-2.60.tar.gz
Next location:
ftp://sunsite.unc.edu/pub/Linux/system/Daemons/init/sysvinit-2.60.tar.gz
VERSION = 1
PATCHLEVEL = 3
SUBLEVEL = 87
SUBLEVEL = 88
ARCH = i386
......
......@@ -951,7 +951,7 @@ int ftape_wakeup_drive(wake_up_types method)
default:
result = -ENODEV; /* unknown wakeup method */
}
/* If wakeup succeeded we shouldn't get and error here..
/* If wakeup succeeded we shouldn't get an error here..
*/
if (result == 0) {
result = ftape_report_raw_drive_status(&status);
......
......@@ -527,7 +527,7 @@ static int stl_findpcibrds(void);
/*
* Define the driver info for a user level control device. Used mainly
* to get at port stats - only ont using the port device itself.
* to get at port stats - only not using the port device itself.
*/
static struct file_operations stl_fsiomem = {
NULL,
......
......@@ -51,7 +51,7 @@
*
* Revision 1.8 1995/03/15 12:49:44 fritz
* Added support for SPV's
* Split pollbchan_work ifor calling send-routine directly
* Split pollbchan_work for calling send-routine directly
*
* Revision 1.7 1995/02/20 03:48:03 fritz
* Added support of new request_region-function.
......
......@@ -419,7 +419,6 @@ int pas16_detect(Scsi_Host_Template * tpnt) {
else
instance->irq = NCR5380_probe_irq(instance, PAS16_IRQS);
instance->irq = IRQ_NONE; /*****temp****/
if (instance->irq != IRQ_NONE)
if (request_irq(instance->irq, pas16_intr, SA_INTERRUPT, "pas16", NULL)) {
printk("scsi%d : IRQ%d not free, interrupts disabled\n",
......
......@@ -277,6 +277,7 @@ static struct dev_info device_list[] =
{"TEXEL","CD-ROM","1.06", BLIST_BORKEN},
{"INSITE","Floptical F*8I","*", BLIST_KEY},
{"INSITE","I325VM","*", BLIST_KEY},
{"NRC","MBR-7","*", BLIST_FORCELUN | BLIST_SINGLELUN},
{"PIONEER","CD-ROM DRM-602X","*", BLIST_FORCELUN | BLIST_SINGLELUN},
{"PIONEER","CD-ROM DRM-604X","*", BLIST_FORCELUN | BLIST_SINGLELUN},
{"EMULEX","MD21/S2 ESDI","*",BLIST_FORCELUN | BLIST_SINGLELUN},
......
......@@ -2653,7 +2653,7 @@ guswave_patchmgr (int dev, struct patmgr_info *rec)
*/
offs += sample_ptrs[sample]; /*
* Begin offsess + offset to DRAM
* Begin offset + offset to DRAM
*/
for (n = 0; n < l; n++)
......@@ -2698,7 +2698,7 @@ guswave_patchmgr (int dev, struct patmgr_info *rec)
*/
offs += sample_ptrs[sample]; /*
* Begin offsess + offset to DRAM
* Begin offset + offset to DRAM
*/
for (n = 0; n < l; n++)
......
......@@ -1145,7 +1145,7 @@ attach_ss_ms_sound (long mem_start, struct address_info *hw_config)
sscape_write (devc, GA_DMACFG_REG, 0x50);
/*
* Take the gate-arry off of the DMA channel.
* Take the gate-array off of the DMA channel.
*/
sscape_write (devc, GA_DMAB_REG, 0x20);
......
......@@ -430,7 +430,7 @@ void isofs_statfs (struct super_block *sb, struct statfs *buf, int bufsiz)
struct statfs tmp;
tmp.f_type = ISOFS_SUPER_MAGIC;
tmp.f_bsize = 1 << ISOFS_BLOCK_BITS;
tmp.f_bsize = sb->s_blocksize;
tmp.f_blocks = sb->u.isofs_sb.s_nzones;
tmp.f_bfree = 0;
tmp.f_bavail = 0;
......@@ -681,7 +681,7 @@ int isofs_lookup_grandparent(struct inode * parent, int extent)
struct iso_directory_record * de;
offset = 0;
block = extent << (ISOFS_BLOCK_BITS - bufbits);
block = extent << (ISOFS_ZONE_BITS(parent) - bufbits);
if (!(bh = bread(parent->i_dev, block, bufsize))) return -1;
while (1 == 1) {
......@@ -689,6 +689,7 @@ int isofs_lookup_grandparent(struct inode * parent, int extent)
if (*((unsigned char *) de) == 0)
{
brelse(bh);
printk("Directory .. not found\n");
return -1;
}
......@@ -718,9 +719,11 @@ int isofs_lookup_grandparent(struct inode * parent, int extent)
result = -1;
offset = 0;
block = parent_dir << (ISOFS_BLOCK_BITS - bufbits);
block = parent_dir << (ISOFS_ZONE_BITS(parent) - bufbits);
if (!block || !(bh = bread(parent->i_dev,block, bufsize)))
{
return -1;
}
for(;;)
{
......@@ -738,11 +741,19 @@ int isofs_lookup_grandparent(struct inode * parent, int extent)
block++;
directory_size -= bufsize;
if(directory_size < 0) return -1;
if((block & 1) && (ISOFS_BLOCK_BITS - bufbits))
return -1;
if((block & 1) && (ISOFS_ZONE_BITS(parent) - bufbits) == 1)
{
return -1;
}
if((block & 3) && (ISOFS_ZONE_BITS(parent) - bufbits) == 2)
{
return -1;
}
if (!block
|| !(bh = bread(parent->i_dev,block, bufsize)))
{
return -1;
}
continue;
}
......@@ -764,7 +775,11 @@ int isofs_lookup_grandparent(struct inode * parent, int extent)
brelse(bh);
offset -= bufsize;
directory_size -= bufsize;
if(directory_size < 0) return -1;
if(directory_size < 0)
{
printk("Directory size < 0\n");
return -1;
}
block++;
if(!(bh = bread(parent->i_dev,block,bufsize))) {
kfree(cpnt);
......
......@@ -199,7 +199,9 @@ static struct buffer_head * isofs_find_entry(struct inode * dir,
find_rock_ridge_relocation(de,dir));
if(inode_number == -1){
/* Should never happen */
printk("Backlink not properly set.\n");
printk("Backlink not properly set %x %lx.\n",
isonum_733(de->extent),
dir->i_ino);
goto out;
}
}
......
......@@ -507,6 +507,8 @@ char * get_rock_ridge_symlink(struct inode * inode)
if(slen < 2) break;
if(!rootflag) strcat(rpnt,"/");
};
case SIG('C','E'):
CHECK_CE; /* This tells is if there is a continuation record */
break;
default:
break;
......
......@@ -486,7 +486,7 @@ static int nfs_rmdir(struct inode *dir, const char *name, int len)
static int nfs_sillyrename(struct inode *dir, const char *name, int len)
{
struct inode *inode;
char silly[14];
char silly[16];
int slen, ret;
dir->i_count++;
......
......@@ -122,6 +122,7 @@ struct iso_directory_record {
#define ISOFS_BUFFER_SIZE(INODE) ((INODE)->i_sb->s_blocksize)
#define ISOFS_BUFFER_BITS(INODE) ((INODE)->i_sb->s_blocksize_bits)
#define ISOFS_ZONE_BITS(INODE) ((INODE)->i_sb->u.isofs_sb.s_log_zone_size)
#if 0
#ifdef ISOFS_FIXED_BLOCKSIZE
......
......@@ -201,7 +201,7 @@ static __inline__ int tcp_new_window(struct sock * sk)
/*
* RFC 1122 says:
*
* "the suggested [SWS] avoidance algoritm for the receiver is to keep
* "the suggested [SWS] avoidance algorithm for the receiver is to keep
* RECV.NEXT + RCV.WIN fixed until:
* RCV.BUFF - RCV.USER - RCV.WINDOW >= min(1/2 RCV.BUFF, MSS)"
*
......@@ -213,7 +213,7 @@ static __inline__ int tcp_new_window(struct sock * sk)
* the size of the current free space, truncated to a multiple
* of 1024 bytes. If the window is smaller than
* min(sk->mss, MAX_WINDOW/2)
* then we adversize the window as having size 0, unless this
* then we advertise the window as having size 0, unless this
* would shrink the window we offered last time.
* This results in as much as double the throughput as the original
* implementation.
......
......@@ -329,7 +329,7 @@ static inline unsigned long generic_file_readahead(struct file * filp, struct in
if (PageLocked(page)) {
max_ahead = filp->f_ramax;
rapos = ppos;
/* try_async = 1 */ /* Seems questionnable */
/* try_async = 1 */ /* Seems questionable */
}
/*
* The current page is not locked
......@@ -435,10 +435,10 @@ int generic_file_read(struct inode * inode, struct file * filp, char * buf, int
pos = filp->f_pos;
/*
* Dont beleive f_reada
* Dont believe f_reada
* --------------------
* f_reada is set to 0 by seek operations.
* If we beleive f_reada, small seek ops break asynchronous read-ahead.
* If we believe f_reada, small seek ops break asynchronous read-ahead.
* That may be quite bad for small seeks or rewrites operations.
* I prefer to check if the current position is inside the previous read-ahead
* window.
......@@ -461,10 +461,10 @@ int generic_file_read(struct inode * inode, struct file * filp, char * buf, int
/*
* Now f_reada = 1 means that asynchronous read-ahead is the good tactics.
* Will try asynchrous read-ahead as soon as possible.
* Will try asynchronous read-ahead as soon as possible.
* Double the max read ahead size each time.
* That euristic avoid to do some large IO for files that are not really
* accessed sequentialy.
* That heuristic avoid to do some large IO for files that are not really
* accessed sequentially.
*/
if (filp->f_reada) {
try_async = 1;
......
......@@ -172,26 +172,15 @@ static void bad_tcp_sequence(struct sock *sk, struct tcphdr *th, u32 end_seq,
tcp_send_reset(sk->saddr,sk->daddr,th,sk->prot,NULL,dev, sk->ip_tos,sk->ip_ttl);
return;
}
/*
* We got out of sequence data.
* This turns out to be tricky. If the packet ends at the
* edge of the window, then we MUST ack the packet,
* otherwise a lost ACK packet can stall the TCP.
* We deal with this case in tcp_queue().
* On the other hand, if the packet is further to the
* left of the window, then we are looking a retransmitted
* packet. If we ACK it we can get into a situation that
* will later induce a fast retransmit of another packet.
* This can end up eating up half our bandwidth.
*/
/* This case is NOT supposed to be able
* to happen. Test for it?
/*
* 4.3reno machines look for these kind of acks so they can do fast
* recovery. Three identical 'old' acks lets it know that one frame has
* been lost and should be resent. Because this is before the whole window
* of data has timed out it can take one lost frame per window without
* stalling. [See Jacobson RFC1323, Stevens TCP/IP illus vol2]
*/
if (sk->acked_seq == end_seq)
printk("Impossible out of sequence data case.\n");
return;
tcp_send_ack(sk);
}
/*
......@@ -915,9 +904,17 @@ static int tcp_ack(struct sock *sk, struct tcphdr *th, u32 ack, int len)
break;
default:
/*
* Reset the xmit timer - state has changed.
* Must check send_head and write_queue
* to determine which timeout to use.
*/
tcp_reset_xmit_timer(sk, 0, 0);
if (sk->send_head || !skb_queue_empty(&sk->write_queue)) {
tcp_reset_xmit_timer(sk, TIME_WRITE, sk->rto);
} else if (sk->keepopen) {
tcp_reset_xmit_timer(sk, TIME_KEEPOPEN, TCP_TIMEOUT_LEN);
} else {
del_timer(&sk->retransmit_timer);
sk->ip_xmit_timeout = 0;
}
break;
}
}
......@@ -1237,7 +1234,7 @@ static void tcp_queue(struct sk_buff * skb, struct sock * sk, struct tcphdr *th)
if (!after(skb->seq, ack_seq)) {
if (after(skb->end_seq, ack_seq)) {
/* the packet stradles our window end */
/* the packet straddles our window end */
struct sk_buff_head * list = &sk->receive_queue;
struct sk_buff * next;
ack_seq = tcp_queue_ack(skb, sk);
......@@ -1285,7 +1282,7 @@ static void tcp_queue(struct sk_buff * skb, struct sock * sk, struct tcphdr *th)
*/
int delay = HZ/2;
if (th->psh)
delay = HZ/10;
delay = HZ/50;
tcp_send_delayed_ack(sk, delay);
}
......@@ -1335,7 +1332,7 @@ static void tcp_queue(struct sk_buff * skb, struct sock * sk, struct tcphdr *th)
*/
static int tcp_data(struct sk_buff *skb, struct sock *sk,
unsigned long saddr, unsigned short len)
unsigned long saddr, unsigned int len)
{
struct tcphdr *th;
u32 new_seq, shut_seq;
......@@ -1738,9 +1735,9 @@ int tcp_rcv(struct sk_buff *skb, struct device *dev, struct options *opt,
{
/* A valid ack from a different connection
start. Shouldn't happen but cover it */
tcp_statistics.TcpAttemptFails++;
tcp_send_reset(daddr, saddr, th,
sk->prot, opt,dev,sk->ip_tos,sk->ip_ttl);
tcp_statistics.TcpAttemptFails++;
tcp_send_reset(daddr, saddr, th,
sk->prot, opt,dev,sk->ip_tos,sk->ip_ttl);
kfree_skb(skb, FREE_READ);
return 0;
}
......
......@@ -29,66 +29,19 @@ void tcp_delack_timer(unsigned long data)
/*
* Reset the retransmission timer
*
* We currently ignore the why/when parameters, and decide on
* our own how long we should wait on our own..
*/
void tcp_reset_xmit_timer(struct sock *sk, int why, unsigned long when)
{
unsigned long now = jiffies;
when = ~0UL;
why = -1;
/*
* Was an old timer event active?
*/
if (del_timer(&sk->retransmit_timer)) {
why = sk->ip_xmit_timeout;
when = sk->retransmit_timer.expires;
}
/*
* Keepopen processing?
*/
if (sk->keepopen) {
unsigned long new_when = now + TCP_TIMEOUT_LEN;
if (new_when < when) {
when = new_when;
why = TIME_KEEPOPEN;
}
}
/*
* Retransmission?
*/
if (sk->send_head) {
struct sk_buff * skb = sk->send_head;
unsigned long new_when = skb->when + sk->rto;
if (new_when < when) {
when = new_when;
why = TIME_WRITE;
}
} else if (!skb_queue_empty(&sk->write_queue)) {
/*
* Zero window probe?
*/
struct sk_buff * skb = sk->write_queue.next;
if (before(sk->window_seq, skb->end_seq)) {
unsigned long new_when = now + TIME_PROBE0;
if (new_when < when) {
when = new_when;
why = TIME_PROBE0;
}
}
}
if (why >= 0) {
sk->ip_xmit_timeout = why;
sk->retransmit_timer.expires = when;
add_timer(&sk->retransmit_timer);
del_timer(&sk->retransmit_timer);
sk->ip_xmit_timeout = why;
if((long)when < 0)
{
when=3;
printk("Error: Negative timer in xmit_timer\n");
}
sk->retransmit_timer.expires=jiffies+when;
add_timer(&sk->retransmit_timer);
}
/*
......@@ -222,6 +175,19 @@ static int tcp_write_timeout(struct sock *sk)
return 1;
}
/*
* It could be we got here because we needed to send an ack,
* so we need to check for that and not just normal retransmit.
*/
static void tcp_time_write_timeout(struct sock * sk)
{
/*
* Retransmission
*/
sk->prot->retransmit (sk, 0);
tcp_write_timeout(sk);
}
/*
* The TCP retransmit timer. This lacks a few small details.
......@@ -267,25 +233,27 @@ void tcp_retransmit_timer(unsigned long data)
/* Window probing */
case TIME_PROBE0:
tcp_send_probe0(sk);
tcp_reset_xmit_timer(sk, 0, 0); /* get us going again */
tcp_write_timeout(sk);
break;
/* Retransmitting */
case TIME_WRITE:
sk->prot->retransmit (sk, 0);
tcp_write_timeout(sk);
tcp_reset_xmit_timer(sk, 0, 0); /* get us going again */
tcp_time_write_timeout(sk);
break;
/* Sending Keepalives */
case TIME_KEEPOPEN:
/*
* this reset_timer() call is a hack, this is not
* how KEEPOPEN is supposed to work.
*/
tcp_reset_xmit_timer (sk, TIME_KEEPOPEN, TCP_TIMEOUT_LEN);
/* Send something to keep the connection open. */
if (sk->prot->write_wakeup)
sk->prot->write_wakeup (sk);
sk->retransmits++;
sk->prot->retransmits++;
tcp_write_timeout(sk);
tcp_reset_xmit_timer (sk, 0, 0);
break;
default:
......
#
# Create a "reference" object to steal colors from.
#
button .ref
#
# This is a handy replacement for ".widget cget" that requires neither tk4
# nor additional source code uglification.
#
proc cget { w option } {
return [lindex [$w configure $option] 4]
return "[lindex [$w configure $option] 4]"
}
#
......@@ -18,12 +13,25 @@ proc cget { w option } {
#
proc vfix { var } {
global $var
if [catch {set $var [subst $$var]}] {
if [ catch {eval concat $$var} ] {
puts stdout "WARNING - broken Config.in! $var was not declared!"
set $var 0
}
}
#
# Create a "reference" object to steal colors from.
#
button .ref
#
# On monochrome displays, -disabledforeground is blank by default; that's
# bad. Fill it with -foreground instead.
#
if { [cget .ref -disabledforeground] == "" } {
.ref configure -disabledforeground [cget .ref -foreground]
}
#
# Define some macros we will need to parse the config.in file.
#
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment