Home | History | Annotate | Download | only in ap

Lines Matching refs:iapp

2  * hostapd / IEEE 802.11F-2003 Inter-Access Point Protocol (IAPP)
18 * Level 3: support for encryption and authentication of IAPP messages
23 * - implement counters etc. for IAPP MIB
24 * - verify endianness of fields in IAPP messages; are they big-endian as
27 * - TCP connection for IAPP MOVE, CACHE
28 * - broadcast ESP for IAPP ADD-notify
29 * - ESP for IAPP MOVE messages
50 #include "iapp.h"
171 u16 identifier; /* next IAPP identifier */
178 static void iapp_send_add(struct iapp_data *iapp, u8 *mac_addr, u16 seq_num)
185 /* Send IAPP ADD-notify to remove possible association from other APs
191 hdr->identifier = host_to_be16(iapp->identifier++);
203 addr.sin_addr.s_addr = iapp->multicast.s_addr;
205 if (sendto(iapp->udp_sock, buf, (char *) (add + 1) - buf, 0,
207 wpa_printf(MSG_INFO, "sendto[IAPP-ADD]: %s", strerror(errno));
211 static void iapp_send_layer2_update(struct iapp_data *iapp, u8 *addr)
233 if (send(iapp->packet_sock, &msg, sizeof(msg), 0) < 0)
239 * iapp_new_station - IAPP processing for a new STA
240 * @iapp: IAPP data
243 void iapp_new_station(struct iapp_data *iapp, struct sta_info *sta)
247 if (iapp == NULL)
250 /* IAPP-ADD.request(MAC Address, Sequence Number, Timeout) */
251 hostapd_logger(iapp->hapd, sta->addr, HOSTAPD_MODULE_IAPP,
252 HOSTAPD_LEVEL_DEBUG, "IAPP-ADD.request(seq=%d)", seq);
253 iapp_send_layer2_update(iapp, sta->addr);
254 iapp_send_add(iapp, sta->addr, seq);
257 * IAPP-MOVE.request(MAC Address, Sequence Number, Old AP,
259 * TODO: Send IAPP-MOVE to the old AP; Map Old AP BSSID to
264 static void iapp_process_add_notify(struct iapp_data *iapp,
272 wpa_printf(MSG_INFO, "Invalid IAPP-ADD packet length %d (expected %lu)",
277 sta = ap_get_sta(iapp->hapd, add->mac_addr);
279 /* IAPP-ADD.indication(MAC Address, Sequence Number) */
280 hostapd_logger(iapp->hapd, add->mac_addr, HOSTAPD_MODULE_IAPP,
282 "Received IAPP ADD-notify (seq# %d) from %s:%d%s",
291 * to this AP is newer than the one advertised in IAPP-ADD. Although,
294 hostapd_logger(iapp->hapd, add->mac_addr, HOSTAPD_MODULE_IAPP,
296 "Removing STA due to IAPP ADD-notify");
297 ap_sta_disconnect(iapp->hapd, sta, NULL, 0);
302 * iapp_receive_udp - Process IAPP UDP frames
304 * @eloop_ctx: IAPP data (struct iapp_data *)
309 struct iapp_data *iapp = eloop_ctx;
316 /* Handle incoming IAPP frames (over UDP/IP) */
319 len = recvfrom(iapp->udp_sock, buf, sizeof(buf), 0,
327 if (from.sin_addr.s_addr == iapp->own.s_addr)
328 return; /* ignore own IAPP messages */
330 hostapd_logger(iapp->hapd, NULL, HOSTAPD_MODULE_IAPP,
332 "Received %d byte IAPP frame from %s%s\n",
341 hostapd_logger(iapp->hapd, NULL, HOSTAPD_MODULE_IAPP,
347 wpa_printf(MSG_INFO, "Dropping IAPP frame with unknown version %d",
352 wpa_printf(MSG_INFO, "Underflow IAPP frame (hlen=%d len=%d)",
357 wpa_printf(MSG_INFO, "Ignoring %d extra bytes from IAPP frame",
364 iapp_process_add_notify(iapp, &from, hdr, hlen - sizeof(*hdr));
369 /* IAPP-MOVE.indication(MAC Address, New BSSID,
374 wpa_printf(MSG_INFO, "Unknown IAPP command %d", hdr->command);
386 struct iapp_data *iapp;
389 iapp = os_zalloc(sizeof(*iapp));
390 if (iapp == NULL)
392 iapp->hapd = hapd;
393 iapp->udp_sock = iapp->packet_sock = -1;
396 * open socket for sending and receiving IAPP frames over TCP
399 iapp->udp_sock = socket(PF_INET, SOCK_DGRAM, 0);
400 if (iapp->udp_sock < 0) {
403 iapp_deinit(iapp);
409 if (ioctl(iapp->udp_sock, SIOCGIFINDEX, &ifr) != 0) {
412 iapp_deinit(iapp);
417 if (ioctl(iapp->udp_sock, SIOCGIFADDR, &ifr) != 0) {
420 iapp_deinit(iapp);
425 wpa_printf(MSG_INFO, "IAPP: Invalid address family %i (SIOCGIFADDR)",
427 iapp_deinit(iapp);
430 iapp->own.s_addr = paddr->sin_addr.s_addr;
432 if (ioctl(iapp->udp_sock, SIOCGIFBRDADDR, &ifr) != 0) {
435 iapp_deinit(iapp);
442 iapp_deinit(iapp);
445 inet_aton(IAPP_MULTICAST, &iapp->multicast);
450 if (bind(iapp->udp_sock, (struct sockaddr *) &uaddr,
454 iapp_deinit(iapp);
459 mreq.imr_multiaddr = iapp->multicast;
462 if (setsockopt(iapp->udp_sock, SOL_IP, IP_ADD_MEMBERSHIP, &mreq,
466 iapp_deinit(iapp);
470 iapp->packet_sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
471 if (iapp->packet_sock < 0) {
474 iapp_deinit(iapp);
481 if (bind(iapp->packet_sock, (struct sockaddr *) &addr,
485 iapp_deinit(iapp);
489 if (eloop_register_read_sock(iapp->udp_sock, iapp_receive_udp,
490 iapp, NULL)) {
491 wpa_printf(MSG_INFO, "Could not register read socket for IAPP");
492 iapp_deinit(iapp);
496 wpa_printf(MSG_INFO, "IEEE 802.11F (IAPP) using interface %s", iface);
499 * RADIUS Initiate-Accept or Initiate-Reject. IAPP port should actually
501 * is received, IAPP is not started. */
503 return iapp;
507 void iapp_deinit(struct iapp_data *iapp)
511 if (iapp == NULL)
514 if (iapp->udp_sock >= 0) {
516 mreq.imr_multiaddr = iapp->multicast;
519 if (setsockopt(iapp->udp_sock, SOL_IP, IP_DROP_MEMBERSHIP,
525 eloop_unregister_read_sock(iapp->udp_sock);
526 close(iapp->udp_sock);
528 if (iapp->packet_sock >= 0) {
529 eloop_unregister_read_sock(iapp->packet_sock);
530 close(iapp->packet_sock);
532 os_free(iapp);