1/* $FreeBSD$ */ 2 3/* 4 * (C)opyright 1992-1998 Darren Reed. (from tcplog) 5 * 6 * See the IPFILTER.LICENCE file for details on licencing. 7 * 8 */ 9 10#include <stdio.h> 11#include <netdb.h> 12#include <ctype.h> 13#include <signal.h> 14#include <errno.h> 15#include <sys/types.h> 16#include <sys/time.h> 17#include <sys/timeb.h> 18#include <sys/socket.h> 19#include <sys/file.h> 20#include <sys/ioctl.h> 21#include <sys/dir.h> 22#include <linux/netdevice.h> 23#include <net/if.h> 24#include <netinet/in.h> 25#include <netinet/ip.h> 26#include <netinet/tcp.h> 27#include "ip_compat.h" 28#include "tcpip.h" 29 30#ifndef lint 31static const char sccsid[] = "@(#)slinux.c 1.1 12/3/95 (C) 1995 Darren Reed"; 32#endif 33 34#define BUFSPACE 32768 35 36/* 37 * Be careful to only include those defined in the flags option for the 38 * interface are included in the header size. 39 */ 40 41static int timeout; 42static char *eth_dev = NULL; 43 44 45int ack_recv(bp) 46 char *bp; 47{ 48 struct tcpip tip; 49 tcphdr_t *tcp; 50 ip_t *ip; 51 52 ip = (struct ip *)&tip; 53 tcp = (tcphdr_t *)(ip + 1); 54 55 bcopy(bp, (char *)&tip, sizeof(tip)); 56 bcopy(bp + (ip.ip_hl << 2), (char *)tcp, sizeof(*tcp)); 57 if (0 == detect(ip, tcp)) 58 return 1; 59 return 0; 60} 61 62 63void readloop(fd, port, dst) 64 int fd, port; 65 struct in_addr dst; 66{ 67 static u_char buf[BUFSPACE]; 68 struct sockaddr dest; 69 register u_char *bp = buf; 70 register int cc; 71 int dlen, done = 0; 72 time_t now = time(NULL); 73 74 do { 75 fflush(stdout); 76 dlen = sizeof(dest); 77 bzero((char *)&dest, dlen); 78 cc = recvfrom(fd, buf, BUFSPACE, 0, &dest, &dlen); 79 if (!cc) 80 if ((time(NULL) - now) > timeout) 81 return done; 82 else 83 continue; 84 85 if (bp[12] != 0x8 || bp[13] != 0) 86 continue; /* not ip */ 87 88 /* 89 * get rid of non-tcp or fragmented packets here. 90 */ 91 if (cc >= sizeof(struct tcpiphdr)) 92 { 93 if (((bp[14+9] != IPPROTO_TCP) && 94 (bp[14+9] != IPPROTO_UDP)) || 95 (bp[14+6] & 0x1f) || (bp[14+6] & 0xff)) 96 continue; 97 done += ack_recv(bp + 14); 98 } 99 } while (cc >= 0); 100 perror("read"); 101 exit(-1); 102} 103 104int initdevice(dev, tout) 105 char *dev; 106 int tout; 107{ 108 int fd; 109 110 eth_dev = strdup(dev); 111 if ((fd = socket(AF_INET, SOCK_PACKET, htons(ETHERTYPE_IP))) == -1) 112 { 113 perror("socket(SOCK_PACKET)"); 114 exit(-1); 115 } 116 117 return fd; 118} 119