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