merge prife's patch for exclusive access pcap driver.
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@2404 bbd45198-f89e-11dd-88c7-29a3b14d5316
This commit is contained in:
parent
b04c308524
commit
0f111d6e47
@ -1,3 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* File : pcap_netif.c
|
||||||
|
* This file is part of RT-Thread RTOS
|
||||||
|
* COPYRIGHT (C) 2012, RT-Thread Development Team
|
||||||
|
*
|
||||||
|
* The license and distribution terms for this file may be
|
||||||
|
* found in the file LICENSE in this distribution or at
|
||||||
|
* http://www.rt-thread.org/license/LICENSE
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
* 2012-11-05 Bernard the first version
|
||||||
|
* 2012-11-13 Bernard merge prife's patch for exclusive
|
||||||
|
* access pcap driver.
|
||||||
|
*/
|
||||||
|
|
||||||
#ifdef _TIME_T_DEFINED
|
#ifdef _TIME_T_DEFINED
|
||||||
#undef _TIME_T_DEFINED
|
#undef _TIME_T_DEFINED
|
||||||
#endif
|
#endif
|
||||||
@ -56,13 +72,16 @@ static void pcap_thread_entry(void* parameter)
|
|||||||
|
|
||||||
NETIF_PCAP(&pcap_netif_device) = tap;
|
NETIF_PCAP(&pcap_netif_device) = tap;
|
||||||
|
|
||||||
// pcap_loop(tap, 0, packet_handler, NULL);
|
|
||||||
/* Read the packets */
|
/* Read the packets */
|
||||||
while((res = pcap_next_ex(tap, &header, &pkt_data)) >= 0)
|
while (1)
|
||||||
{
|
{
|
||||||
struct eth_device* eth;
|
struct eth_device* eth;
|
||||||
struct pbuf *p;
|
struct pbuf *p;
|
||||||
|
|
||||||
|
rt_enter_critical();
|
||||||
|
res = pcap_next_ex(tap, &header, &pkt_data);
|
||||||
|
rt_exit_critical();
|
||||||
|
|
||||||
if (res == 0) continue;
|
if (res == 0) continue;
|
||||||
|
|
||||||
eth = (struct eth_device*) &pcap_netif_device;
|
eth = (struct eth_device*) &pcap_netif_device;
|
||||||
@ -113,6 +132,7 @@ static rt_err_t pcap_netif_init(rt_device_t dev)
|
|||||||
for(d = alldevs, i = 0; i < inum-1 ;d = d->next, i++);
|
for(d = alldevs, i = 0; i < inum-1 ;d = d->next, i++);
|
||||||
|
|
||||||
{
|
{
|
||||||
|
rt_kprintf("Select (%s) as network interface\n", d->description);
|
||||||
packet_mb = rt_mb_create("pcap", 64, RT_IPC_FLAG_FIFO);
|
packet_mb = rt_mb_create("pcap", 64, RT_IPC_FLAG_FIFO);
|
||||||
tid = rt_thread_create("pcap", pcap_thread_entry, d,
|
tid = rt_thread_create("pcap", pcap_thread_entry, d,
|
||||||
2048, RT_THREAD_PRIORITY_MAX - 1, 10);
|
2048, RT_THREAD_PRIORITY_MAX - 1, 10);
|
||||||
@ -180,6 +200,7 @@ rt_err_t pcap_netif_tx( rt_device_t dev, struct pbuf* p)
|
|||||||
rt_uint8_t buf[2048];
|
rt_uint8_t buf[2048];
|
||||||
rt_err_t result = RT_EOK;
|
rt_err_t result = RT_EOK;
|
||||||
pcap_t *tap;
|
pcap_t *tap;
|
||||||
|
int res;
|
||||||
|
|
||||||
tap = NETIF_PCAP(dev);
|
tap = NETIF_PCAP(dev);
|
||||||
|
|
||||||
@ -196,7 +217,11 @@ rt_err_t pcap_netif_tx( rt_device_t dev, struct pbuf* p)
|
|||||||
q = q->next;
|
q = q->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pcap_sendpacket(tap, buf, p->tot_len) != 0)
|
rt_enter_critical();
|
||||||
|
res = pcap_sendpacket(tap, buf, p->tot_len);
|
||||||
|
rt_exit_critical();
|
||||||
|
|
||||||
|
if (res != 0)
|
||||||
{
|
{
|
||||||
rt_kprintf("Error sending the packet: \n", pcap_geterr(tap));
|
rt_kprintf("Error sending the packet: \n", pcap_geterr(tap));
|
||||||
result = -RT_ERROR;
|
result = -RT_ERROR;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user