VERSION = 0.99
PATCHLEVEL = 14
-ALPHA = r
+ALPHA = s
all: Version zImage
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
#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;
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);
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;
/* 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 {
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);
* 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;
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);
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) {
* 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;
/*
{
struct ethhdr *eth;
- eth = (struct ethhdr *) (skb + 1);
+ eth = (struct ethhdr *) skb->data;
arp_add(addr, eth->h_source, 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));
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,
/* 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;
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;
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;
unsigned char *ptr;
int mac;
- ptr = (unsigned char *)(skb + 1);
+ ptr = skb->data;
mac = 0;
skb->arp = 1;
if (dev->hard_header) {
" 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) {
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)
{
}
/* 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;
/* 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;
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)
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. */
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;
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;
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"));
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);
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;
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) {
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);
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) {
}
/* 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 */
unsigned char *buff;
struct iphdr *iph;
- buff = (unsigned char *)(skb + 1);
+ buff = skb->data;
buff += tmp;
iph = (struct iphdr *)buff;
iph->saddr = sk->saddr;
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
#include <asm/segment.h>
#include <linux/mm.h>
+#define USE_NAGLE
+
#define SEQ_TICK 3
unsigned long seq_offset;
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)
/* 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));
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,
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. */
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;
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;
skb->sk = sk;
skb->free = 0;
- buff =(unsigned char *)(skb+1);
+ buff = skb->data;
/*
* FIXME: we need to optimize this.
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));
}
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);
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,
}
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);
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,
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,
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,
}
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);
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);
"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)) {
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;
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. */
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. */
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);
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,
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",