/* $NetBSD: slinux.c,v 1.2 2002/01/24 08:21:41 martti Exp $ */ /* * (C)opyright 1992-1998 Darren Reed. (from tcplog) * * See the IPFILTER.LICENCE file for details on licencing. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ipsend.h" #if !defined(lint) static const char sccsid[] = "@(#)slinux.c 1.2 8/25/95"; static const char rcsid[] = "@(#)Id: slinux.c,v 2.1.4.1 2001/06/26 10:43:22 darrenr Exp"; #endif #define CHUNKSIZE 8192 #define BUFSPACE (4*CHUNKSIZE) /* * Be careful to only include those defined in the flags option for the * interface are included in the header size. */ static int timeout; static char *eth_dev = NULL; int initdevice(dev, sport, spare) char *dev; int sport, spare; { int fd; eth_dev = strdup(dev); if ((fd = socket(AF_INET, SOCK_PACKET, htons(ETHERTYPE_IP))) == -1) { perror("socket(SOCK_PACKET)"); exit(-1); } return fd; } /* * output an IP packet onto a fd opened for /dev/nit */ int sendip(fd, pkt, len) int fd, len; char *pkt; { struct sockaddr s; struct ifreq ifr; strncpy(ifr.ifr_name, eth_dev, sizeof(ifr.ifr_name)); if (ioctl(fd, SIOCGIFHWADDR, &ifr) == -1) { perror("SIOCGIFHWADDR"); return -1; } bcopy(ifr.ifr_hwaddr.sa_data, pkt + 6, 6); s.sa_family = ETHERTYPE_IP; strncpy(s.sa_data, eth_dev, sizeof(s.sa_data)); if (sendto(fd, pkt, len, 0, &s, sizeof(s)) == -1) { perror("send"); return -1; } return len; }