1 // SPDX-License-Identifier: GPL-2.0 2 /* Copyright (C) 2007-2019 B.A.T.M.A.N. contributors: 3 * 4 * Marek Lindner, Simon Wunderlich 5 */ 6 7 #include "main.h" 8 9 #include <linux/atomic.h> 10 #include <linux/build_bug.h> 11 #include <linux/byteorder/generic.h> 12 #include <linux/crc32c.h> 13 #include <linux/device.h> 14 #include <linux/errno.h> 15 #include <linux/genetlink.h> 16 #include <linux/gfp.h> 17 #include <linux/if_ether.h> 18 #include <linux/if_vlan.h> 19 #include <linux/init.h> 20 #include <linux/ip.h> 21 #include <linux/ipv6.h> 22 #include <linux/kernel.h> 23 #include <linux/kobject.h> 24 #include <linux/kref.h> 25 #include <linux/list.h> 26 #include <linux/module.h> 27 #include <linux/netdevice.h> 28 #include <linux/printk.h> 29 #include <linux/rculist.h> 30 #include <linux/rcupdate.h> 31 #include <linux/seq_file.h> 32 #include <linux/skbuff.h> 33 #include <linux/slab.h> 34 #include <linux/spinlock.h> 35 #include <linux/stddef.h> 36 #include <linux/string.h> 37 #include <linux/workqueue.h> 38 #include <net/dsfield.h> 39 #include <net/rtnetlink.h> 40 #include <uapi/linux/batadv_packet.h> 41 #include <uapi/linux/batman_adv.h> 42 43 #include "bat_algo.h" 44 #include "bat_iv_ogm.h" 45 #include "bat_v.h" 46 #include "bridge_loop_avoidance.h" 47 #include "debugfs.h" 48 #include "distributed-arp-table.h" 49 #include "gateway_client.h" 50 #include "gateway_common.h" 51 #include "hard-interface.h" 52 #include "icmp_socket.h" 53 #include "log.h" 54 #include "multicast.h" 55 #include "netlink.h" 56 #include "network-coding.h" 57 #include "originator.h" 58 #include "routing.h" 59 #include "send.h" 60 #include "soft-interface.h" 61 #include "tp_meter.h" 62 #include "translation-table.h" 63 64 /* List manipulations on hardif_list have to be rtnl_lock()'ed, 65 * list traversals just rcu-locked 66 */ 67 struct list_head batadv_hardif_list; 68 unsigned int batadv_hardif_generation; 69 static int (*batadv_rx_handler[256])(struct sk_buff *skb, 70 struct batadv_hard_iface *recv_if); 71 72 unsigned char batadv_broadcast_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; 73 74 struct workqueue_struct *batadv_event_workqueue; 75 76 static void batadv_recv_handler_init(void); 77 78 #define BATADV_UEV_TYPE_VAR "BATTYPE=" 79 #define BATADV_UEV_ACTION_VAR "BATACTION=" 80 #define BATADV_UEV_DATA_VAR "BATDATA=" 81 82 static char *batadv_uev_action_str[] = { 83 "add", 84 "del", 85 "change", 86 "loopdetect", 87 }; 88 89 static char *batadv_uev_type_str[] = { 90 "gw", 91 "bla", 92 }; 93 94 static int __init batadv_init(void) 95 { 96 int ret; 97 98 ret = batadv_tt_cache_init(); 99 if (ret < 0) 100 return ret; 101 102 INIT_LIST_HEAD(&batadv_hardif_list); 103 batadv_algo_init(); 104 105 batadv_recv_handler_init(); 106 107 batadv_v_init(); 108 batadv_iv_init(); 109 batadv_nc_init(); 110 batadv_tp_meter_init(); 111 112 batadv_event_workqueue = create_singlethread_workqueue("bat_events"); 113 if (!batadv_event_workqueue) 114 goto err_create_wq; 115 116 batadv_socket_init(); 117 batadv_debugfs_init(); 118 119 register_netdevice_notifier(&batadv_hard_if_notifier); 120 rtnl_link_register(&batadv_link_ops); 121 batadv_netlink_register(); 122 123 pr_info("B.A.T.M.A.N. advanced %s (compatibility version %i) loaded\n", 124 BATADV_SOURCE_VERSION, BATADV_COMPAT_VERSION); 125 126 return 0; 127 128 err_create_wq: 129 batadv_tt_cache_destroy(); 130 131 return -ENOMEM; 132 } 133 134 static void __exit batadv_exit(void) 135 { 136 batadv_debugfs_destroy(); 137 batadv_netlink_unregister(); 138 rtnl_link_unregister(&batadv_link_ops); 139 unregister_netdevice_notifier(&batadv_hard_if_notifier); 140 batadv_hardif_remove_interfaces(); 141 142 flush_workqueue(batadv_event_workqueue); 143 destroy_workqueue(batadv_event_workqueue); 144 batadv_event_workqueue = NULL; 145 146 rcu_barrier(); 147 148 batadv_tt_cache_destroy(); 149 } 150 151 /** 152 * batadv_mesh_init() - Initialize soft interface 153 * @soft_iface: netdev struct of the soft interface 154 * 155 * Return: 0 on success or negative error number in case of failure 156 */ 157 int batadv_mesh_init(struct net_device *soft_iface) 158 { 159 struct batadv_priv *bat_priv = netdev_priv(soft_iface); 160 int ret; 161 162 spin_lock_init(&bat_priv->forw_bat_list_lock); 163 spin_lock_init(&bat_priv->forw_bcast_list_lock); 164 spin_lock_init(&bat_priv->tt.changes_list_lock); 165 spin_lock_init(&bat_priv->tt.req_list_lock); 166 spin_lock_init(&bat_priv->tt.roam_list_lock); 167 spin_lock_init(&bat_priv->tt.last_changeset_lock); 168 spin_lock_init(&bat_priv->tt.commit_lock); 169 spin_lock_init(&bat_priv->gw.list_lock); 170 #ifdef CONFIG_BATMAN_ADV_MCAST 171 spin_lock_init(&bat_priv->mcast.want_lists_lock); 172 #endif 173 spin_lock_init(&bat_priv->tvlv.container_list_lock); 174 spin_lock_init(&bat_priv->tvlv.handler_list_lock); 175 spin_lock_init(&bat_priv->softif_vlan_list_lock); 176 spin_lock_init(&bat_priv->tp_list_lock); 177 178 INIT_HLIST_HEAD(&bat_priv->forw_bat_list); 179 INIT_HLIST_HEAD(&bat_priv->forw_bcast_list); 180 INIT_HLIST_HEAD(&bat_priv->gw.gateway_list); 181 #ifdef CONFIG_BATMAN_ADV_MCAST 182 INIT_HLIST_HEAD(&bat_priv->mcast.want_all_unsnoopables_list); 183 INIT_HLIST_HEAD(&bat_priv->mcast.want_all_ipv4_list); 184 INIT_HLIST_HEAD(&bat_priv->mcast.want_all_ipv6_list); 185 #endif 186 INIT_LIST_HEAD(&bat_priv->tt.changes_list); 187 INIT_HLIST_HEAD(&bat_priv->tt.req_list); 188 INIT_LIST_HEAD(&bat_priv->tt.roam_list); 189 #ifdef CONFIG_BATMAN_ADV_MCAST 190 INIT_HLIST_HEAD(&bat_priv->mcast.mla_list); 191 #endif 192 INIT_HLIST_HEAD(&bat_priv->tvlv.container_list); 193 INIT_HLIST_HEAD(&bat_priv->tvlv.handler_list); 194 INIT_HLIST_HEAD(&bat_priv->softif_vlan_list); 195 INIT_HLIST_HEAD(&bat_priv->tp_list); 196 197 bat_priv->gw.generation = 0; 198 199 ret = batadv_v_mesh_init(bat_priv); 200 if (ret < 0) 201 goto err; 202 203 ret = batadv_originator_init(bat_priv); 204 if (ret < 0) 205 goto err; 206 207 ret = batadv_tt_init(bat_priv); 208 if (ret < 0) 209 goto err; 210 211 ret = batadv_bla_init(bat_priv); 212 if (ret < 0) 213 goto err; 214 215 ret = batadv_dat_init(bat_priv); 216 if (ret < 0) 217 goto err; 218 219 ret = batadv_nc_mesh_init(bat_priv); 220 if (ret < 0) 221 goto err; 222 223 batadv_gw_init(bat_priv); 224 batadv_mcast_init(bat_priv); 225 226 atomic_set(&bat_priv->gw.reselect, 0); 227 atomic_set(&bat_priv->mesh_state, BATADV_MESH_ACTIVE); 228 229 return 0; 230 231 err: 232 batadv_mesh_free(soft_iface); 233 return ret; 234 } 235 236 /** 237 * batadv_mesh_free() - Deinitialize soft interface 238 * @soft_iface: netdev struct of the soft interface 239 */ 240 void batadv_mesh_free(struct net_device *soft_iface) 241 { 242 struct batadv_priv *bat_priv = netdev_priv(soft_iface); 243 244 atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING); 245 246 batadv_purge_outstanding_packets(bat_priv, NULL); 247 248 batadv_gw_node_free(bat_priv); 249 250 batadv_v_mesh_free(bat_priv); 251 batadv_nc_mesh_free(bat_priv); 252 batadv_dat_free(bat_priv); 253 batadv_bla_free(bat_priv); 254 255 batadv_mcast_free(bat_priv); 256 257 /* Free the TT and the originator tables only after having terminated 258 * all the other depending components which may use these structures for 259 * their purposes. 260 */ 261 batadv_tt_free(bat_priv); 262 263 /* Since the originator table clean up routine is accessing the TT 264 * tables as well, it has to be invoked after the TT tables have been 265 * freed and marked as empty. This ensures that no cleanup RCU callbacks 266 * accessing the TT data are scheduled for later execution. 267 */ 268 batadv_originator_free(bat_priv); 269 270 batadv_gw_free(bat_priv); 271 272 free_percpu(bat_priv->bat_counters); 273 bat_priv->bat_counters = NULL; 274 275 atomic_set(&bat_priv->mesh_state, BATADV_MESH_INACTIVE); 276 } 277 278 /** 279 * batadv_is_my_mac() - check if the given mac address belongs to any of the 280 * real interfaces in the current mesh 281 * @bat_priv: the bat priv with all the soft interface information 282 * @addr: the address to check 283 * 284 * Return: 'true' if the mac address was found, false otherwise. 285 */ 286 bool batadv_is_my_mac(struct batadv_priv *bat_priv, const u8 *addr) 287 { 288 const struct batadv_hard_iface *hard_iface; 289 bool is_my_mac = false; 290 291 rcu_read_lock(); 292 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) { 293 if (hard_iface->if_status != BATADV_IF_ACTIVE) 294 continue; 295 296 if (hard_iface->soft_iface != bat_priv->soft_iface) 297 continue; 298 299 if (batadv_compare_eth(hard_iface->net_dev->dev_addr, addr)) { 300 is_my_mac = true; 301 break; 302 } 303 } 304 rcu_read_unlock(); 305 return is_my_mac; 306 } 307 308 #ifdef CONFIG_BATMAN_ADV_DEBUGFS 309 /** 310 * batadv_seq_print_text_primary_if_get() - called from debugfs table printing 311 * function that requires the primary interface 312 * @seq: debugfs table seq_file struct 313 * 314 * Return: primary interface if found or NULL otherwise. 315 */ 316 struct batadv_hard_iface * 317 batadv_seq_print_text_primary_if_get(struct seq_file *seq) 318 { 319 struct net_device *net_dev = (struct net_device *)seq->private; 320 struct batadv_priv *bat_priv = netdev_priv(net_dev); 321 struct batadv_hard_iface *primary_if; 322 323 primary_if = batadv_primary_if_get_selected(bat_priv); 324 325 if (!primary_if) { 326 seq_printf(seq, 327 "BATMAN mesh %s disabled - please specify interfaces to enable it\n", 328 net_dev->name); 329 goto out; 330 } 331 332 if (primary_if->if_status == BATADV_IF_ACTIVE) 333 goto out; 334 335 seq_printf(seq, 336 "BATMAN mesh %s disabled - primary interface not active\n", 337 net_dev->name); 338 batadv_hardif_put(primary_if); 339 primary_if = NULL; 340 341 out: 342 return primary_if; 343 } 344 #endif 345 346 /** 347 * batadv_max_header_len() - calculate maximum encapsulation overhead for a 348 * payload packet 349 * 350 * Return: the maximum encapsulation overhead in bytes. 351 */ 352 int batadv_max_header_len(void) 353 { 354 int header_len = 0; 355 356 header_len = max_t(int, header_len, 357 sizeof(struct batadv_unicast_packet)); 358 header_len = max_t(int, header_len, 359 sizeof(struct batadv_unicast_4addr_packet)); 360 header_len = max_t(int, header_len, 361 sizeof(struct batadv_bcast_packet)); 362 363 #ifdef CONFIG_BATMAN_ADV_NC 364 header_len = max_t(int, header_len, 365 sizeof(struct batadv_coded_packet)); 366 #endif 367 368 return header_len + ETH_HLEN; 369 } 370 371 /** 372 * batadv_skb_set_priority() - sets skb priority according to packet content 373 * @skb: the packet to be sent 374 * @offset: offset to the packet content 375 * 376 * This function sets a value between 256 and 263 (802.1d priority), which 377 * can be interpreted by the cfg80211 or other drivers. 378 */ 379 void batadv_skb_set_priority(struct sk_buff *skb, int offset) 380 { 381 struct iphdr ip_hdr_tmp, *ip_hdr; 382 struct ipv6hdr ip6_hdr_tmp, *ip6_hdr; 383 struct ethhdr ethhdr_tmp, *ethhdr; 384 struct vlan_ethhdr *vhdr, vhdr_tmp; 385 u32 prio; 386 387 /* already set, do nothing */ 388 if (skb->priority >= 256 && skb->priority <= 263) 389 return; 390 391 ethhdr = skb_header_pointer(skb, offset, sizeof(*ethhdr), ðhdr_tmp); 392 if (!ethhdr) 393 return; 394 395 switch (ethhdr->h_proto) { 396 case htons(ETH_P_8021Q): 397 vhdr = skb_header_pointer(skb, offset + sizeof(*vhdr), 398 sizeof(*vhdr), &vhdr_tmp); 399 if (!vhdr) 400 return; 401 prio = ntohs(vhdr->h_vlan_TCI) & VLAN_PRIO_MASK; 402 prio = prio >> VLAN_PRIO_SHIFT; 403 break; 404 case htons(ETH_P_IP): 405 ip_hdr = skb_header_pointer(skb, offset + sizeof(*ethhdr), 406 sizeof(*ip_hdr), &ip_hdr_tmp); 407 if (!ip_hdr) 408 return; 409 prio = (ipv4_get_dsfield(ip_hdr) & 0xfc) >> 5; 410 break; 411 case htons(ETH_P_IPV6): 412 ip6_hdr = skb_header_pointer(skb, offset + sizeof(*ethhdr), 413 sizeof(*ip6_hdr), &ip6_hdr_tmp); 414 if (!ip6_hdr) 415 return; 416 prio = (ipv6_get_dsfield(ip6_hdr) & 0xfc) >> 5; 417 break; 418 default: 419 return; 420 } 421 422 skb->priority = prio + 256; 423 } 424 425 static int batadv_recv_unhandled_packet(struct sk_buff *skb, 426 struct batadv_hard_iface *recv_if) 427 { 428 kfree_skb(skb); 429 430 return NET_RX_DROP; 431 } 432 433 /* incoming packets with the batman ethertype received on any active hard 434 * interface 435 */ 436 437 /** 438 * batadv_batman_skb_recv() - Handle incoming message from an hard interface 439 * @skb: the received packet 440 * @dev: the net device that the packet was received on 441 * @ptype: packet type of incoming packet (ETH_P_BATMAN) 442 * @orig_dev: the original receive net device (e.g. bonded device) 443 * 444 * Return: NET_RX_SUCCESS on success or NET_RX_DROP in case of failure 445 */ 446 int batadv_batman_skb_recv(struct sk_buff *skb, struct net_device *dev, 447 struct packet_type *ptype, 448 struct net_device *orig_dev) 449 { 450 struct batadv_priv *bat_priv; 451 struct batadv_ogm_packet *batadv_ogm_packet; 452 struct batadv_hard_iface *hard_iface; 453 u8 idx; 454 455 hard_iface = container_of(ptype, struct batadv_hard_iface, 456 batman_adv_ptype); 457 458 /* Prevent processing a packet received on an interface which is getting 459 * shut down otherwise the packet may trigger de-reference errors 460 * further down in the receive path. 461 */ 462 if (!kref_get_unless_zero(&hard_iface->refcount)) 463 goto err_out; 464 465 skb = skb_share_check(skb, GFP_ATOMIC); 466 467 /* skb was released by skb_share_check() */ 468 if (!skb) 469 goto err_put; 470 471 /* packet should hold at least type and version */ 472 if (unlikely(!pskb_may_pull(skb, 2))) 473 goto err_free; 474 475 /* expect a valid ethernet header here. */ 476 if (unlikely(skb->mac_len != ETH_HLEN || !skb_mac_header(skb))) 477 goto err_free; 478 479 if (!hard_iface->soft_iface) 480 goto err_free; 481 482 bat_priv = netdev_priv(hard_iface->soft_iface); 483 484 if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE) 485 goto err_free; 486 487 /* discard frames on not active interfaces */ 488 if (hard_iface->if_status != BATADV_IF_ACTIVE) 489 goto err_free; 490 491 batadv_ogm_packet = (struct batadv_ogm_packet *)skb->data; 492 493 if (batadv_ogm_packet->version != BATADV_COMPAT_VERSION) { 494 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 495 "Drop packet: incompatible batman version (%i)\n", 496 batadv_ogm_packet->version); 497 goto err_free; 498 } 499 500 /* reset control block to avoid left overs from previous users */ 501 memset(skb->cb, 0, sizeof(struct batadv_skb_cb)); 502 503 idx = batadv_ogm_packet->packet_type; 504 (*batadv_rx_handler[idx])(skb, hard_iface); 505 506 batadv_hardif_put(hard_iface); 507 508 /* return NET_RX_SUCCESS in any case as we 509 * most probably dropped the packet for 510 * routing-logical reasons. 511 */ 512 return NET_RX_SUCCESS; 513 514 err_free: 515 kfree_skb(skb); 516 err_put: 517 batadv_hardif_put(hard_iface); 518 err_out: 519 return NET_RX_DROP; 520 } 521 522 static void batadv_recv_handler_init(void) 523 { 524 int i; 525 526 for (i = 0; i < ARRAY_SIZE(batadv_rx_handler); i++) 527 batadv_rx_handler[i] = batadv_recv_unhandled_packet; 528 529 for (i = BATADV_UNICAST_MIN; i <= BATADV_UNICAST_MAX; i++) 530 batadv_rx_handler[i] = batadv_recv_unhandled_unicast_packet; 531 532 /* compile time checks for sizes */ 533 BUILD_BUG_ON(sizeof(struct batadv_bla_claim_dst) != 6); 534 BUILD_BUG_ON(sizeof(struct batadv_ogm_packet) != 24); 535 BUILD_BUG_ON(sizeof(struct batadv_icmp_header) != 20); 536 BUILD_BUG_ON(sizeof(struct batadv_icmp_packet) != 20); 537 BUILD_BUG_ON(sizeof(struct batadv_icmp_packet_rr) != 116); 538 BUILD_BUG_ON(sizeof(struct batadv_unicast_packet) != 10); 539 BUILD_BUG_ON(sizeof(struct batadv_unicast_4addr_packet) != 18); 540 BUILD_BUG_ON(sizeof(struct batadv_frag_packet) != 20); 541 BUILD_BUG_ON(sizeof(struct batadv_bcast_packet) != 14); 542 BUILD_BUG_ON(sizeof(struct batadv_coded_packet) != 46); 543 BUILD_BUG_ON(sizeof(struct batadv_unicast_tvlv_packet) != 20); 544 BUILD_BUG_ON(sizeof(struct batadv_tvlv_hdr) != 4); 545 BUILD_BUG_ON(sizeof(struct batadv_tvlv_gateway_data) != 8); 546 BUILD_BUG_ON(sizeof(struct batadv_tvlv_tt_vlan_data) != 8); 547 BUILD_BUG_ON(sizeof(struct batadv_tvlv_tt_change) != 12); 548 BUILD_BUG_ON(sizeof(struct batadv_tvlv_roam_adv) != 8); 549 550 i = FIELD_SIZEOF(struct sk_buff, cb); 551 BUILD_BUG_ON(sizeof(struct batadv_skb_cb) > i); 552 553 /* broadcast packet */ 554 batadv_rx_handler[BATADV_BCAST] = batadv_recv_bcast_packet; 555 556 /* unicast packets ... */ 557 /* unicast with 4 addresses packet */ 558 batadv_rx_handler[BATADV_UNICAST_4ADDR] = batadv_recv_unicast_packet; 559 /* unicast packet */ 560 batadv_rx_handler[BATADV_UNICAST] = batadv_recv_unicast_packet; 561 /* unicast tvlv packet */ 562 batadv_rx_handler[BATADV_UNICAST_TVLV] = batadv_recv_unicast_tvlv; 563 /* batman icmp packet */ 564 batadv_rx_handler[BATADV_ICMP] = batadv_recv_icmp_packet; 565 /* Fragmented packets */ 566 batadv_rx_handler[BATADV_UNICAST_FRAG] = batadv_recv_frag_packet; 567 } 568 569 /** 570 * batadv_recv_handler_register() - Register handler for batman-adv packet type 571 * @packet_type: batadv_packettype which should be handled 572 * @recv_handler: receive handler for the packet type 573 * 574 * Return: 0 on success or negative error number in case of failure 575 */ 576 int 577 batadv_recv_handler_register(u8 packet_type, 578 int (*recv_handler)(struct sk_buff *, 579 struct batadv_hard_iface *)) 580 { 581 int (*curr)(struct sk_buff *skb, 582 struct batadv_hard_iface *recv_if); 583 curr = batadv_rx_handler[packet_type]; 584 585 if (curr != batadv_recv_unhandled_packet && 586 curr != batadv_recv_unhandled_unicast_packet) 587 return -EBUSY; 588 589 batadv_rx_handler[packet_type] = recv_handler; 590 return 0; 591 } 592 593 /** 594 * batadv_recv_handler_unregister() - Unregister handler for packet type 595 * @packet_type: batadv_packettype which should no longer be handled 596 */ 597 void batadv_recv_handler_unregister(u8 packet_type) 598 { 599 batadv_rx_handler[packet_type] = batadv_recv_unhandled_packet; 600 } 601 602 /** 603 * batadv_skb_crc32() - calculate CRC32 of the whole packet and skip bytes in 604 * the header 605 * @skb: skb pointing to fragmented socket buffers 606 * @payload_ptr: Pointer to position inside the head buffer of the skb 607 * marking the start of the data to be CRC'ed 608 * 609 * payload_ptr must always point to an address in the skb head buffer and not to 610 * a fragment. 611 * 612 * Return: big endian crc32c of the checksummed data 613 */ 614 __be32 batadv_skb_crc32(struct sk_buff *skb, u8 *payload_ptr) 615 { 616 u32 crc = 0; 617 unsigned int from; 618 unsigned int to = skb->len; 619 struct skb_seq_state st; 620 const u8 *data; 621 unsigned int len; 622 unsigned int consumed = 0; 623 624 from = (unsigned int)(payload_ptr - skb->data); 625 626 skb_prepare_seq_read(skb, from, to, &st); 627 while ((len = skb_seq_read(consumed, &data, &st)) != 0) { 628 crc = crc32c(crc, data, len); 629 consumed += len; 630 } 631 632 return htonl(crc); 633 } 634 635 /** 636 * batadv_get_vid() - extract the VLAN identifier from skb if any 637 * @skb: the buffer containing the packet 638 * @header_len: length of the batman header preceding the ethernet header 639 * 640 * Return: VID with the BATADV_VLAN_HAS_TAG flag when the packet embedded in the 641 * skb is vlan tagged. Otherwise BATADV_NO_FLAGS. 642 */ 643 unsigned short batadv_get_vid(struct sk_buff *skb, size_t header_len) 644 { 645 struct ethhdr *ethhdr = (struct ethhdr *)(skb->data + header_len); 646 struct vlan_ethhdr *vhdr; 647 unsigned short vid; 648 649 if (ethhdr->h_proto != htons(ETH_P_8021Q)) 650 return BATADV_NO_FLAGS; 651 652 if (!pskb_may_pull(skb, header_len + VLAN_ETH_HLEN)) 653 return BATADV_NO_FLAGS; 654 655 vhdr = (struct vlan_ethhdr *)(skb->data + header_len); 656 vid = ntohs(vhdr->h_vlan_TCI) & VLAN_VID_MASK; 657 vid |= BATADV_VLAN_HAS_TAG; 658 659 return vid; 660 } 661 662 /** 663 * batadv_vlan_ap_isola_get() - return AP isolation status for the given vlan 664 * @bat_priv: the bat priv with all the soft interface information 665 * @vid: the VLAN identifier for which the AP isolation attributed as to be 666 * looked up 667 * 668 * Return: true if AP isolation is on for the VLAN idenfied by vid, false 669 * otherwise 670 */ 671 bool batadv_vlan_ap_isola_get(struct batadv_priv *bat_priv, unsigned short vid) 672 { 673 bool ap_isolation_enabled = false; 674 struct batadv_softif_vlan *vlan; 675 676 /* if the AP isolation is requested on a VLAN, then check for its 677 * setting in the proper VLAN private data structure 678 */ 679 vlan = batadv_softif_vlan_get(bat_priv, vid); 680 if (vlan) { 681 ap_isolation_enabled = atomic_read(&vlan->ap_isolation); 682 batadv_softif_vlan_put(vlan); 683 } 684 685 return ap_isolation_enabled; 686 } 687 688 /** 689 * batadv_throw_uevent() - Send an uevent with batman-adv specific env data 690 * @bat_priv: the bat priv with all the soft interface information 691 * @type: subsystem type of event. Stored in uevent's BATTYPE 692 * @action: action type of event. Stored in uevent's BATACTION 693 * @data: string with additional information to the event (ignored for 694 * BATADV_UEV_DEL). Stored in uevent's BATDATA 695 * 696 * Return: 0 on success or negative error number in case of failure 697 */ 698 int batadv_throw_uevent(struct batadv_priv *bat_priv, enum batadv_uev_type type, 699 enum batadv_uev_action action, const char *data) 700 { 701 int ret = -ENOMEM; 702 struct kobject *bat_kobj; 703 char *uevent_env[4] = { NULL, NULL, NULL, NULL }; 704 705 bat_kobj = &bat_priv->soft_iface->dev.kobj; 706 707 uevent_env[0] = kasprintf(GFP_ATOMIC, 708 "%s%s", BATADV_UEV_TYPE_VAR, 709 batadv_uev_type_str[type]); 710 if (!uevent_env[0]) 711 goto out; 712 713 uevent_env[1] = kasprintf(GFP_ATOMIC, 714 "%s%s", BATADV_UEV_ACTION_VAR, 715 batadv_uev_action_str[action]); 716 if (!uevent_env[1]) 717 goto out; 718 719 /* If the event is DEL, ignore the data field */ 720 if (action != BATADV_UEV_DEL) { 721 uevent_env[2] = kasprintf(GFP_ATOMIC, 722 "%s%s", BATADV_UEV_DATA_VAR, data); 723 if (!uevent_env[2]) 724 goto out; 725 } 726 727 ret = kobject_uevent_env(bat_kobj, KOBJ_CHANGE, uevent_env); 728 out: 729 kfree(uevent_env[0]); 730 kfree(uevent_env[1]); 731 kfree(uevent_env[2]); 732 733 if (ret) 734 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 735 "Impossible to send uevent for (%s,%s,%s) event (err: %d)\n", 736 batadv_uev_type_str[type], 737 batadv_uev_action_str[action], 738 (action == BATADV_UEV_DEL ? "NULL" : data), ret); 739 return ret; 740 } 741 742 module_init(batadv_init); 743 module_exit(batadv_exit); 744 745 MODULE_LICENSE("GPL"); 746 747 MODULE_AUTHOR(BATADV_DRIVER_AUTHOR); 748 MODULE_DESCRIPTION(BATADV_DRIVER_DESC); 749 MODULE_SUPPORTED_DEVICE(BATADV_DRIVER_DEVICE); 750 MODULE_VERSION(BATADV_SOURCE_VERSION); 751 MODULE_ALIAS_RTNL_LINK("batadv"); 752 MODULE_ALIAS_GENL_FAMILY(BATADV_NL_NAME); 753