]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - contrib/ipfilter/ipsd/slinux.c
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / contrib / ipfilter / ipsd / slinux.c
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
31 static 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
41 static  int     timeout;
42 static  char    *eth_dev = NULL;
43
44
45 int     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
63 void    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
104 int     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 }