diff -u --recursive v1.0.6/linux/Makefile linux/Makefile --- v1.0.6/linux/Makefile Fri Mar 18 10:21:30 1994 +++ linux/Makefile Wed Apr 6 13:13:31 1994 @@ -1,6 +1,6 @@ VERSION = 1 PATCHLEVEL = 0 -SUBLEVEL = 6 +SUBLEVEL = 7 all: Version zImage diff -u --recursive --new-file v1.0.6/linux/net/inet/tcp.c linux/net/inet/tcp.c --- v1.0.6/linux/net/inet/tcp.c Fri Mar 18 10:21:35 1994 +++ linux/net/inet/tcp.c Wed Apr 6 13:13:35 1994 @@ -3404,6 +3404,16 @@ release_sock(sk); return(0); + case TCP_SYN_RECV: + if (th->syn) { + /* Probably a retransmitted syn */ + printk("syn while in TCP_SYN_RECV\n"); + kfree_skb(skb, FREE_READ); + release_sock(sk); + return(0); + } + + default: if (!tcp_sequence(sk, th, len, opt, saddr,dev)) { kfree_skb(skb, FREE_READ); diff -u --recursive --new-file v1.0.6/linux/net/inet/icmp.c linux/net/inet/icmp.c --- v1.0.6/linux/net/inet/icmp.c Tue Mar 1 18:51:41 1994 +++ linux/net/inet/icmp.c Wed Apr 6 13:13:33 1994 @@ -285,6 +285,65 @@ } +/* Handle ICMP Timestamp requests. */ +static void +icmp_timestamp(struct icmphdr *icmph, struct sk_buff *skb, struct device *dev, + unsigned long saddr, unsigned long daddr, int len, + struct options *opt) +{ + struct icmphdr *icmphr; + struct sk_buff *skb2; + int size, offset; + unsigned long *timeptr, midtime; + extern struct timeval xtime; /* kernel/time.c */ + + size = sizeof(struct sk_buff) + dev->hard_header_len + 64 + len; + if (! (skb2 = alloc_skb(size, GFP_ATOMIC))) { + skb->sk = NULL; + kfree_skb(skb, FREE_READ); + return; + } + skb2->sk = NULL; + skb2->mem_addr = skb2; + skb2->mem_len = size; + skb2->free = 1; + + /* Build Layer 2-3 headers for message back to source */ + offset = ip_build_header(skb2, daddr, saddr, &dev, IPPROTO_ICMP, opt, len, + skb->ip_hdr->tos, 255); + if (offset < 0) { + printk("ICMP: Could not build IP Header for ICMP TIMESTAMP Response\n"); + kfree_skb(skb2, FREE_WRITE); + skb->sk = NULL; + kfree_skb(skb, FREE_READ); + return; + } + + /* Re-adjust length according to actual IP header size. */ + skb2->len = offset + len; + + /* Build ICMP_TIMESTAMP Response message. */ + icmphr = (struct icmphdr *) ((char *) (skb2 + 1) + offset); + memcpy((char *) icmphr, (char *) icmph, len); + icmphr->type = ICMP_TIMESTAMPREPLY; + icmphr->code = icmphr->checksum = 0; + + /* fill in the current time as ms since midnight UT: */ + midtime = (xtime.tv_sec % 86400) * 1000 + xtime.tv_usec / 1000; + timeptr = (unsigned long *) (icmphr + 1); + /* the originate timestamp (timeptr [0]) is still in the copy: */ + timeptr [1] = timeptr [2] = htonl(midtime); + + icmphr->checksum = ip_compute_csum((unsigned char *) icmphr, len); + + /* Ship it out - free it when done */ + ip_queue_xmit((struct sock *) NULL, dev, skb2, 1); + + skb->sk = NULL; + kfree_skb(skb, FREE_READ); +} + + /* Handle the ICMP INFORMATION REQUEST. */ static void icmp_info(struct icmphdr *icmph, struct sk_buff *skb, struct device *dev, @@ -397,6 +456,13 @@ icmp_echo(icmph, skb1, dev, saddr, daddr, len, opt); return 0; case ICMP_ECHOREPLY: + skb1->sk = NULL; + kfree_skb(skb1, FREE_READ); + return(0); + case ICMP_TIMESTAMP: + icmp_timestamp(icmph, skb1, dev, saddr, daddr, len, opt); + return 0; + case ICMP_TIMESTAMPREPLY: skb1->sk = NULL; kfree_skb(skb1, FREE_READ); return(0);