Commit b8ff8ffb authored by Linus Torvalds's avatar Linus Torvalds

Import 1.0alpha

parent b764939b
...@@ -149,7 +149,7 @@ init/main.o: $(CONFIGURE) init/main.c ...@@ -149,7 +149,7 @@ init/main.o: $(CONFIGURE) init/main.c
$(CC) $(CFLAGS) $(PROFILING) -c -o $*.o $< $(CC) $(CFLAGS) $(PROFILING) -c -o $*.o $<
tools/system: boot/head.o init/main.o tools/version.o linuxsubdirs tools/system: boot/head.o init/main.o tools/version.o linuxsubdirs
$(LD) $(LDFLAGS) -T 1000 boot/head.o init/main.o tools/version.o \ $(LD) $(LDFLAGS) -Ttext 1000 boot/head.o init/main.o tools/version.o \
$(ARCHIVES) \ $(ARCHIVES) \
$(FILESYSTEMS) \ $(FILESYSTEMS) \
$(DRIVERS) \ $(DRIVERS) \
...@@ -194,7 +194,7 @@ zlilo: $(CONFIGURE) zImage ...@@ -194,7 +194,7 @@ zlilo: $(CONFIGURE) zImage
if [ -x /sbin/lilo ]; then /sbin/lilo; else /etc/lilo/install; fi if [ -x /sbin/lilo ]; then /sbin/lilo; else /etc/lilo/install; fi
tools/zSystem: boot/head.o init/main.o tools/version.o linuxsubdirs tools/zSystem: boot/head.o init/main.o tools/version.o linuxsubdirs
$(LD) $(LDFLAGS) -T 100000 boot/head.o init/main.o tools/version.o \ $(LD) $(LDFLAGS) -Ttext 100000 boot/head.o init/main.o tools/version.o \
$(ARCHIVES) \ $(ARCHIVES) \
$(FILESYSTEMS) \ $(FILESYSTEMS) \
$(DRIVERS) \ $(DRIVERS) \
......
Linux kernel release 0.99 patchlevel 15 Linux kernel release 1.0
These are the release notes for linux version 0.99.15. Read them These are the release notes for linux version 1.0. Read them carefully,
carefully, as they tell you what's new, explain how to install the as they tell you what's new, explain how to install the kernel, and what
kernel, and what to do if something goes wrong. to do if something goes wrong.
INSTALLING the kernel: INSTALLING the kernel:
- if you install by patching, you need a *clean* 0.99.14 source tree, - if you install by patching, you need a *clean* 0.99.15 source tree,
which presumably exists in /usr/src/linux. If so, to get the kernel which presumably exists in /usr/src/linux. If so, to get the kernel
patched, just do a patched, just do a
cd /usr/src cd /usr/src
patch -p0 < linux-0.99.patch15 patch -p0 < linux-1.0.patch
and you should be ok. You may want to remove the backup files (xxx~ and you should be ok. You may want to remove the backup files (xxx~
or xxx.orig), and make sure that there are no failed patches (xxx# or or xxx.orig), and make sure that there are no failed patches (xxx# or
...@@ -21,7 +21,7 @@ INSTALLING the kernel: ...@@ -21,7 +21,7 @@ INSTALLING the kernel:
- If you install the full sources, do a - If you install the full sources, do a
cd /usr/src cd /usr/src
tar xvf linux-0.99.15.tar tar xvf linux-1.0.tar
to get it all put in place. to get it all put in place.
......
...@@ -106,7 +106,7 @@ bool 'System V and Coherent filesystem support' CONFIG_SYSV_FS n ...@@ -106,7 +106,7 @@ bool 'System V and Coherent filesystem support' CONFIG_SYSV_FS n
* *
#bool 'Keyboard meta-key sends ESC-prefix' CONFIG_KBD_META y #bool 'Keyboard meta-key sends ESC-prefix' CONFIG_KBD_META y
#bool 'Keyboard Num Lock on by default' CONFIG_KBD_NUML y #bool 'Keyboard Num Lock on by default' CONFIG_KBD_NUML y
bool 'Parallel printer support' CONFIG_PRINTER y bool 'Parallel printer support' CONFIG_PRINTER n
bool 'Logitech busmouse support' CONFIG_BUSMOUSE n bool 'Logitech busmouse support' CONFIG_BUSMOUSE n
bool 'PS/2 mouse (aka "auxiliary device") support' CONFIG_PSMOUSE y bool 'PS/2 mouse (aka "auxiliary device") support' CONFIG_PSMOUSE y
if [ "$CONFIG_PSMOUSE" = "y" ] if [ "$CONFIG_PSMOUSE" = "y" ]
...@@ -114,7 +114,7 @@ bool 'C&T 82C710 mouse port support (as on TI Travelmate)' CONFIG_82C710_MOUSE y ...@@ -114,7 +114,7 @@ bool 'C&T 82C710 mouse port support (as on TI Travelmate)' CONFIG_82C710_MOUSE y
fi fi
bool 'Microsoft busmouse support' CONFIG_MS_BUSMOUSE n bool 'Microsoft busmouse support' CONFIG_MS_BUSMOUSE n
bool 'ATIXL busmouse support' CONFIG_ATIXL_BUSMOUSE n bool 'ATIXL busmouse support' CONFIG_ATIXL_BUSMOUSE n
bool 'Selection (cut and paste for virtual consoles)' CONFIG_SELECTION y bool 'Selection (cut and paste for virtual consoles)' CONFIG_SELECTION n
bool 'QIC-02 tape support' CONFIG_TAPE_QIC02 n bool 'QIC-02 tape support' CONFIG_TAPE_QIC02 n
bool 'QIC-117 tape support' CONFIG_FTAPE n bool 'QIC-117 tape support' CONFIG_FTAPE n
if [ "$CONFIG_FTAPE" = "y" ] if [ "$CONFIG_FTAPE" = "y" ]
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
C/O Supercomputing Research Ctr., 17100 Science Dr., Bowie MD 20715 C/O Supercomputing Research Ctr., 17100 Science Dr., Bowie MD 20715
*/ */
static char *version = "3c509.c:pl15i 2/23/94 becker@super.org\n"; static char *version = "3c509.c:pl15k 3/5/94 becker@super.org\n";
#include <linux/config.h> #include <linux/config.h>
#include <linux/kernel.h> #include <linux/kernel.h>
...@@ -190,7 +190,7 @@ int el3_probe(struct device *dev) ...@@ -190,7 +190,7 @@ int el3_probe(struct device *dev)
{ {
char *if_names[] = {"10baseT", "AUI", "undefined", "BNC"}; char *if_names[] = {"10baseT", "AUI", "undefined", "BNC"};
printk("%s: 3c509 at %#3.3x tag %d, %s port, address ", printk("%s: 3c509 at %#3.3x tag %d, %s port, address ",
dev->name, dev->base_addr, current_tag, if_names[dev->if_port]); dev->name, dev->base_addr, current_tag, if_names[dev->if_port]);
} }
...@@ -477,10 +477,12 @@ el3_interrupt(int reg_ptr) ...@@ -477,10 +477,12 @@ el3_interrupt(int reg_ptr)
if (++i > 10) { if (++i > 10) {
printk("%s: Infinite loop in interrupt, status %4.4x.\n", printk("%s: Infinite loop in interrupt, status %4.4x.\n",
dev->name, status); dev->name, status);
/* Clear all interrupts we have handled. */
outw(0x68FF, ioaddr + EL3_CMD);
break; break;
} }
/* Clear the other interrupts we have handled. */ /* Acknowledge the IRQ. */
outw(0x6899, ioaddr + EL3_CMD); /* Ack IRQ */ outw(0x6891, ioaddr + EL3_CMD); /* Ack IRQ */
} }
if (el3_debug > 4) { if (el3_debug > 4) {
......
...@@ -127,10 +127,12 @@ static unsigned char generic_sense[6] = {REQUEST_SENSE, 0,0,0, 255, 0}; ...@@ -127,10 +127,12 @@ static unsigned char generic_sense[6] = {REQUEST_SENSE, 0,0,0, 255, 0};
static struct blist blacklist[] = static struct blist blacklist[] =
{ {
{"DENON","DRD-25X","V"}, /* A cdrom that locks up when probed at lun != 0 */ {"DENON","DRD-25X","V"}, /* A cdrom that locks up when probed at lun != 0 */
{"MAXTOR","XT-3280","PR02"}, /* Locks-up when LUN>0 polled. */ {"IMS", "CDD521/10","2.06"}, /* Locks-up when LUN>0 polled. */
{"MAXTOR","XT-4380S","B3C"}, /* Locks-up when LUN>0 polled. */ {"MAXTOR","XT-3280","PR02"}, /* Locks-up when LUN>0 polled. */
{"MAXTOR","XT-4380S","B3C"}, /* Locks-up when LUN>0 polled. */
{"MAXTOR","MXT-1240S","I1.2"}, /* Locks up when LUN > 0 polled */ {"MAXTOR","MXT-1240S","I1.2"}, /* Locks up when LUN > 0 polled */
{"MAXTOR","XT-4170S","B5A"}, /* Locks-up sometimes when LUN>0 polled. */ {"MAXTOR","XT-4170S","B5A"}, /* Locks-up sometimes when LUN>0 polled. */
{"MAXTOR","XT-8760S","B7B"}, /* guess what? */
{"NEC","CD-ROM DRIVE:841","1.0"}, /* Locks-up when LUN>0 polled. */ {"NEC","CD-ROM DRIVE:841","1.0"}, /* Locks-up when LUN>0 polled. */
{"RODIME","RO3000S","2.33"}, /* Locks up if polled for lun != 0 */ {"RODIME","RO3000S","2.33"}, /* Locks up if polled for lun != 0 */
{"SEAGATE", "ST157N", "\004|j"}, /* causes failed REQUEST SENSE on lun 1 for aha152x {"SEAGATE", "ST157N", "\004|j"}, /* causes failed REQUEST SENSE on lun 1 for aha152x
......
...@@ -748,16 +748,14 @@ static unsigned long try_to_load_aligned(unsigned long address, ...@@ -748,16 +748,14 @@ static unsigned long try_to_load_aligned(unsigned long address,
bh = create_buffers(address, size); bh = create_buffers(address, size);
if (!bh) if (!bh)
return 0; return 0;
/* do any of the buffers already exist? punt if so.. */
p = b; p = b;
for (offset = 0 ; offset < PAGE_SIZE ; offset += size) { for (offset = 0 ; offset < PAGE_SIZE ; offset += size) {
block = *(p++); block = *(p++);
if (!block) if (!block)
goto not_aligned; goto not_aligned;
tmp = get_hash_table(dev, block, size); if (find_buffer(dev, block, size))
if (tmp) {
brelse(tmp);
goto not_aligned; goto not_aligned;
}
} }
tmp = bh; tmp = bh;
p = b; p = b;
......
Changes from version 0.4b to version 0.5
========================================
- New superblock fields: s_lastcheck and s_checkinterval added
by Uwe Ohse <uwe@tirka.gun.de> to implement timedependent checks
of the file system
- Real random numbers for secure rm added by Pierre del Perugia
<delperug@gla.ecoledoc.ibp.fr>
- The mount warnings related to the state of a fs are not printed
if the fs is mounted read-only, idea by Nick Holloway
<alfie@dcs.warwick.ac.uk>
Changes from version 0.4a to version 0.4b Changes from version 0.4a to version 0.4b
========================================= =========================================
- Copyrights changed to include the name of my laboratory. - Copyrights changed to include the name of my laboratory.
......
...@@ -267,21 +267,21 @@ static int parse_options (char * options, unsigned long * sb_block, ...@@ -267,21 +267,21 @@ static int parse_options (char * options, unsigned long * sb_block,
static void ext2_setup_super (struct super_block * sb, static void ext2_setup_super (struct super_block * sb,
struct ext2_super_block * es) struct ext2_super_block * es)
{ {
if (!(sb->u.ext2_sb.s_mount_state & EXT2_VALID_FS))
printk ("EXT2-fs warning: mounting unchecked fs, "
"running e2fsck is recommended\n");
else if ((sb->u.ext2_sb.s_mount_state & EXT2_ERROR_FS))
printk ("EXT2-fs warning: mounting fs with errors, "
"running e2fsck is recommended\n");
else if (es->s_max_mnt_count >= 0 &&
es->s_mnt_count >= (unsigned short) es->s_max_mnt_count)
printk ("EXT2-fs warning: maximal mount count reached, "
"running e2fsck is recommended\n");
else if (es->s_checkinterval &&
(es->s_lastcheck + es->s_checkinterval <= CURRENT_TIME))
printk ("EXT2-fs warning: checktime reached, "
"running e2fsck is recommended\n");
if (!(sb->s_flags & MS_RDONLY)) { if (!(sb->s_flags & MS_RDONLY)) {
if (!(sb->u.ext2_sb.s_mount_state & EXT2_VALID_FS))
printk ("EXT2-fs warning: mounting unchecked fs, "
"running e2fsck is recommended\n");
else if ((sb->u.ext2_sb.s_mount_state & EXT2_ERROR_FS))
printk ("EXT2-fs warning: mounting fs with errors, "
"running e2fsck is recommended\n");
else if (es->s_max_mnt_count >= 0 &&
es->s_mnt_count >= (unsigned short) es->s_max_mnt_count)
printk ("EXT2-fs warning: maximal mount count reached, "
"running e2fsck is recommended\n");
else if (es->s_checkinterval &&
(es->s_lastcheck + es->s_checkinterval <= CURRENT_TIME))
printk ("EXT2-fs warning: checktime reached, "
"running e2fsck is recommended\n");
es->s_state &= ~EXT2_VALID_FS; es->s_state &= ~EXT2_VALID_FS;
if (!es->s_max_mnt_count) if (!es->s_max_mnt_count)
es->s_max_mnt_count = EXT2_DFL_MAX_MNT_COUNT; es->s_max_mnt_count = EXT2_DFL_MAX_MNT_COUNT;
......
...@@ -111,6 +111,10 @@ static int proc_readlink(struct inode * inode, char * buffer, int buflen) ...@@ -111,6 +111,10 @@ static int proc_readlink(struct inode * inode, char * buffer, int buflen)
unsigned int dev,ino; unsigned int dev,ino;
char buf[64]; char buf[64];
if (!S_ISLNK(inode->i_mode)) {
iput(inode);
return -EINVAL;
}
i = proc_follow_link(NULL, inode, 0, 0, &inode); i = proc_follow_link(NULL, inode, 0, 0, &inode);
if (i) if (i)
return i; return i;
......
...@@ -52,8 +52,8 @@ ...@@ -52,8 +52,8 @@
/* /*
* The second extended file system version * The second extended file system version
*/ */
#define EXT2FS_DATE "94/01/08" #define EXT2FS_DATE "94/03/10"
#define EXT2FS_VERSION "0.4b" #define EXT2FS_VERSION "0.5"
/* /*
* Debug code * Debug code
......
...@@ -24,17 +24,17 @@ enum { ...@@ -24,17 +24,17 @@ enum {
extern inline void mark_bh(int nr) extern inline void mark_bh(int nr)
{ {
__asm__ __volatile__("btsl %1,%0":"=m" (bh_active):"ir" (nr)); __asm__ __volatile__("orl %1,%0":"=m" (bh_active):"ir" (1<<nr));
} }
extern inline void disable_bh(int nr) extern inline void disable_bh(int nr)
{ {
__asm__ __volatile__("btcl %1,%0":"=m" (bh_mask):"ir" (nr)); __asm__ __volatile__("andl %1,%0":"=m" (bh_mask):"ir" (~(1<<nr)));
} }
extern inline void enable_bh(int nr) extern inline void enable_bh(int nr)
{ {
__asm__ __volatile__("btsl %1,%0":"=m" (bh_mask):"ir" (nr)); __asm__ __volatile__("orl %1,%0":"=m" (bh_mask):"ir" (1<<nr));
} }
#endif #endif
...@@ -101,12 +101,12 @@ asmlinkage void alignment_check(void); ...@@ -101,12 +101,12 @@ asmlinkage void alignment_check(void);
printk("ds: %04x es: %04x fs: %04x gs: %04x ss: %04x\n", printk("ds: %04x es: %04x fs: %04x gs: %04x ss: %04x\n",
regs->ds, regs->es, regs->fs, regs->gs, ss); regs->ds, regs->es, regs->fs, regs->gs, ss);
store_TR(i); store_TR(i);
printk("Pid: %d, process nr: %d (%s)\nCode: ", current->pid, 0xffff & i, current->comm); printk("Pid: %d, process nr: %d (%s)\nStack: ", current->pid, 0xffff & i, current->comm);
for(i=0;i<20;i++)
printk("%02x ",0xff & get_seg_byte(regs->cs,(i+(char *)regs->eip)));
printk("\nStack: ");
for(i=0;i<5;i++) for(i=0;i<5;i++)
printk("%08lx ", get_seg_long(ss,(i+(unsigned long *)esp))); printk("%08lx ", get_seg_long(ss,(i+(unsigned long *)esp)));
printk("\nCode: ");
for(i=0;i<20;i++)
printk("%02x ",0xff & get_seg_byte(regs->cs,(i+(char *)regs->eip)));
printk("\n"); printk("\n");
do_exit(SIGSEGV); do_exit(SIGSEGV);
} }
......
...@@ -151,8 +151,14 @@ void * kmalloc (size_t size, int priority) ...@@ -151,8 +151,14 @@ void * kmalloc (size_t size, int priority)
int order,tries,i,sz; int order,tries,i,sz;
struct block_header *p; struct block_header *p;
struct page_descriptor *page; struct page_descriptor *page;
extern unsigned long intr_count;
/* Sanity check... */ /* Sanity check... */
if (intr_count && priority != GFP_ATOMIC) {
printk("kmalloc called nonatomically from interrupt %08lx\n",
((unsigned long *)&size)[-1]);
priority = GFP_ATOMIC;
}
if (size > MAX_KMALLOC_K * 1024) if (size > MAX_KMALLOC_K * 1024)
{ {
printk ("kmalloc: I refuse to allocate %d bytes (for now max = %d).\n", printk ("kmalloc: I refuse to allocate %d bytes (for now max = %d).\n",
......
...@@ -585,6 +585,7 @@ last_free_pages[index = (index + 1) & (NR_LAST_FREE_PAGES - 1)] = result; \ ...@@ -585,6 +585,7 @@ last_free_pages[index = (index + 1) & (NR_LAST_FREE_PAGES - 1)] = result; \
*/ */
unsigned long __get_free_page(int priority) unsigned long __get_free_page(int priority)
{ {
extern unsigned long intr_count;
unsigned long result, flag; unsigned long result, flag;
static unsigned long index = 0; static unsigned long index = 0;
...@@ -593,6 +594,11 @@ unsigned long __get_free_page(int priority) ...@@ -593,6 +594,11 @@ unsigned long __get_free_page(int priority)
sections of code have interrupts disabled. -RAB sections of code have interrupts disabled. -RAB
Is this code reentrant? */ Is this code reentrant? */
if (intr_count && priority != GFP_ATOMIC) {
printk("gfp called nonatomically from interrupt %08lx\n",
((unsigned long *)&priority)[-1]);
priority = GFP_ATOMIC;
}
save_flags(flag); save_flags(flag);
repeat: repeat:
REMOVE_FROM_MEM_QUEUE(free_page_list,nr_free_pages); REMOVE_FROM_MEM_QUEUE(free_page_list,nr_free_pages);
......
...@@ -1041,7 +1041,7 @@ static struct sk_buff *ip_defrag(struct iphdr *iph, struct sk_buff *skb, struct ...@@ -1041,7 +1041,7 @@ static struct sk_buff *ip_defrag(struct iphdr *iph, struct sk_buff *skb, struct
len, len + hlen)); len, len + hlen));
/* Allocate buffer. */ /* Allocate buffer. */
if ((skb2 = alloc_skb(sizeof(struct sk_buff) + len + hlen,GFP_KERNEL)) == NULL) if ((skb2 = alloc_skb(sizeof(struct sk_buff) + len + hlen,GFP_ATOMIC)) == NULL)
{ {
printk("IP: frag: no memory for new fragment!\n"); printk("IP: frag: no memory for new fragment!\n");
return; return;
......
...@@ -425,7 +425,15 @@ void kfree_skb(struct sk_buff *skb, int rw) ...@@ -425,7 +425,15 @@ void kfree_skb(struct sk_buff *skb, int rw)
struct sk_buff *alloc_skb(unsigned int size,int priority) struct sk_buff *alloc_skb(unsigned int size,int priority)
{ {
struct sk_buff *skb=(struct sk_buff *)kmalloc(size,priority); struct sk_buff *skb;
extern unsigned long intr_count;
if (intr_count && priority != GFP_ATOMIC) {
printk("alloc_skb called nonatomically from interrupt %08lx\n",
((unsigned long *)&size)[-1]);
priority = GFP_ATOMIC;
}
skb=(struct sk_buff *)kmalloc(size,priority);
if(skb==NULL) if(skb==NULL)
return NULL; return NULL;
skb->free= 2; /* Invalid so we pick up forgetful users */ skb->free= 2; /* Invalid so we pick up forgetful users */
......
...@@ -982,9 +982,13 @@ inet_release(struct socket *sock, struct socket *peer) ...@@ -982,9 +982,13 @@ inet_release(struct socket *sock, struct socket *peer)
while(sk->state != TCP_CLOSE && current->timeout>0) { while(sk->state != TCP_CLOSE && current->timeout>0) {
interruptible_sleep_on(sk->sleep); interruptible_sleep_on(sk->sleep);
if (current->signal & ~current->blocked) { if (current->signal & ~current->blocked) {
break;
#if 0
/* not working now - closes can't be restarted */
sti(); sti();
current->timeout=0; current->timeout=0;
return(-ERESTARTSYS); return(-ERESTARTSYS);
#endif
} }
} }
current->timeout=0; current->timeout=0;
...@@ -1855,7 +1859,7 @@ void inet_proto_init(struct ddi_proto *pro) ...@@ -1855,7 +1859,7 @@ void inet_proto_init(struct ddi_proto *pro)
struct inet_protocol *p; struct inet_protocol *p;
int i; int i;
printk("Swansea University Computer Society Net2Debugged [1.27]\n"); printk("Swansea University Computer Society Net2Debugged [1.30]\n");
/* Set up our UNIX VFS major device. */ /* Set up our UNIX VFS major device. */
if (register_chrdev(AF_INET_MAJOR, "af_inet", &inet_fops) < 0) { if (register_chrdev(AF_INET_MAJOR, "af_inet", &inet_fops) < 0) {
printk("%s: cannot register major device %d!\n", printk("%s: cannot register major device %d!\n",
......
...@@ -3602,99 +3602,25 @@ tcp_write_wakeup(struct sock *sk) ...@@ -3602,99 +3602,25 @@ tcp_write_wakeup(struct sock *sk)
sk->prot->queue_xmit(sk, dev, buff, 1); sk->prot->queue_xmit(sk, dev, buff, 1);
} }
/*
* This routine probes a zero window. It makes a copy of the first
* packet in the write queue, but with just one byte of data.
*/
void void
tcp_send_probe0(struct sock *sk) tcp_send_probe0(struct sock *sk)
{ {
unsigned char *raw; if (sk->zapped)
struct iphdr *iph; return; /* Afer a valid reset we can send no more */
struct sk_buff *skb2, *skb;
int len, hlen, data;
struct tcphdr *t1;
struct device *dev;
if (sk->zapped)
return; /* Afer a valid reset we can send no more */
if (sk -> state != TCP_ESTABLISHED && sk->state != TCP_CLOSE_WAIT && tcp_write_wakeup(sk);
sk -> state != TCP_FIN_WAIT1 && sk->state != TCP_FIN_WAIT2)
return;
skb = sk->wfront; sk->backoff++;
if (skb == NULL) sk->rto = min(sk->rto << 1, 120*HZ);
return; reset_timer (sk, TIME_PROBE0, sk->rto);
sk->retransmits++;
dev = skb->dev; sk->prot->retransmits ++;
/* I know this can't happen but as it does.. */
if(dev==NULL)
{
printk("tcp_send_probe0: NULL device bug!\n");
return;
}
IS_SKB(skb);
raw = skb->data;
iph = (struct iphdr *) (raw + dev->hard_header_len);
hlen = (iph->ihl * sizeof(unsigned long)) + dev->hard_header_len;
data = skb->len - hlen - sizeof(struct tcphdr);
len = hlen + sizeof(struct tcphdr) + (data ? 1 : 0);
/* Allocate buffer. */
if ((skb2 = alloc_skb(sizeof(struct sk_buff) + len, GFP_ATOMIC)) == NULL) {
/* printk("alloc failed raw %x th %x hlen %d data %d len %d\n",
raw, skb->h.th, hlen, data, len); */
reset_timer (sk, TIME_PROBE0, 10); /* try again real soon */
return;
}
skb2->arp = skb->arp;
skb2->len = len;
skb2->h.raw = (char *)(skb2->data);
sk->wmem_alloc += skb2->mem_len;
/* Copy the packet header into the new buffer. */
memcpy(skb2->h.raw, raw, len);
skb2->h.raw += hlen; /* it's now h.th -- pointer to the tcp header */
t1 = skb2->h.th;
/* source, dest, seq, from existing packet */
t1->ack_seq = ntohl(sk->acked_seq);
t1->res1 = 0;
/* doff, fin, from existing packet. Fin is safe because Linux always
* sends fin in a separate packet
* syn, rst, had better be zero in original */
t1->ack = 1;
t1->res2 = 0;
t1->window = ntohs(tcp_select_window(sk)/*sk->prot->rspace(sk)*/);
tcp_send_check(t1, sk->saddr, sk->daddr, len - hlen, sk);
/* Send it and free it.
* This will prevent the timer from automatically being restarted.
*/
sk->prot->queue_xmit(sk, dev, skb2, 1);
sk->backoff++;
/*
* in the case of retransmissions, there's good reason to limit
* rto to 120 sec, as that's the maximum legal RTT on the Internet.
* For probes it could reasonably be longer. However making it
* much longer could cause unacceptable delays in some situation,
* so we might as well use the same value
*/
sk->rto = min(sk->rto << 1, 120*HZ);
reset_timer (sk, TIME_PROBE0, sk->rto);
sk->retransmits++;
sk->prot->retransmits ++;
} }
/* /*
* Socket option code for TCP. * Socket option code for TCP.
*/ */
int tcp_setsockopt(struct sock *sk, int level, int optname, char *optval, int optlen) int tcp_setsockopt(struct sock *sk, int level, int optname, char *optval, int optlen)
{ {
int val,err; int val,err;
......
...@@ -18,7 +18,7 @@ CFLAGS = -O2 -DSTDC_HEADERS $(TEST) ...@@ -18,7 +18,7 @@ CFLAGS = -O2 -DSTDC_HEADERS $(TEST)
all: zSystem all: zSystem
zSystem: piggy.o $(zOBJECTS) zSystem: piggy.o $(zOBJECTS)
$(LD) $(LDFLAGS) -o zSystem -T 1000 $(zOBJECTS) piggy.o $(LD) $(LDFLAGS) -o zSystem -Ttext 1000 $(zOBJECTS) piggy.o
head.o: head.s head.o: head.s
......
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