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