1145519Sdarrenr/* $FreeBSD: stable/11/contrib/ipfilter/ipsend/sdlpi.c 344833 2019-03-06 02:37:25Z cy $ */ 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# include <sys/dlpi.h> 2922514Sdarrenr 3022514Sdarrenr#include <net/if.h> 3122514Sdarrenr#include <netinet/in.h> 3222514Sdarrenr#include <netinet/in_systm.h> 3322514Sdarrenr#include <netinet/ip.h> 3422514Sdarrenr#include <netinet/if_ether.h> 3522514Sdarrenr#include <netinet/ip_var.h> 3622514Sdarrenr#include <netinet/udp.h> 3722514Sdarrenr#include <netinet/udp_var.h> 3822514Sdarrenr#include <netinet/tcp.h> 3922514Sdarrenr 4024583Sdarrenr#include "ipsend.h" 4122514Sdarrenr 4231183Speter#if !defined(lint) 4331183Speterstatic const char sccsid[] = "@(#)sdlpi.c 1.3 10/30/95 (C)1995 Darren Reed"; 44255332Scystatic const char rcsid[] = "@(#)$Id$"; 4522514Sdarrenr#endif 4622514Sdarrenr 4722514Sdarrenr#define CHUNKSIZE 8192 4822514Sdarrenr#define BUFSPACE (4*CHUNKSIZE) 4922514Sdarrenr 5022514Sdarrenr 5122514Sdarrenr/* 5222514Sdarrenr * Be careful to only include those defined in the flags option for the 5322514Sdarrenr * interface are included in the header size. 5422514Sdarrenr */ 55145510Sdarrenrint initdevice(device, tout) 56255332Scy char *device; 57255332Scy int tout; 5822514Sdarrenr{ 5922514Sdarrenr char devname[16], *s, buf[256]; 6022514Sdarrenr int i, fd; 6122514Sdarrenr 6280486Sdarrenr (void) strcpy(devname, "/dev/"); 6380486Sdarrenr (void) strncat(devname, device, sizeof(devname) - strlen(devname)); 6422514Sdarrenr 6522514Sdarrenr s = devname + 5; 66145510Sdarrenr while (*s && !ISDIGIT(*s)) 6722514Sdarrenr s++; 6822514Sdarrenr if (!*s) 6922514Sdarrenr { 7022514Sdarrenr fprintf(stderr, "bad device name %s\n", devname); 7122514Sdarrenr exit(-1); 7222514Sdarrenr } 7322514Sdarrenr i = atoi(s); 7422514Sdarrenr *s = '\0'; 7522514Sdarrenr /* 7622514Sdarrenr * For writing 7722514Sdarrenr */ 7822514Sdarrenr if ((fd = open(devname, O_RDWR)) < 0) 7922514Sdarrenr { 8022514Sdarrenr fprintf(stderr, "O_RDWR(1) "); 8122514Sdarrenr perror(devname); 8222514Sdarrenr exit(-1); 8322514Sdarrenr } 8422514Sdarrenr 85145510Sdarrenr if (dlattachreq(fd, i) == -1) 8622514Sdarrenr { 87145510Sdarrenr fprintf(stderr, "dlattachreq: DLPI error\n"); 8822514Sdarrenr exit(-1); 8922514Sdarrenr } 90145510Sdarrenr else if (dlokack(fd, buf) == -1) 91145510Sdarrenr { 92145510Sdarrenr fprintf(stderr, "dlokack(attach): DLPI error\n"); 93145510Sdarrenr exit(-1); 94145510Sdarrenr } 95145510Sdarrenr#ifdef DL_HP_RAWDLS 96145510Sdarrenr if (dlpromisconreq(fd, DL_PROMISC_SAP) < 0) 97145510Sdarrenr { 98145510Sdarrenr fprintf(stderr, "dlpromisconreq: DL_PROMISC_PHYS error\n"); 99145510Sdarrenr exit(-1); 100145510Sdarrenr } 101145510Sdarrenr else if (dlokack(fd, buf) < 0) 102145510Sdarrenr { 103145510Sdarrenr fprintf(stderr, "dlokack(promisc): DLPI error\n"); 104145510Sdarrenr exit(-1); 105145510Sdarrenr } 106145510Sdarrenr /* 22 is INSAP as per the HP-UX DLPI Programmer's Guide */ 107145510Sdarrenr 108145510Sdarrenr dlbindreq(fd, 22, 1, DL_HP_RAWDLS, 0, 0); 109145510Sdarrenr#else 11022514Sdarrenr dlbindreq(fd, ETHERTYPE_IP, 0, DL_CLDLS, 0, 0); 111145510Sdarrenr#endif 11222514Sdarrenr dlbindack(fd, buf); 11322514Sdarrenr /* 11422514Sdarrenr * write full headers 11522514Sdarrenr */ 116145510Sdarrenr#ifdef DLIOCRAW /* we require RAW DLPI mode, which is a Sun extension */ 11722514Sdarrenr if (strioctl(fd, DLIOCRAW, -1, 0, NULL) == -1) 11822514Sdarrenr { 11922514Sdarrenr fprintf(stderr, "DLIOCRAW error\n"); 12022514Sdarrenr exit(-1); 12122514Sdarrenr } 12231183Speter#endif 12322514Sdarrenr return fd; 12422514Sdarrenr} 12522514Sdarrenr 12622514Sdarrenr 12722514Sdarrenr/* 12822514Sdarrenr * output an IP packet onto a fd opened for /dev/nit 12922514Sdarrenr */ 13022514Sdarrenrint sendip(fd, pkt, len) 131255332Scy int fd, len; 132255332Scy char *pkt; 133255332Scy{ 134145510Sdarrenr struct strbuf dbuf, *dp = &dbuf, *cp = NULL; 135145510Sdarrenr int pri = 0; 136145510Sdarrenr#ifdef DL_HP_RAWDLS 137145510Sdarrenr struct strbuf cbuf; 138145510Sdarrenr dl_hp_rawdata_req_t raw; 13922514Sdarrenr 140145510Sdarrenr cp = &cbuf; 141145510Sdarrenr raw.dl_primitive = DL_HP_RAWDATA_REQ; 142145510Sdarrenr cp->len = sizeof(raw); 143145510Sdarrenr cp->buf = (char *)&raw; 144145510Sdarrenr cp->maxlen = cp->len; 145145510Sdarrenr pri = MSG_HIPRI; 146145510Sdarrenr#endif 14722514Sdarrenr /* 14822514Sdarrenr * construct NIT STREAMS messages, first control then data. 14922514Sdarrenr */ 15022514Sdarrenr dp->buf = pkt; 15122514Sdarrenr dp->len = len; 15222514Sdarrenr dp->maxlen = dp->len; 15322514Sdarrenr 154145510Sdarrenr if (putmsg(fd, cp, dp, pri) == -1) 15522514Sdarrenr { 15622514Sdarrenr perror("putmsg"); 15722514Sdarrenr return -1; 15822514Sdarrenr } 15922514Sdarrenr if (ioctl(fd, I_FLUSH, FLUSHW) == -1) 16022514Sdarrenr { 16122514Sdarrenr perror("I_FLUSHW"); 16222514Sdarrenr return -1; 16322514Sdarrenr } 16422514Sdarrenr return len; 16522514Sdarrenr} 166145510Sdarrenr 167