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