Lines Matching full:l2

108 int l2_packet_get_own_addr(struct l2_packet_data *l2, u8 *addr)  in l2_packet_get_own_addr()  argument
110 os_memcpy(addr, l2->own_addr, ETH_ALEN); in l2_packet_get_own_addr()
115 int l2_packet_send(struct l2_packet_data *l2, const u8 *dst_addr, u16 proto, in l2_packet_send() argument
122 if (l2 == NULL) in l2_packet_send()
124 if (l2->l2_hdr) { in l2_packet_send()
125 ret = send(l2->fd, buf, len, 0); in l2_packet_send()
133 ll.sll_ifindex = l2->ifindex; in l2_packet_send()
137 ret = sendto(l2->fd, buf, len, 0, (struct sockaddr *) &ll, in l2_packet_send()
150 struct l2_packet_data *l2 = eloop_ctx; in l2_packet_receive() local
170 if (l2->fd_br_rx >= 0) { in l2_packet_receive()
181 if (l2->num_rx_br <= 1 && in l2_packet_receive()
182 (ether_addr_equal(eth->h_dest, l2->own_addr) || in l2_packet_receive()
186 l2->ifname); in l2_packet_receive()
187 eloop_unregister_read_sock(l2->fd_br_rx); in l2_packet_receive()
188 close(l2->fd_br_rx); in l2_packet_receive()
189 l2->fd_br_rx = -1; in l2_packet_receive()
195 if (l2->last_from_br && in l2_packet_receive()
196 os_memcmp(hash, l2->last_hash, SHA1_MAC_LEN) == 0) { in l2_packet_receive()
201 if (l2->last_from_br_prev && in l2_packet_receive()
202 os_memcmp(hash, l2->last_hash_prev, SHA1_MAC_LEN) == 0) { in l2_packet_receive()
207 os_memcpy(l2->last_hash_prev, l2->last_hash, SHA1_MAC_LEN); in l2_packet_receive()
208 l2->last_from_br_prev = l2->last_from_br; in l2_packet_receive()
209 os_memcpy(l2->last_hash, hash, SHA1_MAC_LEN); in l2_packet_receive()
212 l2->last_from_br = 0; in l2_packet_receive()
214 l2->rx_callback(l2->rx_callback_ctx, ll.sll_addr, buf, res); in l2_packet_receive()
221 struct l2_packet_data *l2 = eloop_ctx; in l2_packet_receive_br() local
230 l2->num_rx_br++; in l2_packet_receive_br()
244 if (ether_addr_equal(ll.sll_addr, l2->own_addr)) { in l2_packet_receive_br()
252 if (!l2->last_from_br && in l2_packet_receive_br()
253 os_memcmp(hash, l2->last_hash, SHA1_MAC_LEN) == 0) { in l2_packet_receive_br()
257 if (!l2->last_from_br_prev && in l2_packet_receive_br()
258 os_memcmp(hash, l2->last_hash_prev, SHA1_MAC_LEN) == 0) { in l2_packet_receive_br()
262 os_memcpy(l2->last_hash_prev, l2->last_hash, SHA1_MAC_LEN); in l2_packet_receive_br()
263 l2->last_from_br_prev = l2->last_from_br; in l2_packet_receive_br()
264 l2->last_from_br = 1; in l2_packet_receive_br()
265 os_memcpy(l2->last_hash, hash, SHA1_MAC_LEN); in l2_packet_receive_br()
266 l2->rx_callback(l2->rx_callback_ctx, ll.sll_addr, buf, res); in l2_packet_receive_br()
277 struct l2_packet_data *l2; in l2_packet_init() local
281 l2 = os_zalloc(sizeof(struct l2_packet_data)); in l2_packet_init()
282 if (l2 == NULL) in l2_packet_init()
284 os_strlcpy(l2->ifname, ifname, sizeof(l2->ifname)); in l2_packet_init()
285 l2->rx_callback = rx_callback; in l2_packet_init()
286 l2->rx_callback_ctx = rx_callback_ctx; in l2_packet_init()
287 l2->l2_hdr = l2_hdr; in l2_packet_init()
289 l2->fd_br_rx = -1; in l2_packet_init()
292 l2->fd = socket(PF_PACKET, l2_hdr ? SOCK_RAW : SOCK_DGRAM, in l2_packet_init()
294 if (l2->fd < 0) { in l2_packet_init()
297 os_free(l2); in l2_packet_init()
301 os_strlcpy(ifr.ifr_name, l2->ifname, sizeof(ifr.ifr_name)); in l2_packet_init()
302 if (ioctl(l2->fd, SIOCGIFINDEX, &ifr) < 0) { in l2_packet_init()
305 close(l2->fd); in l2_packet_init()
306 os_free(l2); in l2_packet_init()
309 l2->ifindex = ifr.ifr_ifindex; in l2_packet_init()
316 bind(l2->fd, (struct sockaddr *) &ll, sizeof(ll)) < 0) { in l2_packet_init()
319 close(l2->fd); in l2_packet_init()
320 os_free(l2); in l2_packet_init()
324 if (ioctl(l2->fd, SIOCGIFHWADDR, &ifr) < 0) { in l2_packet_init()
327 close(l2->fd); in l2_packet_init()
328 os_free(l2); in l2_packet_init()
331 os_memcpy(l2->own_addr, ifr.ifr_hwaddr.sa_data, ETH_ALEN); in l2_packet_init()
334 eloop_register_read_sock(l2->fd, l2_packet_receive, l2, NULL); in l2_packet_init()
336 return l2; in l2_packet_init()
347 struct l2_packet_data *l2; in l2_packet_init_bridge() local
366 l2 = l2_packet_init(br_ifname, own_addr, protocol, rx_callback, in l2_packet_init_bridge()
368 if (!l2) in l2_packet_init_bridge()
385 l2->fd_br_rx = socket(PF_PACKET, l2_hdr ? SOCK_RAW : SOCK_DGRAM, in l2_packet_init_bridge()
387 if (l2->fd_br_rx < 0) { in l2_packet_init_bridge()
391 return l2; in l2_packet_init_bridge()
398 if (bind(l2->fd_br_rx, (struct sockaddr *) &ll, sizeof(ll)) < 0) { in l2_packet_init_bridge()
402 close(l2->fd_br_rx); in l2_packet_init_bridge()
403 l2->fd_br_rx = -1; in l2_packet_init_bridge()
404 return l2; in l2_packet_init_bridge()
407 if (setsockopt(l2->fd_br_rx, SOL_SOCKET, SO_ATTACH_FILTER, in l2_packet_init_bridge()
413 close(l2->fd_br_rx); in l2_packet_init_bridge()
414 l2->fd_br_rx = -1; in l2_packet_init_bridge()
415 return l2; in l2_packet_init_bridge()
418 eloop_register_read_sock(l2->fd_br_rx, l2_packet_receive_br, l2, NULL); in l2_packet_init_bridge()
421 return l2; in l2_packet_init_bridge()
425 void l2_packet_deinit(struct l2_packet_data *l2) in l2_packet_deinit() argument
427 if (l2 == NULL) in l2_packet_deinit()
430 if (l2->fd >= 0) { in l2_packet_deinit()
431 eloop_unregister_read_sock(l2->fd); in l2_packet_deinit()
432 close(l2->fd); in l2_packet_deinit()
436 if (l2->fd_br_rx >= 0) { in l2_packet_deinit()
437 eloop_unregister_read_sock(l2->fd_br_rx); in l2_packet_deinit()
438 close(l2->fd_br_rx); in l2_packet_deinit()
442 os_free(l2); in l2_packet_deinit()
446 int l2_packet_get_ip_addr(struct l2_packet_data *l2, char *buf, size_t len) in l2_packet_get_ip_addr() argument
460 os_strlcpy(ifr.ifr_name, l2->ifname, sizeof(ifr.ifr_name)); in l2_packet_get_ip_addr()
479 void l2_packet_notify_auth_start(struct l2_packet_data *l2) in l2_packet_notify_auth_start() argument
484 int l2_packet_set_packet_filter(struct l2_packet_data *l2, in l2_packet_set_packet_filter() argument
506 if (setsockopt(l2->fd, SOL_SOCKET, SO_ATTACH_FILTER, in l2_packet_set_packet_filter()