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