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