1145519Sdarrenr/* $FreeBSD: releng/10.3/contrib/ipfilter/ipsend/sirix.c 255332 2013-09-06 23:11:19Z cy $ */ 2145510Sdarrenr 331183Speter/* 453024Sguido * (C)opyright 1992-1998 Darren Reed. 531183Speter * (C)opyright 1997 Marc Boucher. 631183Speter * 780486Sdarrenr * See the IPFILTER.LICENCE file for details on licencing. 8145510Sdarrenr * 931183Speter */ 1031183Speter#include <stdio.h> 1131183Speter#include <sys/types.h> 1231183Speter#include <string.h> 1331183Speter#include <unistd.h> 1431183Speter#include <stdlib.h> 1531183Speter#include <errno.h> 1631183Speter#include <sys/socket.h> 1731183Speter#include <sys/ioctl.h> 1831183Speter 1931183Speter#include <net/if.h> 2031183Speter#include <net/raw.h> 2131183Speter#include <netinet/in.h> 2231183Speter#include <netinet/in_systm.h> 2331183Speter#include <netinet/ip.h> 2431183Speter#include <netinet/if_ether.h> 2531183Speter#include <netinet/ip_var.h> 26145510Sdarrenr#include "ipsend.h" 2731183Speter#include <netinet/udp_var.h> 2831183Speter 2931183Speter#if !defined(lint) && defined(LIBC_SCCS) 3031183Speterstatic char sirix[] = "@(#)sirix.c 1.0 10/9/97 (C)1997 Marc Boucher"; 3131183Speter#endif 3231183Speter 3331183Speter 34145510Sdarrenrint initdevice(char *device, int tout) 3531183Speter{ 3631183Speter int fd; 3731183Speter struct sockaddr_raw sr; 3831183Speter 3931183Speter if ((fd = socket(PF_RAW, SOCK_RAW, RAWPROTO_DRAIN)) < 0) 4031183Speter { 4131183Speter perror("socket(PF_RAW, SOCK_RAW, RAWPROTO_DRAIN)"); 4231183Speter return -1; 4331183Speter } 4431183Speter 4531183Speter memset(&sr, 0, sizeof(sr)); 4631183Speter sr.sr_family = AF_RAW; 4731183Speter sr.sr_port = ETHERTYPE_IP; 4831183Speter strncpy(sr.sr_ifname, device, sizeof(sr.sr_ifname)); 4931183Speter if (bind(fd, &sr, sizeof(sr)) < 0) 5031183Speter { 5131183Speter perror("bind AF_RAW"); 5231183Speter close(fd); 5331183Speter return -1; 5431183Speter } 5531183Speter return fd; 5631183Speter} 5731183Speter 5831183Speter 5931183Speter/* 6031183Speter * output an IP packet 6131183Speter */ 6231183Speterint sendip(int fd, char *pkt, int len) 63255332Scy{ 6431183Speter struct sockaddr_raw sr; 6531183Speter int srlen = sizeof(sr); 6631183Speter struct ifreq ifr; 6731183Speter struct ether_header *eh = (struct ether_header *)pkt; 6831183Speter 6931183Speter if (getsockname(fd, &sr, &srlen) == -1) 7031183Speter { 7131183Speter perror("getsockname"); 7231183Speter return -1; 7331183Speter } 7431183Speter 7531183Speter memset(&ifr, 0, sizeof(ifr)); 7631183Speter strncpy(ifr.ifr_name, sr.sr_ifname, sizeof ifr.ifr_name); 7731183Speter 7831183Speter if (ioctl(fd, SIOCGIFADDR, &ifr) == -1) 7931183Speter { 8031183Speter perror("ioctl SIOCGIFADDR"); 8131183Speter return -1; 8231183Speter } 8331183Speter 8431183Speter memcpy(eh->ether_shost, ifr.ifr_addr.sa_data, sizeof(eh->ether_shost)); 8531183Speter 8631183Speter if (write(fd, pkt, len) == -1) 8731183Speter { 8831183Speter perror("send"); 8931183Speter return -1; 9031183Speter } 9131183Speter 9231183Speter return len; 9331183Speter} 94