diff options
author | Linus Torvalds <torvalds@cc.helsinki.fi> | 1994-01-19 12:12:50 +0000 |
---|---|---|
committer | Nicolas Pitre <nico@cam.org> | 2007-08-19 14:19:27 -0400 |
commit | c5002faf69a59a022ae0d51a35e4836858fea1d0 (patch) | |
tree | 417358626b9343bd6008f6ec2dfed0d67f9fb1e2 | |
parent | 0b5e8609bf7e6899c1fea30aa467812d488b6c11 (diff) | |
download | archive-c5002faf69a59a022ae0d51a35e4836858fea1d0.tar.gz |
ALPHA-pl14s
-rw-r--r-- | include/linux/sys.h | 1 | ||||
-rw-r--r-- | include/linux/unistd.h | 2 | ||||
-rw-r--r-- | kernel/sched.c | 3 | ||||
-rw-r--r-- | kernel/sys.c | 13 | ||||
-rw-r--r-- | net/inet/arp.c | 12 | ||||
-rw-r--r-- | net/inet/dev.c | 4 | ||||
-rw-r--r-- | net/inet/eth.c | 4 | ||||
-rw-r--r-- | net/inet/icmp.c | 9 | ||||
-rw-r--r-- | net/inet/ip.c | 23 | ||||
-rw-r--r-- | net/inet/loopback.c | 2 | ||||
-rw-r--r-- | net/inet/packet.c | 4 | ||||
-rw-r--r-- | net/inet/raw.c | 4 | ||||
-rw-r--r-- | net/inet/skbuff.h | 2 | ||||
-rw-r--r-- | net/inet/tcp.c | 59 | ||||
-rw-r--r-- | net/inet/udp.c | 2 |
15 files changed, 90 insertions, 54 deletions
diff --git a/include/linux/sys.h b/include/linux/sys.h index 49803fb..78d21a0 100644 --- a/include/linux/sys.h +++ b/include/linux/sys.h @@ -142,6 +142,7 @@ extern int sys_init_module(); extern int sys_delete_module(); extern int sys_get_kernel_syms(); /* 130 */ extern int sys_quotactl(); +extern int sys_getpgid(); /* * These are system calls that will be removed at some time diff --git a/include/linux/unistd.h b/include/linux/unistd.h index e06f3f2..16e05d1 100644 --- a/include/linux/unistd.h +++ b/include/linux/unistd.h @@ -137,6 +137,8 @@ #define __NR_init_module 128 #define __NR_delete_module 129 #define __NR_get_kernel_syms 130 +#define __NR_quotactl 131 +#define __NR_getpgid 132 extern int errno; diff --git a/kernel/sched.c b/kernel/sched.c index 8b7c21b..034fcbc 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -137,7 +137,8 @@ sys_newfstat, sys_uname, sys_iopl, sys_vhangup, sys_idle, sys_vm86, sys_wait4, sys_swapoff, sys_sysinfo, sys_ipc, sys_fsync, sys_sigreturn, sys_clone, sys_setdomainname, sys_newuname, sys_modify_ldt, sys_adjtimex, sys_mprotect, sys_sigprocmask, sys_create_module, -sys_init_module, sys_delete_module, sys_get_kernel_syms, sys_quotactl }; +sys_init_module, sys_delete_module, sys_get_kernel_syms, sys_quotactl, +sys_getpgid }; /* So we don't have to do any more manual updating.... */ int NR_syscalls = sizeof(sys_call_table)/sizeof(fn_ptr); diff --git a/kernel/sys.c b/kernel/sys.c index 315925b..4a9a446 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -490,6 +490,19 @@ asmlinkage int sys_setpgid(pid_t pid, pid_t pgid) return -ESRCH; } +asmlinkage int sys_getpgid(pid_t pid) +{ + struct task_struct * p; + + if (!pid) + pid = current->pid; + for_each_task(p) { + if (p->pid == pid) + return p->pgrp; + } + return -ESRCH; +} + asmlinkage int sys_getpgrp(void) { return current->pgrp; diff --git a/net/inet/arp.c b/net/inet/arp.c index d559bcb..1bbb843 100644 --- a/net/inet/arp.c +++ b/net/inet/arp.c @@ -238,7 +238,7 @@ arp_send_q(void) /* Can we now complete this packet? */ sti(); - if (skb->arp || !skb->dev->rebuild_header(skb+1, skb->dev)) { + if (skb->arp || !skb->dev->rebuild_header(skb->data, skb->dev)) { skb->arp = 1; skb->dev->queue_xmit(skb, skb->dev, 0); } else { @@ -287,8 +287,7 @@ arp_response(struct arphdr *arp1, struct device *dev, int addrtype) skb->len = sizeof(struct arphdr) + (2 * arp1->ar_hln) + (2 * arp1->ar_pln) + dev->hard_header_len; skb->mem_len = sizeof(struct sk_buff) + skb->len; - hlen = dev->hard_header((unsigned char *)(skb+1), dev, - ETH_P_ARP, src, dst, skb->len); + hlen = dev->hard_header(skb->data, dev, ETH_P_ARP, src, dst, skb->len); if (hlen < 0) { printk("ARP: cannot create HW frame header for REPLY !\n"); kfree_skb(skb, FREE_WRITE); @@ -300,7 +299,7 @@ arp_response(struct arphdr *arp1, struct device *dev, int addrtype) * This looks ugly, but we have to deal with the variable-length * ARP packets and such. It is not as bad as it looks- FvK */ - arp2 = (struct arphdr *) ((unsigned char *) (skb+1) + hlen); + arp2 = (struct arphdr *) (skb->data + hlen); ptr2 = ((unsigned char *) &arp2->ar_op) + sizeof(u_short); arp2->ar_hrd = arp1->ar_hrd; arp2->ar_pro = arp1->ar_pro; @@ -617,13 +616,12 @@ arp_send(unsigned long paddr, struct device *dev, unsigned long saddr) skb->dev = dev; skb->next = NULL; skb->free = 1; - tmp = dev->hard_header((unsigned char *)(skb+1), dev, - ETH_P_ARP, 0, saddr, skb->len); + tmp = dev->hard_header(skb->data, dev, ETH_P_ARP, 0, saddr, skb->len); if (tmp < 0) { kfree_skb(skb,FREE_WRITE); return; } - arp = (struct arphdr *) ((unsigned char *) (skb+1) + tmp); + arp = (struct arphdr *) (skb->data + tmp); arp->ar_hrd = htons(dev->type); if(dev->type!=3) /* AX.25 */ arp->ar_pro = htons(ETH_P_IP); diff --git a/net/inet/dev.c b/net/inet/dev.c index 42a37e0..159e8c4 100644 --- a/net/inet/dev.c +++ b/net/inet/dev.c @@ -537,7 +537,7 @@ dev_rint(unsigned char *buff, long len, int flags, struct device *dev) skb->mem_addr = (struct sk_buff *) skb; /* First we copy the packet into a buffer, and save it for later. */ - to = (unsigned char *) (skb + 1); + to = skb->data; left = len; len2 = len; while (len2 > 0) { @@ -614,7 +614,7 @@ inet_bh(void *tmp) * the MAC header, if any (as indicated by its "length" * field). Take care now! */ - skb->h.raw = (unsigned char *) (skb + 1) + skb->dev->hard_header_len; + skb->h.raw = skb->data + skb->dev->hard_header_len; skb->len -= skb->dev->hard_header_len; /* diff --git a/net/inet/eth.c b/net/inet/eth.c index d6d83eb..e9f374f 100644 --- a/net/inet/eth.c +++ b/net/inet/eth.c @@ -168,7 +168,7 @@ eth_add_arp(unsigned long addr, struct sk_buff *skb, struct device *dev) { struct ethhdr *eth; - eth = (struct ethhdr *) (skb + 1); + eth = (struct ethhdr *) skb->data; arp_add(addr, eth->h_source, dev); } @@ -179,7 +179,7 @@ eth_type_trans(struct sk_buff *skb, struct device *dev) { struct ethhdr *eth; - eth = (struct ethhdr *) (skb + 1); + eth = (struct ethhdr *) skb->data; if(ntohs(eth->h_proto)<1536) return(htons(ETH_P_802_3)); diff --git a/net/inet/icmp.c b/net/inet/icmp.c index 8150451..f6ae64c 100644 --- a/net/inet/icmp.c +++ b/net/inet/icmp.c @@ -104,8 +104,7 @@ icmp_send(struct sk_buff *skb_in, int type, int code, struct device *dev) len -= sizeof(struct sk_buff); /* Find the IP header. */ - iph = (struct iphdr *) (skb_in + 1); - iph = (struct iphdr *) ((unsigned char *) iph + dev->hard_header_len); + iph = (struct iphdr *) (skb_in->data + dev->hard_header_len); /* Build Layer 2-3 headers for message back to source. */ offset = ip_build_header(skb, dev->pa_addr, iph->saddr, @@ -118,7 +117,7 @@ icmp_send(struct sk_buff *skb_in, int type, int code, struct device *dev) /* Re-adjust length according to actual IP header size. */ skb->len = offset + sizeof(struct icmphdr) + sizeof(struct iphdr) + 8; - icmph = (struct icmphdr *) ((unsigned char *) (skb + 1) + offset); + icmph = (struct icmphdr *) (skb->data + offset); icmph->type = type; icmph->code = code; icmph->checksum = 0; @@ -269,7 +268,7 @@ icmp_echo(struct icmphdr *icmph, struct sk_buff *skb, struct device *dev, skb2->len = offset + len; /* Build ICMP_ECHO Response message. */ - icmphr = (struct icmphdr *) ((char *) (skb2 + 1) + offset); + icmphr = (struct icmphdr *) (skb2->data + offset); memcpy((char *) icmphr, (char *) icmph, len); icmphr->type = ICMP_ECHOREPLY; icmphr->code = 0; @@ -333,7 +332,7 @@ icmp_address(struct icmphdr *icmph, struct sk_buff *skb, struct device *dev, skb2->len = offset + len; /* Build ICMP ADDRESS MASK Response message. */ - icmphr = (struct icmphdr *) ((char *) (skb2 + 1) + offset); + icmphr = (struct icmphdr *) (skb2->data + offset); icmphr->type = ICMP_ADDRESSREPLY; icmphr->code = 0; icmphr->checksum = 0; diff --git a/net/inet/ip.c b/net/inet/ip.c index b31ee4c..ea1877b 100644 --- a/net/inet/ip.c +++ b/net/inet/ip.c @@ -178,7 +178,7 @@ ip_send(struct sk_buff *skb, unsigned long daddr, int len, struct device *dev, unsigned char *ptr; int mac; - ptr = (unsigned char *)(skb + 1); + ptr = skb->data; mac = 0; skb->arp = 1; if (dev->hard_header) { @@ -218,7 +218,7 @@ ip_build_header(struct sk_buff *skb, unsigned long saddr, unsigned long daddr, " type=%d, opt=%X, len = %d)\n", skb, saddr, daddr, *dev, type, opt, len)); - buff = (unsigned char *)(skb + 1); + buff = skb->data; /* See if we need to look up the device. */ if (*dev == NULL) { @@ -666,7 +666,7 @@ static struct ipq *ip_create(struct sk_buff *skb, struct iphdr *iph, struct devi memset(qp, 0, sizeof(struct ipq)); /* Allocate memory for the MAC header. */ - maclen = ((unsigned long) iph) - ((unsigned long) (skb + 1)); + maclen = ((unsigned long) iph) - ((unsigned long) skb->data); qp->mac = (unsigned char *) kmalloc(maclen, GFP_ATOMIC); if (qp->mac == NULL) { @@ -687,7 +687,7 @@ static struct ipq *ip_create(struct sk_buff *skb, struct iphdr *iph, struct devi } /* Fill in the structure. */ - memcpy(qp->mac, (skb + 1), maclen); + memcpy(qp->mac, skb->data, maclen); memcpy(qp->iph, iph, ihlen + 8); qp->len = 0; qp->ihlen = ihlen; @@ -760,7 +760,7 @@ static struct sk_buff *ip_glue(struct ipq *qp) /* Fill in the basic details. */ skb->len = (len - qp->maclen); - skb->h.raw = (unsigned char *) (skb + 1); + skb->h.raw = skb->data; skb->free = 1; skb->lock = 1; @@ -855,7 +855,7 @@ static struct sk_buff *ip_defrag(struct iphdr *iph, struct sk_buff *skb, struct end = offset + ntohs(iph->tot_len) - ihl; /* Point into the IP datagram 'data' part. */ - ptr = ((unsigned char *) (skb + 1)) + dev->hard_header_len + ihl; + ptr = skb->data + dev->hard_header_len + ihl; /* Is this the final fragment? */ if ((flags & IP_MF) == 0) @@ -967,7 +967,7 @@ static struct sk_buff *ip_defrag(struct iphdr *iph, struct sk_buff *skb, struct int offset; /* Point into the IP datagram header. */ - raw = (unsigned char *) (skb + 1); + raw = skb->data; iph = (struct iphdr *) (raw + dev->hard_header_len); /* Setup starting values. */ @@ -1026,7 +1026,7 @@ static struct sk_buff *ip_defrag(struct iphdr *iph, struct sk_buff *skb, struct skb2->arp = skb->arp; skb2->free = skb->free; skb2->len = len + hlen; - skb2->h.raw=(char *)(skb2+1); + skb2->h.raw=(char *) skb2->data; if (sk) sk->wmem_alloc += skb2->mem_len; @@ -1155,7 +1155,7 @@ ip_forward(struct sk_buff *skb, struct device *dev, int is_frag) printk("\nIP: No memory available for IP forward\n"); return; } - ptr = (unsigned char *)(skb2 + 1); + ptr = skb2->data; skb2->sk = NULL; skb2->free = 1; skb2->len = skb->len + dev2->hard_header_len; @@ -1199,6 +1199,7 @@ ip_rcv(struct sk_buff *skb, struct device *dev, struct packet_type *pt) DPRINTF((DBG_IP, "<<\n")); + skb->ip_hdr = iph; /* Fragments can cause ICMP errors too! */ /* Is the datagram acceptable? */ if (skb->len<sizeof(struct iphdr) || iph->ihl<5 || iph->version != 4 || ip_fast_csum((unsigned char *)iph, iph->ihl) !=0) { DPRINTF((DBG_IP, "\nIP: *** datagram error ***\n")); @@ -1363,7 +1364,7 @@ ip_queue_xmit(struct sock *sk, struct device *dev, skb->when = jiffies; DPRINTF((DBG_IP, ">>\n")); - ptr = (unsigned char *)(skb + 1); + ptr = skb->data; ptr += dev->hard_header_len; iph = (struct iphdr *)ptr; iph->tot_len = ntohs(skb->len-dev->hard_header_len); @@ -1450,7 +1451,7 @@ ip_retransmit(struct sock *sk, int all) the frame in twice. Because of the technique used this would be a little sad */ if (!skb->arp) { - if (dev->rebuild_header(skb+1, dev)) { + if (dev->rebuild_header(skb->data, dev)) { sti(); /* Failed to rebuild - next */ if (!all) break; skb = (struct sk_buff *)skb->link3; diff --git a/net/inet/loopback.c b/net/inet/loopback.c index 66203eb..a7e69e3 100644 --- a/net/inet/loopback.c +++ b/net/inet/loopback.c @@ -61,7 +61,7 @@ loopback_xmit(struct sk_buff *skb, struct device *dev) dev->tbusy = 1; sti(); - done = dev_rint((unsigned char *)(skb+1), skb->len, 0, dev); + done = dev_rint(skb->data, skb->len, 0, dev); if (skb->free) kfree_skb(skb, FREE_WRITE); while (done != 1) { diff --git a/net/inet/packet.c b/net/inet/packet.c index ec00afe..d6838e2 100644 --- a/net/inet/packet.c +++ b/net/inet/packet.c @@ -131,7 +131,7 @@ packet_sendto(struct sock *sk, unsigned char *from, int len, skb->mem_len = len + sizeof(*skb); skb->sk = sk; skb->free = 1; - memcpy_fromfs (skb+1, from, len); + memcpy_fromfs(skb->data, from, len); skb->len = len; skb->next = NULL; if (dev->flags & IFF_UP) dev->queue_xmit(skb, dev, sk->priority); @@ -214,7 +214,7 @@ packet_recvfrom(struct sock *sk, unsigned char *to, int len, return err; copied = min(len, skb->len); - memcpy_tofs(to, skb+1, copied); /* Don't use skb_copy_datagram here: We can't get frag chains */ + memcpy_tofs(to, skb->data, copied); /* Don't use skb_copy_datagram here: We can't get frag chains */ /* Copy the address. */ if (saddr) { diff --git a/net/inet/raw.c b/net/inet/raw.c index 249d0b2..72a4702 100644 --- a/net/inet/raw.c +++ b/net/inet/raw.c @@ -227,7 +227,7 @@ raw_sendto(struct sock *sk, unsigned char *from, int len, } /* verify_area(VERIFY_WRITE, from, len);*/ - memcpy_fromfs ((unsigned char *)(skb+1)+tmp, from, len); + memcpy_fromfs(skb->data + tmp, from, len); /* If we are using IPPROTO_RAW, we need to fill in the source address in the IP header */ @@ -236,7 +236,7 @@ raw_sendto(struct sock *sk, unsigned char *from, int len, unsigned char *buff; struct iphdr *iph; - buff = (unsigned char *)(skb + 1); + buff = skb->data; buff += tmp; iph = (struct iphdr *)buff; iph->saddr = sk->saddr; diff --git a/net/inet/skbuff.h b/net/inet/skbuff.h index a32f5a9..fb7595a 100644 --- a/net/inet/skbuff.h +++ b/net/inet/skbuff.h @@ -76,6 +76,8 @@ struct sk_buff { urg_used; unsigned char tries,lock; /* Lock is now unused */ unsigned short users; /* User count - see datagram.c (and soon seqpacket.c/stream.c) */ + unsigned long padding[0]; + unsigned char data[0]; }; #define SK_WMEM_MAX 8192 diff --git a/net/inet/tcp.c b/net/inet/tcp.c index f24226a..ade26c8 100644 --- a/net/inet/tcp.c +++ b/net/inet/tcp.c @@ -99,6 +99,8 @@ #include <asm/segment.h> #include <linux/mm.h> +#define USE_NAGLE + #define SEQ_TICK 3 unsigned long seq_offset; @@ -601,7 +603,7 @@ tcp_send_partial(struct sock *sk) skb = sk->send_tmp; /* If we have queued a header size packet.. */ - if(skb->len-(unsigned long)skb->h.th + (unsigned long)(skb+1)==sizeof(struct tcphdr)) + if(skb->len-(unsigned long)skb->h.th + (unsigned long)skb->data == sizeof(struct tcphdr)) { /* If its got a syn or fin its notionally included in the size..*/ if(!skb->h.th->syn && !skb->h.th->fin) @@ -616,11 +618,11 @@ tcp_send_partial(struct sock *sk) /* We need to complete and send the packet. */ tcp_send_check(skb->h.th, sk->saddr, sk->daddr, skb->len-(unsigned long)skb->h.th + - (unsigned long)(skb+1), sk); + (unsigned long)skb->data, sk); skb->h.seq = sk->send_seq; if (after(sk->send_seq , sk->window_seq) || - sk->retransmits || + (sk->retransmits && sk->timeout == TIME_WRITE) || sk->packets_out >= sk->cong_window) { DPRINTF((DBG_TCP, "sk->cong_window = %d, sk->packets_out = %d\n", sk->cong_window, sk->packets_out)); @@ -673,7 +675,7 @@ if (inet_debug == DBG_SLIP) printk("\rtcp_ack: malloc failed\n"); buff->mem_len = MAX_ACK_SIZE; buff->len = sizeof(struct tcphdr); buff->sk = sk; - t1 =(struct tcphdr *)(buff + 1); + t1 =(struct tcphdr *) buff->data; /* Put in the IP header and routing stuff. */ tmp = sk->prot->build_header(buff, sk->saddr, daddr, &dev, @@ -846,7 +848,7 @@ tcp_write(struct sock *sk, unsigned char *from, skb = sk->send_tmp; /* IP header + TCP header */ - hdrlen = ((unsigned long)skb->h.th - (unsigned long)(skb+1)) + hdrlen = ((unsigned long)skb->h.th - (unsigned long)skb->data) + sizeof(struct tcphdr); /* If sk->mtu has been changed this could cause problems. */ @@ -860,8 +862,7 @@ tcp_write(struct sock *sk, unsigned char *from, copy = 0; } - memcpy_fromfs((unsigned char *)(skb+1) + skb->len, - from, copy); + memcpy_fromfs(skb->data + skb->len, from, copy); skb->len += copy; from += copy; copied += copy; @@ -869,7 +870,7 @@ tcp_write(struct sock *sk, unsigned char *from, sk->send_seq += copy; } - if ((skb->len - hdrlen) > sk->mtu || (flags & MSG_OOB)) { + if ((skb->len - hdrlen) >= sk->mtu || (flags & MSG_OOB)) { tcp_send_partial(sk); } continue; @@ -947,7 +948,7 @@ tcp_write(struct sock *sk, unsigned char *from, skb->sk = sk; skb->free = 0; - buff =(unsigned char *)(skb+1); + buff = skb->data; /* * FIXME: we need to optimize this. @@ -996,7 +997,7 @@ tcp_write(struct sock *sk, unsigned char *from, skb->h.seq = sk->send_seq; if (after(sk->send_seq , sk->window_seq) || - sk->retransmits || + (sk->retransmits && sk->timeout == TIME_WRITE) || sk->packets_out >= sk->cong_window) { DPRINTF((DBG_TCP, "sk->cong_window = %d, sk->packets_out = %d\n", sk->cong_window, sk->packets_out)); @@ -1099,7 +1100,7 @@ tcp_read_wakeup(struct sock *sk) } buff->len += tmp; - t1 =(struct tcphdr *)((char *)(buff+1) +tmp); + t1 =(struct tcphdr *)(buff->data +tmp); memcpy(t1,(void *) &sk->dummy_th, sizeof(*t1)); t1->seq = ntohl(sk->send_seq); @@ -1562,7 +1563,7 @@ tcp_shutdown(struct sock *sk, int how) buff->mem_len = MAX_RESET_SIZE; buff->sk = sk; buff->len = sizeof(*t1); - t1 =(struct tcphdr *)(buff + 1); + t1 =(struct tcphdr *) buff->data; /* Put in the IP header and routing stuff. */ tmp = prot->build_header(buff,sk->saddr, sk->daddr, &dev, @@ -1577,7 +1578,7 @@ tcp_shutdown(struct sock *sk, int how) } t1 =(struct tcphdr *)((char *)t1 +tmp); - buff ->len += tmp; + buff->len += tmp; buff->dev = dev; memcpy(t1, th, sizeof(*t1)); t1->seq = ntohl(sk->send_seq); @@ -1673,7 +1674,7 @@ tcp_reset(unsigned long saddr, unsigned long daddr, struct tcphdr *th, buff->sk = NULL; buff->dev = dev; - t1 =(struct tcphdr *)(buff + 1); + t1 =(struct tcphdr *) buff->data; /* Put in the IP header and routing stuff. */ tmp = prot->build_header(buff, saddr, daddr, &dev, IPPROTO_TCP, opt, @@ -1908,7 +1909,7 @@ tcp_conn_request(struct sock *sk, struct sk_buff *skb, buff->len = sizeof(struct tcphdr)+4; buff->sk = newsk; - t1 =(struct tcphdr *)(buff + 1); + t1 =(struct tcphdr *) buff->data; /* Put in the IP header and routing stuff. */ tmp = sk->prot->build_header(buff, newsk->saddr, newsk->daddr, &dev, @@ -2058,7 +2059,7 @@ tcp_close(struct sock *sk, int timeout) buff->sk = sk; buff->free = 1; buff->len = sizeof(*t1); - t1 =(struct tcphdr *)(buff + 1); + t1 =(struct tcphdr *) buff->data; /* Put in the IP header and routing stuff. */ tmp = prot->build_header(buff,sk->saddr, sk->daddr, &dev, @@ -2072,7 +2073,7 @@ tcp_close(struct sock *sk, int timeout) } t1 =(struct tcphdr *)((char *)t1 +tmp); - buff ->len += tmp; + buff->len += tmp; buff->dev = dev; memcpy(t1, th, sizeof(*t1)); t1->seq = ntohl(sk->send_seq); @@ -2132,7 +2133,9 @@ tcp_write_xmit(struct sock *sk) while(sk->wfront != NULL && before(sk->wfront->h.seq, sk->window_seq) && - (sk->retransmits == 0 || before(sk->wfront->h.seq, sk->rcv_ack_seq +1)) + (sk->retransmits == 0 || + sk->timeout != TIME_WRITE || + before(sk->wfront->h.seq, sk->rcv_ack_seq +1)) && sk->packets_out < sk->cong_window) { skb = sk->wfront; IS_SKB(skb); @@ -2208,6 +2211,9 @@ tcp_ack(struct sock *sk, struct tcphdr *th, unsigned long saddr, int len) "sk->rcv_ack_seq=%d, sk->window_seq = %d\n", ack, ntohs(th->window), sk->rcv_ack_seq, sk->window_seq)); + if (sk->retransmits && sk->timeout == TIME_KEEPOPEN) + sk->retransmits = 0; + if (after(ack, sk->send_seq+1) || before(ack, sk->rcv_ack_seq-1)) { if (after(ack, sk->send_seq) || (sk->state != TCP_ESTABLISHED && sk->state != TCP_CLOSE_WAIT)) { @@ -2391,6 +2397,7 @@ tcp_ack(struct sock *sk, struct tcphdr *th, unsigned long saddr, int len) if (sk->wfront != NULL) { if (after (sk->window_seq, sk->wfront->h.seq) && (sk->retransmits == 0 || + sk->timeout != TIME_WRITE || before(sk->wfront->h.seq, sk->rcv_ack_seq +1)) && sk->packets_out < sk->cong_window) { flag |= 1; @@ -2891,7 +2898,7 @@ tcp_connect(struct sock *sk, struct sockaddr_in *usin, int addr_len) buff->len = 24; buff->sk = sk; buff->free = 1; - t1 = (struct tcphdr *)(buff + 1); + t1 = (struct tcphdr *) buff->data; /* Put in the IP header and routing stuff. */ /* We need to build the routing stuff fromt the things saved in skb. */ @@ -2995,10 +3002,19 @@ tcp_sequence(struct sock *sk, struct tcphdr *th, short len, return(0); } +#ifdef undef +/* + * if we do this, we won't respond to keepalive packets, since those + * are slightly out of window, and we have to generate an ack + * a late ack out still not to have a sequence number less than + * one we've seen before. Berkeley doesn't seem to do this, but it's + * always hard to be sure. + */ /* In case it's just a late ack, let it through. */ if (th->ack && len == (th->doff * 4) && after(th->seq, sk->acked_seq - 32767) && !th->fin && !th->syn) return(1); +#endif if (!th->rst) { /* Try to resync things. */ @@ -3159,9 +3175,12 @@ if (inet_debug == DBG_SLIP) printk("\rtcp_rcv: bad checksum\n"); case TCP_TIME_WAIT: if (!tcp_sequence(sk, th, len, opt, saddr,dev)) { if (inet_debug == DBG_SLIP) printk("\rtcp_rcv: not in seq\n"); +#ifdef undef +/* nice idea, but tcp_sequence already does this. Maybe it shouldn't?? */ if(!th->rst) tcp_send_ack(sk->send_seq, sk->acked_seq, sk, th, saddr); +#endif kfree_skb(skb, FREE_READ); release_sock(sk); return(0); @@ -3453,7 +3472,7 @@ tcp_write_wakeup(struct sock *sk) buff->free = 1; buff->sk = sk; DPRINTF((DBG_TCP, "in tcp_write_wakeup\n")); - t1 = (struct tcphdr *)(buff + 1); + t1 = (struct tcphdr *) buff->data; /* Put in the IP header and routing stuff. */ tmp = sk->prot->build_header(buff, sk->saddr, sk->daddr, &dev, diff --git a/net/inet/udp.c b/net/inet/udp.c index d6e8328..4bf82dc 100644 --- a/net/inet/udp.c +++ b/net/inet/udp.c @@ -244,7 +244,7 @@ udp_send(struct sock *sk, struct sockaddr_in *sin, skb->arp = 0; /* Now build the IP and MAC header. */ - buff = (unsigned char *) (skb+1); + buff = skb->data; saddr = 0; dev = NULL; DPRINTF((DBG_UDP, "UDP: >> IP_Header: %X -> %X dev=%X prot=%X len=%d\n", |