Changeset 15400


Ignore:
Timestamp:
2009-04-25T05:30:20+02:00 (9 years ago)
Author:
nbd
Message:

ead: use the new pcap features and the raw socket optimization to eliminate most of the cpu utilization overhead caused by the use of pcap live capturing

Location:
trunk/package/ead
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/ead/Makefile

    r15242 r15400  
    1212 
    1313PKG_BUILD_DEPENDS:=libpcap 
     14PKG_BUILD_DIR:=$(BUILD_DIR)/ead 
    1415 
    1516include $(INCLUDE_DIR)/package.mk 
     17include $(INCLUDE_DIR)/kernel.mk 
    1618 
    1719define Package/ead 
     
    3032 
    3133TARGET_CFLAGS += \ 
     34        -I$(LINUX_DIR)/include \ 
    3235        -I$(PKG_BUILD_DIR) \ 
    3336        -I$(PKG_BUILD_DIR)/tinysrp \ 
  • trunk/package/ead/src/ead.c

    r13905 r15400  
    4343#endif 
    4444 
     45#ifdef linux 
     46#include <linux/if_packet.h> 
     47#endif 
     48 
    4549#define PASSWD_FILE     "/etc/passwd" 
    4650 
     
    110114static struct t_num A, *B = NULL; 
    111115unsigned char *skey; 
     116 
     117static void 
     118set_recv_type(pcap_t *p, bool rx) 
     119{ 
     120#ifdef PACKET_RECV_TYPE 
     121        struct sockaddr_ll sll; 
     122        struct ifreq ifr; 
     123        int ifindex, mask; 
     124        int fd, ret; 
     125 
     126        fd = pcap_get_selectable_fd(p); 
     127        if (fd < 0) 
     128                return; 
     129 
     130        if (rx) 
     131                mask = 1 << PACKET_BROADCAST; 
     132        else 
     133                mask = 0; 
     134 
     135        ret = setsockopt(fd, SOL_PACKET, PACKET_RECV_TYPE, &mask, sizeof(mask)); 
     136#endif 
     137} 
     138 
     139 
     140static pcap_t * 
     141ead_open_pcap(const char *ifname, char *errbuf, bool rx) 
     142{ 
     143        pcap_t *p; 
     144 
     145        p = pcap_create(ifname, errbuf); 
     146        if (p == NULL) 
     147                goto out; 
     148 
     149        pcap_set_snaplen(p, PCAP_MRU); 
     150        pcap_set_promisc(p, rx); 
     151        pcap_set_timeout(p, PCAP_TIMEOUT); 
     152#ifdef HAS_PROTO_EXTENSION 
     153        pcap_set_protocol(p, (rx ? htons(ETH_P_IP) : 0)); 
     154#endif 
     155        pcap_set_buffer_size(p, (rx ? 10 : 1) * PCAP_MRU); 
     156        pcap_activate(p); 
     157        set_recv_type(p, rx); 
     158out: 
     159        return p; 
     160} 
    112161 
    113162static void 
     
    648697        pcap_fp_rx = NULL; 
    649698        do { 
    650                 pcap_fp = pcap_open_live(instance->ifname, PCAP_MRU, 1, PCAP_TIMEOUT, errbuf); 
    651699#ifdef linux 
    652                 if (instance->bridge[0]) 
    653                         pcap_fp_rx = pcap_open_live(instance->bridge, PCAP_MRU, 1, PCAP_TIMEOUT, errbuf); 
    654 #endif 
     700                if (instance->bridge[0]) { 
     701                        pcap_fp_rx = ead_open_pcap(instance->bridge, errbuf, 1); 
     702                        pcap_fp = ead_open_pcap(instance->ifname, errbuf, 0); 
     703                } else 
     704#endif 
     705                { 
     706                        pcap_fp = ead_open_pcap(instance->ifname, errbuf, 1); 
     707                } 
     708 
    655709                if (!pcap_fp_rx) 
    656710                        pcap_fp_rx = pcap_fp; 
    657                 pcap_setfilter(pcap_fp_rx, &pktfilter); 
    658711                if (first && !pcap_fp) { 
    659712                        DEBUG(1, "WARNING: unable to open interface '%s'\n", instance->ifname); 
     
    663716                        sleep(1); 
    664717        } while (!pcap_fp); 
     718        pcap_setfilter(pcap_fp_rx, &pktfilter); 
    665719} 
    666720 
Note: See TracChangeset for help on using the changeset viewer.