2 * Copyright (C) 2002 Jeff Dike <jdike@karaya.com>
3 * Licensed under the GPL.
11 #include <asm/types.h>
13 #include "pcap_user.h"
15 #include "um_malloc.h"
17 #define MAX_PACKET (ETH_MAX_PACKET + ETH_HEADER_OTHER)
19 #define PCAP_FD(p) (*(int *)(p))
21 static int pcap_user_init(void *data
, void *dev
)
23 struct pcap_data
*pri
= data
;
25 char errors
[PCAP_ERRBUF_SIZE
];
27 p
= pcap_open_live(pri
->host_if
, MAX_PACKET
, pri
->promisc
, 0, errors
);
29 printk("pcap_user_init : pcap_open_live failed - '%s'\n",
39 static int pcap_open(void *data
)
41 struct pcap_data
*pri
= data
;
48 if(pri
->filter
!= NULL
){
49 err
= dev_netmask(pri
->dev
, &netmask
);
51 printk("pcap_open : dev_netmask failed\n");
55 pri
->compiled
= um_kmalloc(sizeof(struct bpf_program
));
56 if(pri
->compiled
== NULL
){
57 printk("pcap_open : kmalloc failed\n");
61 err
= pcap_compile(pri
->pcap
,
62 (struct bpf_program
*) pri
->compiled
,
63 pri
->filter
, pri
->optimize
, netmask
);
65 printk("pcap_open : pcap_compile failed - '%s'\n",
66 pcap_geterr(pri
->pcap
));
70 err
= pcap_setfilter(pri
->pcap
, pri
->compiled
);
72 printk("pcap_open : pcap_setfilter failed - '%s'\n",
73 pcap_geterr(pri
->pcap
));
78 return PCAP_FD(pri
->pcap
);
81 static void pcap_remove(void *data
)
83 struct pcap_data
*pri
= data
;
85 if(pri
->compiled
!= NULL
)
86 pcap_freecode(pri
->compiled
);
88 pcap_close(pri
->pcap
);
91 struct pcap_handler_data
{
96 static void handler(u_char
*data
, const struct pcap_pkthdr
*header
,
101 struct pcap_handler_data
*hdata
= (struct pcap_handler_data
*) data
;
103 len
= hdata
->len
< header
->caplen
? hdata
->len
: header
->caplen
;
104 memcpy(hdata
->buffer
, packet
, len
);
108 int pcap_user_read(int fd
, void *buffer
, int len
, struct pcap_data
*pri
)
110 struct pcap_handler_data hdata
= ((struct pcap_handler_data
)
115 n
= pcap_dispatch(pri
->pcap
, 1, handler
, (u_char
*) &hdata
);
117 printk("pcap_dispatch failed - %s\n", pcap_geterr(pri
->pcap
));
125 const struct net_user_info pcap_user_info
= {
126 .init
= pcap_user_init
,
129 .remove
= pcap_remove
,
132 .delete_address
= NULL
,
133 .max_packet
= MAX_PACKET
- ETH_HEADER_OTHER