l2_packet_privsep.c revision 8d520ff1dc2da35cdca849e982051b86468016d8
18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * WPA Supplicant - Layer2 packet handling with privilege separation 38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2007, Jouni Malinen <j@w1.fi> 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 58d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This program is free software; you can redistribute it and/or modify 68d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * it under the terms of the GNU General Public License version 2 as 78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * published by the Free Software Foundation. 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Alternatively, this software may be distributed under the terms of BSD 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * license. 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * See README and COPYING for more details. 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "includes.h" 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <sys/un.h> 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common.h" 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "eloop.h" 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "l2_packet.h" 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/privsep_commands.h" 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct l2_packet_data { 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int fd; /* UNIX domain socket for privsep access */ 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void (*rx_callback)(void *ctx, const u8 *src_addr, 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *buf, size_t len); 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void *rx_callback_ctx; 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 own_addr[ETH_ALEN]; 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *own_socket_path; 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr_un priv_addr; 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_priv_cmd(struct l2_packet_data *l2, int cmd, 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const void *data, size_t data_len) 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct msghdr msg; 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct iovec io[2]; 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt io[0].iov_base = &cmd; 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt io[0].iov_len = sizeof(cmd); 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt io[1].iov_base = (u8 *) data; 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt io[1].iov_len = data_len; 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&msg, 0, sizeof(msg)); 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.msg_iov = io; 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.msg_iovlen = data ? 2 : 1; 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.msg_name = &l2->priv_addr; 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.msg_namelen = sizeof(l2->priv_addr); 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (sendmsg(l2->fd, &msg, 0) < 0) { 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("L2: sendmsg(cmd)"); 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint l2_packet_get_own_addr(struct l2_packet_data *l2, u8 *addr) 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(addr, l2->own_addr, ETH_ALEN); 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint l2_packet_send(struct l2_packet_data *l2, const u8 *dst_addr, u16 proto, 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *buf, size_t len) 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct msghdr msg; 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct iovec io[4]; 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int cmd = PRIVSEP_CMD_L2_SEND; 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt io[0].iov_base = &cmd; 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt io[0].iov_len = sizeof(cmd); 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt io[1].iov_base = &dst_addr; 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt io[1].iov_len = ETH_ALEN; 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt io[2].iov_base = &proto; 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt io[2].iov_len = 2; 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt io[3].iov_base = (u8 *) buf; 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt io[3].iov_len = len; 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&msg, 0, sizeof(msg)); 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.msg_iov = io; 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.msg_iovlen = 4; 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.msg_name = &l2->priv_addr; 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.msg_namelen = sizeof(l2->priv_addr); 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (sendmsg(l2->fd, &msg, 0) < 0) { 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("L2: sendmsg(packet_send)"); 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void l2_packet_receive(int sock, void *eloop_ctx, void *sock_ctx) 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct l2_packet_data *l2 = eloop_ctx; 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 buf[2300]; 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr_un from; 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt socklen_t fromlen = sizeof(from); 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&from, 0, sizeof(from)); 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr *) &from, 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &fromlen); 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("l2_packet_receive - recvfrom"); 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < ETH_ALEN) { 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "L2: Too show packet received"); 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (from.sun_family != AF_UNIX || 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strncmp(from.sun_path, l2->priv_addr.sun_path, 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(from.sun_path)) != 0) { 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "L2: Received message from unexpected " 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "source"); 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt l2->rx_callback(l2->rx_callback_ctx, buf, buf + ETH_ALEN, 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res - ETH_ALEN); 1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct l2_packet_data * l2_packet_init( 1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *ifname, const u8 *own_addr, unsigned short protocol, 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void (*rx_callback)(void *ctx, const u8 *src_addr, 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *buf, size_t len), 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void *rx_callback_ctx, int l2_hdr) 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct l2_packet_data *l2; 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *own_dir = "/tmp"; 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *priv_dir = "/var/run/wpa_priv"; 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len; 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static unsigned int counter = 0; 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr_un addr; 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fd_set rfds; 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct timeval tv; 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 reply[ETH_ALEN + 1]; 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int reg_cmd[2]; 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt l2 = os_zalloc(sizeof(struct l2_packet_data)); 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (l2 == NULL) 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt l2->rx_callback = rx_callback; 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt l2->rx_callback_ctx = rx_callback_ctx; 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = os_strlen(own_dir) + 50; 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt l2->own_socket_path = os_malloc(len); 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (l2->own_socket_path == NULL) { 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(l2); 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(l2->own_socket_path, len, "%s/wpa_privsep-l2-%d-%d", 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt own_dir, getpid(), counter++); 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt l2->priv_addr.sun_family = AF_UNIX; 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(l2->priv_addr.sun_path, sizeof(l2->priv_addr.sun_path), 1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/%s", priv_dir, ifname); 1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt l2->fd = socket(PF_UNIX, SOCK_DGRAM, 0); 1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (l2->fd < 0) { 1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("socket(PF_UNIX)"); 1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(l2->own_socket_path); 1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt l2->own_socket_path = NULL; 1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(l2); 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&addr, 0, sizeof(addr)); 1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt addr.sun_family = AF_UNIX; 1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strlcpy(addr.sun_path, l2->own_socket_path, sizeof(addr.sun_path)); 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bind(l2->fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) { 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("bind(PF_UNIX)"); 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto fail; 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reg_cmd[0] = protocol; 1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reg_cmd[1] = l2_hdr; 1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_priv_cmd(l2, PRIVSEP_CMD_L2_REGISTER, reg_cmd, sizeof(reg_cmd)) 1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt < 0) { 1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "L2: Failed to register with wpa_priv"); 1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto fail; 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt FD_ZERO(&rfds); 1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt FD_SET(l2->fd, &rfds); 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tv.tv_sec = 5; 1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tv.tv_usec = 0; 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = select(l2->fd + 1, &rfds, NULL, NULL, &tv); 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 && errno != EINTR) { 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("select"); 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto fail; 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (FD_ISSET(l2->fd, &rfds)) { 2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = recv(l2->fd, reply, sizeof(reply), 0); 2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("recv"); 2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto fail; 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "L2: Timeout while waiting for " 2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "registration reply"); 2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto fail; 2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res != ETH_ALEN) { 2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "L2: Unexpected registration reply " 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(len=%d)", res); 2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(l2->own_addr, reply, ETH_ALEN); 2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_register_read_sock(l2->fd, l2_packet_receive, l2, NULL); 2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return l2; 2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtfail: 2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt close(l2->fd); 2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt l2->fd = -1; 2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unlink(l2->own_socket_path); 2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(l2->own_socket_path); 2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt l2->own_socket_path = NULL; 2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(l2); 2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid l2_packet_deinit(struct l2_packet_data *l2) 2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (l2 == NULL) 2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (l2->fd >= 0) { 2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_priv_cmd(l2, PRIVSEP_CMD_L2_UNREGISTER, NULL, 0); 2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_unregister_read_sock(l2->fd); 2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt close(l2->fd); 2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (l2->own_socket_path) { 2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unlink(l2->own_socket_path); 2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(l2->own_socket_path); 2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(l2); 2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint l2_packet_get_ip_addr(struct l2_packet_data *l2, char *buf, size_t len) 2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* TODO */ 2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid l2_packet_notify_auth_start(struct l2_packet_data *l2) 2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_priv_cmd(l2, PRIVSEP_CMD_L2_NOTIFY_AUTH_START, NULL, 0); 2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 268