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 <netdb.h> 1222514Sdarrenr#include <ctype.h> 1322514Sdarrenr#include <fcntl.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/stropts.h> 2322514Sdarrenr 2431183Speter#ifdef sun 25145510Sdarrenr# include <sys/pfmod.h> 26145510Sdarrenr# include <sys/bufmod.h> 2731183Speter#endif 28145510Sdarrenr#ifdef __osf__ 29145510Sdarrenr# include <sys/dlpihdr.h> 30145510Sdarrenr#else 31145510Sdarrenr# include <sys/dlpi.h> 32145510Sdarrenr#endif 33145510Sdarrenr#ifdef __hpux 34145510Sdarrenr# include <sys/dlpi_ext.h> 35145510Sdarrenr#endif 3622514Sdarrenr 3722514Sdarrenr#include <net/if.h> 3822514Sdarrenr#include <netinet/in.h> 3922514Sdarrenr#include <netinet/in_systm.h> 4022514Sdarrenr#include <netinet/ip.h> 4122514Sdarrenr#include <netinet/if_ether.h> 4222514Sdarrenr#include <netinet/ip_var.h> 4322514Sdarrenr#include <netinet/udp.h> 4422514Sdarrenr#include <netinet/udp_var.h> 4522514Sdarrenr#include <netinet/tcp.h> 4622514Sdarrenr 4724583Sdarrenr#include "ipsend.h" 4822514Sdarrenr 4931183Speter#if !defined(lint) 5031183Speterstatic const char sccsid[] = "@(#)sdlpi.c 1.3 10/30/95 (C)1995 Darren Reed"; 51255332Scystatic const char rcsid[] = "@(#)$Id$"; 5222514Sdarrenr#endif 5322514Sdarrenr 5422514Sdarrenr#define CHUNKSIZE 8192 5522514Sdarrenr#define BUFSPACE (4*CHUNKSIZE) 5622514Sdarrenr 5722514Sdarrenr 5822514Sdarrenr/* 5922514Sdarrenr * Be careful to only include those defined in the flags option for the 6022514Sdarrenr * interface are included in the header size. 6122514Sdarrenr */ 62145510Sdarrenrint initdevice(device, tout) 63255332Scy char *device; 64255332Scy int tout; 6522514Sdarrenr{ 6622514Sdarrenr char devname[16], *s, buf[256]; 6722514Sdarrenr int i, fd; 6822514Sdarrenr 6980486Sdarrenr (void) strcpy(devname, "/dev/"); 7080486Sdarrenr (void) strncat(devname, device, sizeof(devname) - strlen(devname)); 7122514Sdarrenr 7222514Sdarrenr s = devname + 5; 73145510Sdarrenr while (*s && !ISDIGIT(*s)) 7422514Sdarrenr s++; 7522514Sdarrenr if (!*s) 7622514Sdarrenr { 7722514Sdarrenr fprintf(stderr, "bad device name %s\n", devname); 7822514Sdarrenr exit(-1); 7922514Sdarrenr } 8022514Sdarrenr i = atoi(s); 8122514Sdarrenr *s = '\0'; 8222514Sdarrenr /* 8322514Sdarrenr * For writing 8422514Sdarrenr */ 8522514Sdarrenr if ((fd = open(devname, O_RDWR)) < 0) 8622514Sdarrenr { 8722514Sdarrenr fprintf(stderr, "O_RDWR(1) "); 8822514Sdarrenr perror(devname); 8922514Sdarrenr exit(-1); 9022514Sdarrenr } 9122514Sdarrenr 92145510Sdarrenr if (dlattachreq(fd, i) == -1) 9322514Sdarrenr { 94145510Sdarrenr fprintf(stderr, "dlattachreq: DLPI error\n"); 9522514Sdarrenr exit(-1); 9622514Sdarrenr } 97145510Sdarrenr else if (dlokack(fd, buf) == -1) 98145510Sdarrenr { 99145510Sdarrenr fprintf(stderr, "dlokack(attach): DLPI error\n"); 100145510Sdarrenr exit(-1); 101145510Sdarrenr } 102145510Sdarrenr#ifdef DL_HP_RAWDLS 103145510Sdarrenr if (dlpromisconreq(fd, DL_PROMISC_SAP) < 0) 104145510Sdarrenr { 105145510Sdarrenr fprintf(stderr, "dlpromisconreq: DL_PROMISC_PHYS error\n"); 106145510Sdarrenr exit(-1); 107145510Sdarrenr } 108145510Sdarrenr else if (dlokack(fd, buf) < 0) 109145510Sdarrenr { 110145510Sdarrenr fprintf(stderr, "dlokack(promisc): DLPI error\n"); 111145510Sdarrenr exit(-1); 112145510Sdarrenr } 113145510Sdarrenr /* 22 is INSAP as per the HP-UX DLPI Programmer's Guide */ 114145510Sdarrenr 115145510Sdarrenr dlbindreq(fd, 22, 1, DL_HP_RAWDLS, 0, 0); 116145510Sdarrenr#else 11722514Sdarrenr dlbindreq(fd, ETHERTYPE_IP, 0, DL_CLDLS, 0, 0); 118145510Sdarrenr#endif 11922514Sdarrenr dlbindack(fd, buf); 12022514Sdarrenr /* 12122514Sdarrenr * write full headers 12222514Sdarrenr */ 123145510Sdarrenr#ifdef DLIOCRAW /* we require RAW DLPI mode, which is a Sun extension */ 12422514Sdarrenr if (strioctl(fd, DLIOCRAW, -1, 0, NULL) == -1) 12522514Sdarrenr { 12622514Sdarrenr fprintf(stderr, "DLIOCRAW error\n"); 12722514Sdarrenr exit(-1); 12822514Sdarrenr } 12931183Speter#endif 13022514Sdarrenr return fd; 13122514Sdarrenr} 13222514Sdarrenr 13322514Sdarrenr 13422514Sdarrenr/* 13522514Sdarrenr * output an IP packet onto a fd opened for /dev/nit 13622514Sdarrenr */ 13722514Sdarrenrint sendip(fd, pkt, len) 138255332Scy int fd, len; 139255332Scy char *pkt; 140255332Scy{ 141145510Sdarrenr struct strbuf dbuf, *dp = &dbuf, *cp = NULL; 142145510Sdarrenr int pri = 0; 143145510Sdarrenr#ifdef DL_HP_RAWDLS 144145510Sdarrenr struct strbuf cbuf; 145145510Sdarrenr dl_hp_rawdata_req_t raw; 14622514Sdarrenr 147145510Sdarrenr cp = &cbuf; 148145510Sdarrenr raw.dl_primitive = DL_HP_RAWDATA_REQ; 149145510Sdarrenr cp->len = sizeof(raw); 150145510Sdarrenr cp->buf = (char *)&raw; 151145510Sdarrenr cp->maxlen = cp->len; 152145510Sdarrenr pri = MSG_HIPRI; 153145510Sdarrenr#endif 15422514Sdarrenr /* 15522514Sdarrenr * construct NIT STREAMS messages, first control then data. 15622514Sdarrenr */ 15722514Sdarrenr dp->buf = pkt; 15822514Sdarrenr dp->len = len; 15922514Sdarrenr dp->maxlen = dp->len; 16022514Sdarrenr 161145510Sdarrenr if (putmsg(fd, cp, dp, pri) == -1) 16222514Sdarrenr { 16322514Sdarrenr perror("putmsg"); 16422514Sdarrenr return -1; 16522514Sdarrenr } 16622514Sdarrenr if (ioctl(fd, I_FLUSH, FLUSHW) == -1) 16722514Sdarrenr { 16822514Sdarrenr perror("I_FLUSHW"); 16922514Sdarrenr return -1; 17022514Sdarrenr } 17122514Sdarrenr return len; 17222514Sdarrenr} 173145510Sdarrenr 174