summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/winpcap/Examples-remote/UserLevelBridge/UserBridge.c
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/winpcap/Examples-remote/UserLevelBridge/UserBridge.c')
-rw-r--r--3rdparty/winpcap/Examples-remote/UserLevelBridge/UserBridge.c467
1 files changed, 0 insertions, 467 deletions
diff --git a/3rdparty/winpcap/Examples-remote/UserLevelBridge/UserBridge.c b/3rdparty/winpcap/Examples-remote/UserLevelBridge/UserBridge.c
deleted file mode 100644
index 471f850376f..00000000000
--- a/3rdparty/winpcap/Examples-remote/UserLevelBridge/UserBridge.c
+++ /dev/null
@@ -1,467 +0,0 @@
-/*
- * Copyright (c) 2005 - 2006
- * CACE Technologies, Davis, CA
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of CACE Technologies nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-/*
- * This simple program implements a user-level bridge.
- * It opens two adapters specified by the user and starts two threads.
- * The first thread receives packets from adapter 1 and sends them down to
- * adapter 2. The second thread does the same, but in the opposite
- * direction.
- */
-
-#include <signal.h>
-#include "pcap.h"
-
-/* Storage data structure used to pass parameters to the threads */
-typedef struct _in_out_adapters
-{
- unsigned int state; /* Some simple state information */
- pcap_t *input_adapter;
- pcap_t *output_adapter;
-}in_out_adapters;
-
-/* Prototypes */
-DWORD WINAPI CaptureAndForwardThread(LPVOID lpParameter);
-void ctrlc_handler(int sig);
-
-/* This prevents the two threads to mess-up when they do printfs */
-CRITICAL_SECTION print_cs;
-
-/* Thread handlers. Global because we wait on the threads from the CTRL+C handler */
-HANDLE threads[2];
-
-/* This global variable tells the forwarder threads they must terminate */
-volatile int kill_forwaders = 0;
-
-
-/*******************************************************************/
-
-int main()
-{
- pcap_if_t *alldevs;
- pcap_if_t *d;
- int inum1, inum2;
- int i=0;
- pcap_t *adhandle1, *adhandle2;
- char errbuf[PCAP_ERRBUF_SIZE];
- u_int netmask1, netmask2;
- char packet_filter[256];
- struct bpf_program fcode;
- in_out_adapters couple0, couple1;
-
- /*
- * Retrieve the device list
- */
-
- if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
- {
- fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
- exit(1);
- }
-
- /* Print the list */
- for(d=alldevs; d; d=d->next)
- {
- printf("%d. ", ++i);
- if (d->description)
- printf("%s\n", d->description);
- else
- printf("<unknown adapter>\n");
- }
-
- if(i==0)
- {
- printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
- return -1;
- }
-
-
- /*
- * Get input from the user
- */
-
- /* Get the filter*/
- printf("\nSpecify filter (hit return for no filter):");
-
- fgets(packet_filter, sizeof(packet_filter), stdin);
-
- /* Get the first interface number*/
- printf("\nEnter the number of the first interface to use (1-%d):",i);
- scanf_s("%d", &inum1);
-
- if(inum1 < 1 || inum1 > i)
- {
- printf("\nInterface number out of range.\n");
- /* Free the device list */
- pcap_freealldevs(alldevs);
- return -1;
- }
-
- /* Get the second interface number*/
- printf("Enter the number of the first interface to use (1-%d):",i);
- scanf_s("%d", &inum2);
-
- if(inum2 < 1 || inum2 > i)
- {
- printf("\nInterface number out of range.\n");
- /* Free the device list */
- pcap_freealldevs(alldevs);
- return -1;
- }
-
- if(inum1 == inum2 )
- {
- printf("\nCannot bridge packets on the same interface.\n");
- /* Free the device list */
- pcap_freealldevs(alldevs);
- return -1;
- }
-
-
- /*
- * Open the specified couple of adapters
- */
-
- /* Jump to the first selected adapter */
- for(d = alldevs, i = 0; i< inum1 - 1 ;d = d->next, i++);
-
- /*
- * Open the first adapter.
- * *NOTICE* the flags we are using, they are important for the behavior of the prgram:
- * - PCAP_OPENFLAG_PROMISCUOUS: tells the adapter to go in promiscuous mode.
- * This means that we are capturing all the traffic, not only the one to or from
- * this machine.
- * - PCAP_OPENFLAG_NOCAPTURE_LOCAL: prevents the adapter from capturing again the packets
- * transmitted by itself. This avoids annoying loops.
- * - PCAP_OPENFLAG_MAX_RESPONSIVENESS: configures the adapter to provide minimum latency,
- * at the cost of higher CPU usage.
- */
- if((adhandle1 = pcap_open(d->name, // name of the device
- 65536, // portion of the packet to capture.
- // 65536 grants that the whole packet will be captured on every link layer.
- PCAP_OPENFLAG_PROMISCUOUS | // flags. We specify that we don't want to capture loopback packets, and that the driver should deliver us the packets as fast as possible
- PCAP_OPENFLAG_NOCAPTURE_LOCAL |
- PCAP_OPENFLAG_MAX_RESPONSIVENESS,
- 500, // read timeout
- NULL, // remote authentication
- errbuf // error buffer
- )) == NULL)
- {
- fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", d->description);
- /* Free the device list */
- pcap_freealldevs(alldevs);
- return -1;
- }
-
- if(d->addresses != NULL)
- {
- /* Retrieve the mask of the first address of the interface */
- netmask1 = ((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;
- }
- else
- {
- /* If the interface is without addresses we suppose to be in a C class network */
- netmask1 = 0xffffff;
- }
-
- /* Jump to the second selected adapter */
- for(d = alldevs, i = 0; i< inum2 - 1 ;d = d->next, i++);
-
- /* Open the second adapter */
- if((adhandle2 = pcap_open(d->name, // name of the device
- 65536, // portion of the packet to capture.
- // 65536 grants that the whole packet will be captured on every link layer.
- PCAP_OPENFLAG_PROMISCUOUS | // flags. We specify that we don't want to capture loopback packets, and that the driver should deliver us the packets as fast as possible
- PCAP_OPENFLAG_NOCAPTURE_LOCAL |
- PCAP_OPENFLAG_MAX_RESPONSIVENESS,
- 500, // read timeout
- NULL, // remote authentication
- errbuf // error buffer
- )) == NULL)
- {
- fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", d->description);
- /* Free the device list */
- pcap_freealldevs(alldevs);
- return -1;
- }
-
- if(d->addresses != NULL)
- {
- /* Retrieve the mask of the first address of the interface */
- netmask2 = ((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;
- }
- else
- {
- /* If the interface is without addresses we suppose to be in a C class network */
- netmask2 = 0xffffff;
- }
-
-
- /*
- * Compile and set the filters
- */
-
- /* compile the filter for the first adapter */
- if (pcap_compile(adhandle1, &fcode, packet_filter, 1, netmask1) <0 )
- {
- fprintf(stderr,"\nUnable to compile the packet filter. Check the syntax.\n");
-
- /* Close the adapters */
- pcap_close(adhandle1);
- pcap_close(adhandle2);
-
- /* Free the device list */
- pcap_freealldevs(alldevs);
- return -1;
- }
-
- /* set the filter for the first adapter*/
- if (pcap_setfilter(adhandle1, &fcode)<0)
- {
- fprintf(stderr,"\nError setting the filter.\n");
-
- /* Close the adapters */
- pcap_close(adhandle1);
- pcap_close(adhandle2);
-
- /* Free the device list */
- pcap_freealldevs(alldevs);
- return -1;
- }
-
- /* compile the filter for the second adapter */
- if (pcap_compile(adhandle2, &fcode, packet_filter, 1, netmask2) <0 )
- {
- fprintf(stderr,"\nUnable to compile the packet filter. Check the syntax.\n");
-
- /* Close the adapters */
- pcap_close(adhandle1);
- pcap_close(adhandle2);
-
- /* Free the device list */
- pcap_freealldevs(alldevs);
- return -1;
- }
-
- /* set the filter for the second adapter*/
- if (pcap_setfilter(adhandle2, &fcode)<0)
- {
- fprintf(stderr,"\nError setting the filter.\n");
-
- /* Close the adapters */
- pcap_close(adhandle1);
- pcap_close(adhandle2);
-
- /* Free the device list */
- pcap_freealldevs(alldevs);
- return -1;
- }
-
- /* At this point, we don't need the device list any more. Free it */
- pcap_freealldevs(alldevs);
-
- /*
- * Start the threads that will forward the packets
- */
-
- /* Initialize the critical section that will be used by the threads for console output */
- InitializeCriticalSection(&print_cs);
-
- /* Init input parameters of the threads */
- couple0.state = 0;
- couple0.input_adapter = adhandle1;
- couple0.output_adapter = adhandle2;
- couple1.state = 1;
- couple1.input_adapter = adhandle2;
- couple1.output_adapter = adhandle1;
-
- /* Start first thread */
- if((threads[0] = CreateThread(
- NULL,
- 0,
- CaptureAndForwardThread,
- &couple0,
- 0,
- NULL)) == NULL)
- {
- fprintf(stderr, "error creating the first forward thread");
-
- /* Close the adapters */
- pcap_close(adhandle1);
- pcap_close(adhandle2);
-
- /* Free the device list */
- pcap_freealldevs(alldevs);
- return -1;
- }
-
- /* Start second thread */
- if((threads[1] = CreateThread(
- NULL,
- 0,
- CaptureAndForwardThread,
- &couple1,
- 0,
- NULL)) == NULL)
- {
- fprintf(stderr, "error creating the second forward thread");
-
- /* Kill the first thread. Not very gentle at all...*/
- TerminateThread(threads[0], 0);
-
- /* Close the adapters */
- pcap_close(adhandle1);
- pcap_close(adhandle2);
-
- /* Free the device list */
- pcap_freealldevs(alldevs);
- return -1;
- }
-
- /*
- * Install a CTRL+C handler that will do the cleanups on exit
- */
- signal(SIGINT, ctrlc_handler);
-
- /*
- * Done!
- * Wait for the Greek calends...
- */
- printf("\nStart bridging the two adapters...\n", d->description);
- Sleep(INFINITE);
- return 0;
-}
-
-/*******************************************************************
- * Forwarding thread.
- * Gets the packets from the input adapter and sends them to the output one.
- *******************************************************************/
-DWORD WINAPI CaptureAndForwardThread(LPVOID lpParameter)
-{
- struct pcap_pkthdr *header;
- const u_char *pkt_data;
- int res = 0;
- in_out_adapters* ad_couple = lpParameter;
- unsigned int n_fwd = 0;
-
- /*
- * Loop receiving packets from the first input adapter
- */
-
- while((!kill_forwaders) && (res = pcap_next_ex(ad_couple->input_adapter, &header, &pkt_data)) >= 0)
- {
- if(res != 0) /* Note: res=0 means "read timeout elapsed"*/
- {
- /*
- * Print something, just to show when we have activity.
- * BEWARE: acquiring a critical section and printing strings with printf
- * is something inefficient that you seriously want to avoid in your packet loop!
- * However, since this is a *sample program*, we privilege visual output to efficiency.
- */
- EnterCriticalSection(&print_cs);
-
- if(ad_couple->state == 0)
- printf(">> Len: %u\n", header->caplen);
- else
- printf("<< Len: %u\n", header->caplen);
-
- LeaveCriticalSection(&print_cs);
-
- /*
- * Send the just received packet to the output adaper
- */
- if(pcap_sendpacket(ad_couple->output_adapter, pkt_data, header->caplen) != 0)
- {
- EnterCriticalSection(&print_cs);
-
- printf("Error sending a %u bytes packets on interface %u: %s\n",
- header->caplen,
- ad_couple->state,
- pcap_geterr(ad_couple->output_adapter));
-
- LeaveCriticalSection(&print_cs);
- }
- else
- {
- n_fwd++;
- }
- }
- }
-
- /*
- * We're out of the main loop. Check the reason.
- */
- if(res < 0)
- {
- EnterCriticalSection(&print_cs);
-
- printf("Error capturing the packets: %s\n", pcap_geterr(ad_couple->input_adapter));
- fflush(stdout);
-
- LeaveCriticalSection(&print_cs);
- }
- else
- {
- EnterCriticalSection(&print_cs);
-
- printf("End of bridging on interface %u. Forwarded packets:%u\n",
- ad_couple->state,
- n_fwd);
- fflush(stdout);
-
- LeaveCriticalSection(&print_cs);
- }
-
- return 0;
-}
-
-/*******************************************************************
- * CTRL+C hanlder.
- * We order the threads to die and then we patiently wait for their
- * suicide.
- *******************************************************************/
-void ctrlc_handler(int sig)
-{
- /*
- * unused variable
- */
- (VOID)(sig);
-
- kill_forwaders = 1;
-
- WaitForMultipleObjects(2,
- threads,
- TRUE, /* Wait for all the handles */
- 5000); /* Timeout */
-
- exit(0);
-} \ No newline at end of file