1145519Sdarrenr/*	$FreeBSD$	*/
2145510Sdarrenr
322514Sdarrenr/*
453024Sguido * (C)opyright 1992-1998 Darren Reed. (from tcplog)
522514Sdarrenr *
680486Sdarrenr * See the IPFILTER.LICENCE file for details on licencing.
7145510Sdarrenr *
822514Sdarrenr */
922514Sdarrenr
1022514Sdarrenr#include <stdio.h>
1122514Sdarrenr#include <string.h>
1222514Sdarrenr#include <netdb.h>
1322514Sdarrenr#include <ctype.h>
1422514Sdarrenr#include <signal.h>
1522514Sdarrenr#include <errno.h>
1622514Sdarrenr#include <sys/types.h>
1722514Sdarrenr#include <sys/time.h>
1822514Sdarrenr#include <sys/timeb.h>
1922514Sdarrenr#include <sys/socket.h>
2022514Sdarrenr#include <sys/file.h>
2122514Sdarrenr#include <sys/ioctl.h>
2222514Sdarrenr#include <sys/dir.h>
2322514Sdarrenr#include <linux/netdevice.h>
2422514Sdarrenr#include <net/if.h>
2522514Sdarrenr#include <netinet/in.h>
2622514Sdarrenr#include <netinet/in_systm.h>
2722514Sdarrenr#include <netinet/ip.h>
2822514Sdarrenr#include <netinet/tcp.h>
2924583Sdarrenr#include "ipsend.h"
3022514Sdarrenr
3131183Speter#if !defined(lint)
3231183Speterstatic const char sccsid[] = "@(#)slinux.c	1.2 8/25/95";
33255332Scystatic const char rcsid[] = "@(#)$Id$";
3422514Sdarrenr#endif
3522514Sdarrenr
3622514Sdarrenr#define	CHUNKSIZE	8192
3722514Sdarrenr#define BUFSPACE	(4*CHUNKSIZE)
3822514Sdarrenr
3922514Sdarrenr/*
4022514Sdarrenr * Be careful to only include those defined in the flags option for the
4122514Sdarrenr * interface are included in the header size.
4222514Sdarrenr */
4322514Sdarrenr
4422514Sdarrenrstatic	int	timeout;
4522514Sdarrenrstatic	char	*eth_dev = NULL;
4622514Sdarrenr
4722514Sdarrenr
48145510Sdarrenrint	initdevice(dev, spare)
49255332Scy	char	*dev;
50255332Scy	int	spare;
5122514Sdarrenr{
5222514Sdarrenr	int fd;
5322514Sdarrenr
5422514Sdarrenr	eth_dev = strdup(dev);
5522514Sdarrenr	if ((fd = socket(AF_INET, SOCK_PACKET, htons(ETHERTYPE_IP))) == -1)
5622514Sdarrenr	    {
5722514Sdarrenr		perror("socket(SOCK_PACKET)");
5822514Sdarrenr		exit(-1);
5922514Sdarrenr	    }
6022514Sdarrenr
6122514Sdarrenr	return fd;
6222514Sdarrenr}
6322514Sdarrenr
6422514Sdarrenr
6522514Sdarrenr/*
6622514Sdarrenr * output an IP packet onto a fd opened for /dev/nit
6722514Sdarrenr */
6822514Sdarrenrint	sendip(fd, pkt, len)
69255332Scy	int	fd, len;
70255332Scy	char	*pkt;
7122514Sdarrenr{
7222514Sdarrenr	struct	sockaddr	s;
7322514Sdarrenr	struct	ifreq	ifr;
7422514Sdarrenr
7522514Sdarrenr	strncpy(ifr.ifr_name, eth_dev, sizeof(ifr.ifr_name));
7622514Sdarrenr	if (ioctl(fd, SIOCGIFHWADDR, &ifr) == -1)
7722514Sdarrenr	    {
7822514Sdarrenr		perror("SIOCGIFHWADDR");
7922514Sdarrenr		return -1;
8022514Sdarrenr	    }
8122514Sdarrenr	bcopy(ifr.ifr_hwaddr.sa_data, pkt + 6, 6);
8222514Sdarrenr	s.sa_family = ETHERTYPE_IP;
8322514Sdarrenr	strncpy(s.sa_data, eth_dev, sizeof(s.sa_data));
8422514Sdarrenr
8522514Sdarrenr	if (sendto(fd, pkt, len, 0, &s, sizeof(s)) == -1)
8622514Sdarrenr	    {
8722514Sdarrenr		perror("send");
8822514Sdarrenr		return -1;
8922514Sdarrenr	    }
9022514Sdarrenr
9122514Sdarrenr	return len;
9222514Sdarrenr}
93