1145519Sdarrenr/*	$FreeBSD: releng/10.3/contrib/ipfilter/ipsend/sockraw.c 145519 2005-04-25 18:20:15Z darrenr $	*/
2145510Sdarrenr
3145510Sdarrenr/*
4145510Sdarrenr * (C)opyright 2000 Darren Reed.
5145510Sdarrenr *
6145510Sdarrenr * See the IPFILTER.LICENCE file for details on licencing.
7145510Sdarrenr *
8145510Sdarrenr * WARNING: Attempting to use this .c file on HP-UX 11.00 will cause the
9145510Sdarrenr *          system to crash.
10145510Sdarrenr */
11145510Sdarrenr#include <sys/param.h>
12145510Sdarrenr#include <sys/types.h>
13145510Sdarrenr#include <sys/socket.h>
14145510Sdarrenr#include <sys/ioctl.h>
15145510Sdarrenr
16145510Sdarrenr#include <net/if.h>
17145510Sdarrenr#include <netinet/in.h>
18145510Sdarrenr#include <netinet/in_systm.h>
19145510Sdarrenr#include <netinet/ip.h>
20145510Sdarrenr#include <netinet/if_ether.h>
21145510Sdarrenr#include <netinet/ip_var.h>
22145510Sdarrenr#include <netinet/udp.h>
23145510Sdarrenr#include <netinet/udp_var.h>
24145510Sdarrenr#include <netinet/tcp.h>
25145510Sdarrenr#include <stdio.h>
26145510Sdarrenr#include <string.h>
27145510Sdarrenr#include <unistd.h>
28145510Sdarrenr#include <stdlib.h>
29145510Sdarrenr#include <errno.h>
30145510Sdarrenr#include "ipsend.h"
31145510Sdarrenr
32145510Sdarrenr#if !defined(lint) && defined(LIBC_SCCS)
33145510Sdarrenrstatic	char	sirix[] = "@(#)sirix.c	1.0 10/9/97 (C)1997 Marc Boucher";
34145510Sdarrenr#endif
35145510Sdarrenr
36145510Sdarrenr
37145510Sdarrenrint	initdevice(char *device, int tout)
38145510Sdarrenr{
39145510Sdarrenr	struct sockaddr s;
40145510Sdarrenr	struct ifreq ifr;
41145510Sdarrenr	int fd;
42145510Sdarrenr
43145510Sdarrenr	memset(&ifr, 0, sizeof(ifr));
44145510Sdarrenr	strncpy(ifr.ifr_name, device, sizeof ifr.ifr_name);
45145510Sdarrenr
46145510Sdarrenr	if ((fd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0)
47145510Sdarrenr	    {
48145510Sdarrenr		perror("socket(AF_INET, SOCK_RAW, IPPROTO_RAW)");
49145510Sdarrenr		return -1;
50145510Sdarrenr	    }
51145510Sdarrenr
52145510Sdarrenr	if (ioctl(fd, SIOCGIFADDR, &ifr) == -1)
53145510Sdarrenr	    {
54145510Sdarrenr		perror("ioctl SIOCGIFADDR");
55145510Sdarrenr		return -1;
56145510Sdarrenr	    }
57145510Sdarrenr
58145510Sdarrenr	bzero((char *)&s, sizeof(s));
59145510Sdarrenr	s.sa_family = AF_INET;
60145510Sdarrenr	bcopy(&ifr.ifr_addr, s.sa_data, 4);
61145510Sdarrenr	if (bind(fd, &s, sizeof(s)) == -1)
62145510Sdarrenr		perror("bind");
63145510Sdarrenr	return fd;
64145510Sdarrenr}
65145510Sdarrenr
66145510Sdarrenr
67145510Sdarrenr/*
68145510Sdarrenr * output an IP packet
69145510Sdarrenr */
70145510Sdarrenrint	sendip(int fd, char *pkt, int len)
71145510Sdarrenr{
72145510Sdarrenr	struct ether_header *eh;
73145510Sdarrenr	struct sockaddr_in sin;
74145510Sdarrenr
75145510Sdarrenr	eh = (struct ether_header *)pkt;
76145510Sdarrenr	bzero((char *)&sin, sizeof(sin));
77145510Sdarrenr	sin.sin_family = AF_INET;
78145510Sdarrenr	pkt += 14;
79145510Sdarrenr	len -= 14;
80145510Sdarrenr	bcopy(pkt + 12, (char *)&sin.sin_addr, 4);
81145510Sdarrenr
82145510Sdarrenr	if (sendto(fd, pkt, len, 0, &sin, sizeof(sin)) == -1)
83145510Sdarrenr	    {
84145510Sdarrenr		perror("send");
85145510Sdarrenr		return -1;
86145510Sdarrenr	    }
87145510Sdarrenr
88145510Sdarrenr	return len;
89145510Sdarrenr}
90