Date: Mon, 17 Oct 2005 13:14:13 +0200 (CEST) From: "Tobias Abrahamsson" <toba@etek.chalmers.se> To: freebsd-net@freebsd.org Subject: using BPF and rawsocket Message-ID: <47134.192.138.116.163.1129547653.squirrel@webmail.chalmers.se>
next in thread | raw e-mail | index | archive | help
Hi I have a problem that i hope that someone can help me with. I'm trying to make a computer running a webserver, reachable on a net wich it don't own an address on. In order to let clients reach the server, I use BPF to capture the packets to an address that i have chosen, ( not important wich address, only that it's not on the right net), and then redirect them to my self to reach the webserver. To make the webserver respond to the client I set a static route back to the client ( there is no routers between the clients and the webserver so this works ). I'm using a raw socket to send the capured packets to webserver and there is were I have trouble. When I'm using sendto() it responds with error message: Invalid argument. I can't figure out why that is, but this is the first time I use rawsockets so maby it is easy to fix. Thankful for all ideas. Tobias Abrahamsson PS. the code have testig status so it is not so neat. #include <sys/types.h> #include <sys/time.h> #include <sys/ioctl.h> #include <sys/socket.h> #include <sys/uio.h> #include <net/if.h> #include <net/ethernet.h> #include <netinet/in.h> #include <netinet/in_systm.h> #include <netinet/ip.h> #include <pcap.h> #include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <errno.h> static void print_pkt( char *pkt_ptr ) { int i, print; char ch; struct ip *ip_hdr; ip_hdr = (struct ip *)pkt_ptr; for( i = 0; i < ntohs(ip_hdr->ip_len); i++ ) { ch = 0x00; ch = *(pkt_ptr + i); if( i%8 == 0 ) printf("\n"); print = (int)ch & 0x000000ff; if( (print & 0x000000f0) == 0 ) printf( "0%x:", print ); else printf( "%x:", print ); } printf( "\n" ); } static void send_pkt( int s, struct ip *ip_hdr ) { char *ptr; ssize_t ss; size_t len; struct sockaddr_in saddr; memset( &saddr, 0, sizeof(saddr) ); saddr.sin_family = AF_INET; saddr.sin_port = 80; inet_aton( "10.0.0.0", saddr.sin_addr ); len = ntohs(ip_hdr->ip_len); ptr = (char *)ip_hdr; if( (ss = sendto( s, ptr, len, 0, (const struct sockaddr *)&saddr, sizeof(saddr) )) < 0 ) perror( "sendto could not write" ); printf( "ip_len: %d sent: %d bytes\n", len, ss ); } int main() { int s, snaplen = 1600; char *device, errbuf[ PCAP_ERRBUF_SIZE ]; const int on = 1; const u_char *pkt_ptr; struct ip *ip_hdr; struct pcap_pkthdr pchdr; pcap_t *pd; if( (device = pcap_lookupdev( errbuf )) == NULL ) fprintf( stderr, errbuf ); pd = pcap_open_live( device, snaplen, 1, 1, errbuf); printf( "device %s\n", device ); if( (s = socket( AF_INET, SOCK_RAW, 0 )) < 0 ) perror( "socket" ); if( setsockopt( s, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on) ) < 0 ) perror( "setsockopt" ); while( 1 ) { while( (pkt_ptr = (char *)pcap_next( pd, &pchdr )) == NULL ); ip_hdr = (struct ip *)(pkt_ptr + ETHER_HDR_LEN); if( ntohs(ip_hdr->ip_len) < 100 ) print_pkt( (char *)ip_hdr ); send_pkt( s, ip_hdr ); } } _______________________________________________ freebsd-net@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-net To unsubscribe, send any mail to "freebsd-net-unsubscribe@freebsd.org"
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?47134.192.138.116.163.1129547653.squirrel>