Lines Matching full:l2
65 int l2_packet_get_own_addr(struct l2_packet_data *l2, u8 *addr) in l2_packet_get_own_addr() argument
67 os_memcpy(addr, l2->own_addr, ETH_ALEN); in l2_packet_get_own_addr()
72 int l2_packet_send(struct l2_packet_data *l2, const u8 *dst_addr, u16 proto, in l2_packet_send() argument
78 if (l2 == NULL) in l2_packet_send()
81 if (l2->l2_hdr) { in l2_packet_send()
82 ret = pcap_sendpacket(l2->pcap, buf, len); in l2_packet_send()
90 os_memcpy(eth->h_source, l2->own_addr, ETH_ALEN); in l2_packet_send()
93 ret = pcap_sendpacket(l2->pcap, (u8 *) eth, mlen); in l2_packet_send()
105 struct l2_packet_data *l2 = (struct l2_packet_data *) user; in l2_packet_receive_cb() local
112 if (l2->l2_hdr) { in l2_packet_receive_cb()
113 l2->rx_buf = (u8 *) ethhdr; in l2_packet_receive_cb()
114 l2->rx_len = hdr->caplen; in l2_packet_receive_cb()
116 l2->rx_buf = (u8 *) (ethhdr + 1); in l2_packet_receive_cb()
117 l2->rx_len = hdr->caplen - sizeof(*ethhdr); in l2_packet_receive_cb()
119 l2->rx_src = ethhdr->h_source; in l2_packet_receive_cb()
120 SetEvent(l2->rx_avail); in l2_packet_receive_cb()
121 WaitForSingleObject(l2->rx_done, INFINITE); in l2_packet_receive_cb()
122 ResetEvent(l2->rx_done); in l2_packet_receive_cb()
123 l2->rx_no_wait = no_wait_count; in l2_packet_receive_cb()
130 struct l2_packet_data *l2 = arg; in l2_packet_receive_thread() local
132 while (l2->running) { in l2_packet_receive_thread()
133 pcap_dispatch(l2->pcap, 1, l2_packet_receive_cb, in l2_packet_receive_thread()
134 (u_char *) l2); in l2_packet_receive_thread()
135 if (l2->rx_no_wait > 0) in l2_packet_receive_thread()
136 l2->rx_no_wait--; in l2_packet_receive_thread()
137 if (WaitForSingleObject(l2->rx_notify, in l2_packet_receive_thread()
138 l2->rx_no_wait ? 0 : 50) == in l2_packet_receive_thread()
140 l2->rx_no_wait = no_wait_count; in l2_packet_receive_thread()
141 ResetEvent(l2->rx_notify); in l2_packet_receive_thread()
144 SetEvent(l2->rx_thread_done); in l2_packet_receive_thread()
153 struct l2_packet_data *l2 = eloop_data; in l2_packet_rx_event() local
154 l2->rx_callback(l2->rx_callback_ctx, l2->rx_src, l2->rx_buf, in l2_packet_rx_event()
155 l2->rx_len); in l2_packet_rx_event()
156 ResetEvent(l2->rx_avail); in l2_packet_rx_event()
157 SetEvent(l2->rx_done); in l2_packet_rx_event()
161 static int l2_packet_init_libpcap(struct l2_packet_data *l2, in l2_packet_init_libpcap() argument
168 pcap_lookupnet(l2->ifname, &pcap_netp, &pcap_maskp, pcap_err); in l2_packet_init_libpcap()
169 l2->pcap = pcap_open_live(l2->ifname, 2500, 0, 1, pcap_err); in l2_packet_init_libpcap()
170 if (l2->pcap == NULL) { in l2_packet_init_libpcap()
172 fprintf(stderr, "ifname='%s'\n", l2->ifname); in l2_packet_init_libpcap()
179 MAC2STR(l2->own_addr), /* do not receive own packets */ in l2_packet_init_libpcap()
180 MAC2STR(l2->own_addr), MAC2STR(pae_group_addr), in l2_packet_init_libpcap()
182 if (pcap_compile(l2->pcap, &pcap_fp, pcap_filter, 1, pcap_netp) < 0) { in l2_packet_init_libpcap()
183 fprintf(stderr, "pcap_compile: %s\n", pcap_geterr(l2->pcap)); in l2_packet_init_libpcap()
187 if (pcap_setfilter(l2->pcap, &pcap_fp) < 0) { in l2_packet_init_libpcap()
188 fprintf(stderr, "pcap_setfilter: %s\n", pcap_geterr(l2->pcap)); in l2_packet_init_libpcap()
204 struct l2_packet_data *l2; in l2_packet_init() local
207 l2 = os_zalloc(sizeof(struct l2_packet_data)); in l2_packet_init()
208 if (l2 == NULL) in l2_packet_init()
211 os_strlcpy(l2->ifname, ifname, sizeof(l2->ifname)); in l2_packet_init()
213 os_snprintf(l2->ifname, sizeof(l2->ifname), "\\Device\\NPF_%s", in l2_packet_init()
215 l2->rx_callback = rx_callback; in l2_packet_init()
216 l2->rx_callback_ctx = rx_callback_ctx; in l2_packet_init()
217 l2->l2_hdr = l2_hdr; in l2_packet_init()
220 os_memcpy(l2->own_addr, own_addr, ETH_ALEN); in l2_packet_init()
222 if (l2_packet_init_libpcap(l2, protocol)) { in l2_packet_init()
223 os_free(l2); in l2_packet_init()
228 return l2; in l2_packet_init()
230 l2->rx_avail = CreateEvent(NULL, TRUE, FALSE, NULL); in l2_packet_init()
231 l2->rx_done = CreateEvent(NULL, TRUE, FALSE, NULL); in l2_packet_init()
232 l2->rx_notify = CreateEvent(NULL, TRUE, FALSE, NULL); in l2_packet_init()
233 if (l2->rx_avail == NULL || l2->rx_done == NULL || in l2_packet_init()
234 l2->rx_notify == NULL) { in l2_packet_init()
235 CloseHandle(l2->rx_avail); in l2_packet_init()
236 CloseHandle(l2->rx_done); in l2_packet_init()
237 CloseHandle(l2->rx_notify); in l2_packet_init()
238 pcap_close(l2->pcap); in l2_packet_init()
239 os_free(l2); in l2_packet_init()
243 eloop_register_event(l2->rx_avail, sizeof(l2->rx_avail), in l2_packet_init()
244 l2_packet_rx_event, l2, NULL); in l2_packet_init()
246 l2->running = 1; in l2_packet_init()
247 l2->rx_thread = CreateThread(NULL, 0, l2_packet_receive_thread, l2, 0, in l2_packet_init()
250 return l2; in l2_packet_init()
268 struct l2_packet_data *l2 = eloop_ctx; in l2_packet_deinit_timeout() local
270 if (l2->rx_thread_done && in l2_packet_deinit_timeout()
271 WaitForSingleObject(l2->rx_thread_done, 2000) != WAIT_OBJECT_0) { in l2_packet_deinit_timeout()
274 TerminateThread(l2->rx_thread, 0); in l2_packet_deinit_timeout()
276 CloseHandle(l2->rx_thread_done); in l2_packet_deinit_timeout()
277 CloseHandle(l2->rx_thread); in l2_packet_deinit_timeout()
278 if (l2->pcap) in l2_packet_deinit_timeout()
279 pcap_close(l2->pcap); in l2_packet_deinit_timeout()
280 eloop_unregister_event(l2->rx_avail, sizeof(l2->rx_avail)); in l2_packet_deinit_timeout()
281 CloseHandle(l2->rx_avail); in l2_packet_deinit_timeout()
282 CloseHandle(l2->rx_done); in l2_packet_deinit_timeout()
283 CloseHandle(l2->rx_notify); in l2_packet_deinit_timeout()
284 os_free(l2); in l2_packet_deinit_timeout()
288 void l2_packet_deinit(struct l2_packet_data *l2) in l2_packet_deinit() argument
290 if (l2 == NULL) in l2_packet_deinit()
293 l2->rx_thread_done = CreateEvent(NULL, TRUE, FALSE, NULL); in l2_packet_deinit()
295 l2->running = 0; in l2_packet_deinit()
296 pcap_breakloop(l2->pcap); in l2_packet_deinit()
299 * RX thread may be waiting in l2_packet_receive_cb() for l2->rx_done in l2_packet_deinit()
301 * l2_packet_deinit() may end up being called from l2->rx_callback(), in l2_packet_deinit()
306 eloop_register_timeout(0, 0, l2_packet_deinit_timeout, l2, NULL); in l2_packet_deinit()
310 int l2_packet_get_ip_addr(struct l2_packet_data *l2, char *buf, size_t len) in l2_packet_get_ip_addr() argument
324 if (os_strcmp(dev->name, l2->ifname) != 0) in l2_packet_get_ip_addr()
346 void l2_packet_notify_auth_start(struct l2_packet_data *l2) in l2_packet_notify_auth_start() argument
348 if (l2) in l2_packet_notify_auth_start()
349 SetEvent(l2->rx_notify); in l2_packet_notify_auth_start()