source: trunk/package/libpcap/patches/202-protocol_api.patch @ 20057

Last change on this file since 20057 was 20057, checked in by thepeople, 7 years ago

fix missing parts of r19997.

File size: 4.3 KB
  • pcap-int.h

    a b struct pcap_opt { 
    187187        char    *source; 
    188188        int     promisc; 
    189189        int     rfmon; 
     190        int proto;      /* protocol for packet socket (linux) */ 
    190191}; 
    191192 
    192193/* 
  • pcap-linux.c

    a b static int iface_get_id(int fd, const ch 
    273273static int      iface_get_mtu(int fd, const char *device, char *ebuf); 
    274274static int      iface_get_arptype(int fd, const char *device, char *ebuf); 
    275275#ifdef HAVE_PF_PACKET_SOCKETS 
    276 static int      iface_bind(int fd, int ifindex, char *ebuf); 
     276static int      iface_bind(int fd, int ifindex, char *ebuf, unsigned short proto); 
    277277static int      has_wext(int sock_fd, const char *device, char *ebuf); 
    278278static int      enter_rfmon_mode_wext(pcap_t *handle, int sock_fd, 
    279279    const char *device); 
    pcap_can_set_rfmon_linux(pcap_t *p) 
    362362         * (We assume that if we have Wireless Extensions support 
    363363         * we also have PF_PACKET support.) 
    364364         */ 
    365         sock_fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); 
     365        sock_fd = socket(PF_PACKET, SOCK_RAW, p->opt.proto); 
    366366        if (sock_fd == -1) { 
    367367                (void)snprintf(p->errbuf, PCAP_ERRBUF_SIZE, 
    368368                    "socket: %s", pcap_strerror(errno)); 
    pcap_activate_linux(pcap_t *handle) 
    522522        handle->read_op = pcap_read_linux; 
    523523        handle->stats_op = pcap_stats_linux; 
    524524 
     525        if (handle->opt.proto < 0) 
     526                handle->opt.proto = (int) htons(ETH_P_ALL); 
     527 
    525528        /* 
    526529         * The "any" device is a special device which causes us not 
    527530         * to bind to a particular device and thus to look at all 
    activate_new(pcap_t *handle) 
    16731676         * try a SOCK_RAW socket for the raw interface. 
    16741677         */ 
    16751678        sock_fd = is_any_device ? 
    1676                 socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_ALL)) : 
    1677                 socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); 
     1679                socket(PF_PACKET, SOCK_DGRAM, handle->opt.proto) : 
     1680                socket(PF_PACKET, SOCK_RAW, handle->opt.proto); 
    16781681 
    16791682        if (sock_fd == -1) { 
    16801683                snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "socket: %s", 
    activate_new(pcap_t *handle) 
    17631766                                return PCAP_ERROR; 
    17641767                        } 
    17651768                        sock_fd = socket(PF_PACKET, SOCK_DGRAM, 
    1766                             htons(ETH_P_ALL)); 
     1769                            handle->opt.proto); 
    17671770                        if (sock_fd == -1) { 
    17681771                                snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, 
    17691772                                    "socket: %s", pcap_strerror(errno)); 
    activate_new(pcap_t *handle) 
    18151818                } 
    18161819 
    18171820                if ((err = iface_bind(sock_fd, handle->md.ifindex, 
    1818                     handle->errbuf)) != 1) { 
     1821                    handle->errbuf, handle->opt.proto)) != 1) { 
    18191822                        close(sock_fd); 
    18201823                        if (err < 0) 
    18211824                                return err; 
    iface_get_id(int fd, const char *device, 
    24402443 *  or a PCAP_ERROR_ value on a hard error. 
    24412444 */ 
    24422445static int 
    2443 iface_bind(int fd, int ifindex, char *ebuf) 
     2446iface_bind(int fd, int ifindex, char *ebuf, unsigned short proto) 
    24442447{ 
    24452448        struct sockaddr_ll      sll; 
    24462449        int                     err; 
    iface_bind(int fd, int ifindex, char *eb 
    24492452        memset(&sll, 0, sizeof(sll)); 
    24502453        sll.sll_family          = AF_PACKET; 
    24512454        sll.sll_ifindex         = ifindex; 
    2452         sll.sll_protocol        = htons(ETH_P_ALL); 
     2455        sll.sll_protocol        = proto; 
    24532456 
    24542457        if (bind(fd, (struct sockaddr *) &sll, sizeof(sll)) == -1) { 
    24552458                if (errno == ENETDOWN) { 
    activate_old(pcap_t *handle) 
    31193122 
    31203123        /* Open the socket */ 
    31213124 
    3122         handle->fd = socket(PF_INET, SOCK_PACKET, htons(ETH_P_ALL)); 
     3125        handle->fd = socket(PF_INET, SOCK_PACKET, handle->opt.proto); 
    31233126        if (handle->fd == -1) { 
    31243127                snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, 
    31253128                         "socket: %s", pcap_strerror(errno)); 
  • pcap.c

    a b pcap_create_common(const char *source, c 
    152152        pcap_set_snaplen(p, 65535);     /* max packet size */ 
    153153        p->opt.promisc = 0; 
    154154        p->opt.buffer_size = 0; 
     155        p->opt.proto = -1; 
     156 
    155157        return (p); 
    156158} 
    157159 
    pcap_set_buffer_size(pcap_t *p, int buff 
    212214} 
    213215 
    214216int 
     217pcap_set_protocol(pcap_t *p, unsigned short proto) 
     218{ 
     219        if (pcap_check_activated(p)) 
     220                return PCAP_ERROR_ACTIVATED; 
     221        p->opt.proto = proto; 
     222        return 0; 
     223} 
     224 
     225int 
    215226pcap_activate(pcap_t *p) 
    216227{ 
    217228        int status; 
  • pcap/pcap.h

    a b extern "C" { 
    6161#define PCAP_VERSION_MINOR 4 
    6262 
    6363#define PCAP_ERRBUF_SIZE 256 
     64#define HAS_PROTO_EXTENSION 
    6465 
    6566/* 
    6667 * Compatibility for systems that have a bpf.h that 
    int pcap_can_set_rfmon(pcap_t *); 
    263264int     pcap_set_rfmon(pcap_t *, int); 
    264265int     pcap_set_timeout(pcap_t *, int); 
    265266int     pcap_set_buffer_size(pcap_t *, int); 
     267int     pcap_set_protocol(pcap_t *, unsigned short); 
    266268int     pcap_activate(pcap_t *); 
    267269 
    268270pcap_t  *pcap_open_live(const char *, int, int, int, char *); 
Note: See TracBrowser for help on using the repository browser.