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> 30170268Sdarrenr# include "radix_ipf_local.h" 31145510Sdarrenr#else 32145510Sdarrenr# include <sys/dlpi.h> 33145510Sdarrenr#endif 34145510Sdarrenr#ifdef __hpux 35145510Sdarrenr# include <sys/dlpi_ext.h> 36145510Sdarrenr#endif 3722514Sdarrenr 3822514Sdarrenr#include <net/if.h> 3922514Sdarrenr#include <netinet/in.h> 4022514Sdarrenr#include <netinet/in_systm.h> 4122514Sdarrenr#include <netinet/ip.h> 4222514Sdarrenr#include <netinet/if_ether.h> 4322514Sdarrenr#include <netinet/ip_var.h> 4422514Sdarrenr#include <netinet/udp.h> 4522514Sdarrenr#include <netinet/udp_var.h> 4622514Sdarrenr#include <netinet/tcp.h> 4722514Sdarrenr 4824583Sdarrenr#include "ipsend.h" 4922514Sdarrenr 5031183Speter#if !defined(lint) 5131183Speterstatic const char sccsid[] = "@(#)sdlpi.c 1.3 10/30/95 (C)1995 Darren Reed"; 52170268Sdarrenrstatic const char rcsid[] = "@(#)$Id: sdlpi.c,v 2.8.2.2 2007/02/17 12:41:51 darrenr Exp $"; 5322514Sdarrenr#endif 5422514Sdarrenr 5522514Sdarrenr#define CHUNKSIZE 8192 5622514Sdarrenr#define BUFSPACE (4*CHUNKSIZE) 5722514Sdarrenr 5822514Sdarrenr 5922514Sdarrenr/* 6022514Sdarrenr * Be careful to only include those defined in the flags option for the 6122514Sdarrenr * interface are included in the header size. 6222514Sdarrenr */ 63145510Sdarrenrint initdevice(device, tout) 6422514Sdarrenrchar *device; 65145510Sdarrenrint tout; 6622514Sdarrenr{ 6722514Sdarrenr char devname[16], *s, buf[256]; 6822514Sdarrenr int i, fd; 6922514Sdarrenr 7080486Sdarrenr (void) strcpy(devname, "/dev/"); 7180486Sdarrenr (void) strncat(devname, device, sizeof(devname) - strlen(devname)); 7222514Sdarrenr 7322514Sdarrenr s = devname + 5; 74145510Sdarrenr while (*s && !ISDIGIT(*s)) 7522514Sdarrenr s++; 7622514Sdarrenr if (!*s) 7722514Sdarrenr { 7822514Sdarrenr fprintf(stderr, "bad device name %s\n", devname); 7922514Sdarrenr exit(-1); 8022514Sdarrenr } 8122514Sdarrenr i = atoi(s); 8222514Sdarrenr *s = '\0'; 8322514Sdarrenr /* 8422514Sdarrenr * For writing 8522514Sdarrenr */ 8622514Sdarrenr if ((fd = open(devname, O_RDWR)) < 0) 8722514Sdarrenr { 8822514Sdarrenr fprintf(stderr, "O_RDWR(1) "); 8922514Sdarrenr perror(devname); 9022514Sdarrenr exit(-1); 9122514Sdarrenr } 9222514Sdarrenr 93145510Sdarrenr if (dlattachreq(fd, i) == -1) 9422514Sdarrenr { 95145510Sdarrenr fprintf(stderr, "dlattachreq: DLPI error\n"); 9622514Sdarrenr exit(-1); 9722514Sdarrenr } 98145510Sdarrenr else if (dlokack(fd, buf) == -1) 99145510Sdarrenr { 100145510Sdarrenr fprintf(stderr, "dlokack(attach): DLPI error\n"); 101145510Sdarrenr exit(-1); 102145510Sdarrenr } 103145510Sdarrenr#ifdef DL_HP_RAWDLS 104145510Sdarrenr if (dlpromisconreq(fd, DL_PROMISC_SAP) < 0) 105145510Sdarrenr { 106145510Sdarrenr fprintf(stderr, "dlpromisconreq: DL_PROMISC_PHYS error\n"); 107145510Sdarrenr exit(-1); 108145510Sdarrenr } 109145510Sdarrenr else if (dlokack(fd, buf) < 0) 110145510Sdarrenr { 111145510Sdarrenr fprintf(stderr, "dlokack(promisc): DLPI error\n"); 112145510Sdarrenr exit(-1); 113145510Sdarrenr } 114145510Sdarrenr /* 22 is INSAP as per the HP-UX DLPI Programmer's Guide */ 115145510Sdarrenr 116145510Sdarrenr dlbindreq(fd, 22, 1, DL_HP_RAWDLS, 0, 0); 117145510Sdarrenr#else 11822514Sdarrenr dlbindreq(fd, ETHERTYPE_IP, 0, DL_CLDLS, 0, 0); 119145510Sdarrenr#endif 12022514Sdarrenr dlbindack(fd, buf); 12122514Sdarrenr /* 12222514Sdarrenr * write full headers 12322514Sdarrenr */ 124145510Sdarrenr#ifdef DLIOCRAW /* we require RAW DLPI mode, which is a Sun extension */ 12522514Sdarrenr if (strioctl(fd, DLIOCRAW, -1, 0, NULL) == -1) 12622514Sdarrenr { 12722514Sdarrenr fprintf(stderr, "DLIOCRAW error\n"); 12822514Sdarrenr exit(-1); 12922514Sdarrenr } 13031183Speter#endif 13122514Sdarrenr return fd; 13222514Sdarrenr} 13322514Sdarrenr 13422514Sdarrenr 13522514Sdarrenr/* 13622514Sdarrenr * output an IP packet onto a fd opened for /dev/nit 13722514Sdarrenr */ 13822514Sdarrenrint sendip(fd, pkt, len) 13922514Sdarrenrint fd, len; 14022514Sdarrenrchar *pkt; 14122514Sdarrenr{ 142145510Sdarrenr struct strbuf dbuf, *dp = &dbuf, *cp = NULL; 143145510Sdarrenr int pri = 0; 144145510Sdarrenr#ifdef DL_HP_RAWDLS 145145510Sdarrenr struct strbuf cbuf; 146145510Sdarrenr dl_hp_rawdata_req_t raw; 14722514Sdarrenr 148145510Sdarrenr cp = &cbuf; 149145510Sdarrenr raw.dl_primitive = DL_HP_RAWDATA_REQ; 150145510Sdarrenr cp->len = sizeof(raw); 151145510Sdarrenr cp->buf = (char *)&raw; 152145510Sdarrenr cp->maxlen = cp->len; 153145510Sdarrenr pri = MSG_HIPRI; 154145510Sdarrenr#endif 15522514Sdarrenr /* 15622514Sdarrenr * construct NIT STREAMS messages, first control then data. 15722514Sdarrenr */ 15822514Sdarrenr dp->buf = pkt; 15922514Sdarrenr dp->len = len; 16022514Sdarrenr dp->maxlen = dp->len; 16122514Sdarrenr 162145510Sdarrenr if (putmsg(fd, cp, dp, pri) == -1) 16322514Sdarrenr { 16422514Sdarrenr perror("putmsg"); 16522514Sdarrenr return -1; 16622514Sdarrenr } 16722514Sdarrenr if (ioctl(fd, I_FLUSH, FLUSHW) == -1) 16822514Sdarrenr { 16922514Sdarrenr perror("I_FLUSHW"); 17022514Sdarrenr return -1; 17122514Sdarrenr } 17222514Sdarrenr return len; 17322514Sdarrenr} 174145510Sdarrenr 175