Lines Matching +full:re +full:- +full:routed

1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (C) 2007-2020 B.A.T.M.A.N. contributors:
29 #include "distributed-arp-table.h"
31 #include "hard-interface.h"
34 #include "network-coding.h"
37 #include "soft-interface.h"
39 #include "translation-table.h"
46 * _batadv_update_route() - set the router for this originator
66 spin_lock_bh(&orig_node->neigh_list_lock); in _batadv_update_route()
67 /* curr_router used earlier may not be the current orig_ifinfo->router in _batadv_update_route()
77 kref_get(&neigh_node->refcount); in _batadv_update_route()
79 curr_router = rcu_replace_pointer(orig_ifinfo->router, neigh_node, in _batadv_update_route()
81 spin_unlock_bh(&orig_node->neigh_list_lock); in _batadv_update_route()
87 "Deleting route towards: %pM\n", orig_node->orig); in _batadv_update_route()
88 batadv_tt_global_del_orig(bat_priv, orig_node, -1, in _batadv_update_route()
95 orig_node->orig, neigh_node->addr); in _batadv_update_route()
99 "Changing route towards: %pM (now via %pM - was via %pM)\n", in _batadv_update_route()
100 orig_node->orig, neigh_node->addr, in _batadv_update_route()
101 curr_router->addr); in _batadv_update_route()
110 * batadv_update_route() - set the router for this originator
137 * batadv_window_protected() - checks whether the host restarted and is in the
156 if (seq_num_diff <= -seq_old_max_diff || in batadv_window_protected()
173 * batadv_check_management_packet() - Check preconditions for management packets
193 if (!is_broadcast_ether_addr(ethhdr->h_dest)) in batadv_check_management_packet()
197 if (!is_valid_ether_addr(ethhdr->h_source)) in batadv_check_management_packet()
212 * batadv_recv_my_icmp_packet() - receive an icmp packet locally
227 icmph = (struct batadv_icmp_header *)skb->data; in batadv_recv_my_icmp_packet()
229 switch (icmph->msg_type) { in batadv_recv_my_icmp_packet()
237 batadv_socket_receive_packet(icmph, skb->len); in batadv_recv_my_icmp_packet()
246 orig_node = batadv_orig_hash_find(bat_priv, icmph->orig); in batadv_recv_my_icmp_packet()
254 icmph = (struct batadv_icmp_header *)skb->data; in batadv_recv_my_icmp_packet()
256 ether_addr_copy(icmph->dst, icmph->orig); in batadv_recv_my_icmp_packet()
257 ether_addr_copy(icmph->orig, primary_if->net_dev->dev_addr); in batadv_recv_my_icmp_packet()
258 icmph->msg_type = BATADV_ECHO_REPLY; in batadv_recv_my_icmp_packet()
259 icmph->ttl = BATADV_TTL; in batadv_recv_my_icmp_packet()
300 icmp_packet = (struct batadv_icmp_packet *)skb->data; in batadv_recv_icmp_ttl_exceeded()
303 if (icmp_packet->msg_type != BATADV_ECHO_REQUEST) { in batadv_recv_icmp_ttl_exceeded()
304 pr_debug("Warning - can't forward icmp packet from %pM to %pM: ttl exceeded\n", in batadv_recv_icmp_ttl_exceeded()
305 icmp_packet->orig, icmp_packet->dst); in batadv_recv_icmp_ttl_exceeded()
314 orig_node = batadv_orig_hash_find(bat_priv, icmp_packet->orig); in batadv_recv_icmp_ttl_exceeded()
322 icmp_packet = (struct batadv_icmp_packet *)skb->data; in batadv_recv_icmp_ttl_exceeded()
324 ether_addr_copy(icmp_packet->dst, icmp_packet->orig); in batadv_recv_icmp_ttl_exceeded()
325 ether_addr_copy(icmp_packet->orig, primary_if->net_dev->dev_addr); in batadv_recv_icmp_ttl_exceeded()
326 icmp_packet->msg_type = BATADV_TTL_EXCEEDED; in batadv_recv_icmp_ttl_exceeded()
327 icmp_packet->ttl = BATADV_TTL; in batadv_recv_icmp_ttl_exceeded()
348 * batadv_recv_icmp_packet() - Process incoming icmp packet
357 struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface); in batadv_recv_icmp_packet()
371 /* packet with unicast indication but non-unicast recipient */ in batadv_recv_icmp_packet()
372 if (!is_valid_ether_addr(ethhdr->h_dest)) in batadv_recv_icmp_packet()
376 if (is_multicast_ether_addr(ethhdr->h_source)) in batadv_recv_icmp_packet()
380 if (!batadv_is_my_mac(bat_priv, ethhdr->h_dest)) in batadv_recv_icmp_packet()
383 icmph = (struct batadv_icmp_header *)skb->data; in batadv_recv_icmp_packet()
386 if ((icmph->msg_type == BATADV_ECHO_REPLY || in batadv_recv_icmp_packet()
387 icmph->msg_type == BATADV_ECHO_REQUEST) && in batadv_recv_icmp_packet()
388 skb->len >= sizeof(struct batadv_icmp_packet_rr)) { in batadv_recv_icmp_packet()
397 icmph = (struct batadv_icmp_header *)skb->data; in batadv_recv_icmp_packet()
399 if (icmp_packet_rr->rr_cur >= BATADV_RR_LEN) in batadv_recv_icmp_packet()
402 ether_addr_copy(icmp_packet_rr->rr[icmp_packet_rr->rr_cur], in batadv_recv_icmp_packet()
403 ethhdr->h_dest); in batadv_recv_icmp_packet()
404 icmp_packet_rr->rr_cur++; in batadv_recv_icmp_packet()
408 if (batadv_is_my_mac(bat_priv, icmph->dst)) in batadv_recv_icmp_packet()
412 if (icmph->ttl < 2) in batadv_recv_icmp_packet()
416 orig_node = batadv_orig_hash_find(bat_priv, icmph->dst); in batadv_recv_icmp_packet()
424 icmph = (struct batadv_icmp_header *)skb->data; in batadv_recv_icmp_packet()
427 icmph->ttl--; in batadv_recv_icmp_packet()
447 * batadv_check_unicast_packet() - Check for malformed unicast packets
455 * depends on the reason: -ENODATA for bad header, -EBADR for broadcast
456 * destination or source, and -EREMOTE for non-local (other host) destination.
465 return -ENODATA; in batadv_check_unicast_packet()
469 /* packet with unicast indication but non-unicast recipient */ in batadv_check_unicast_packet()
470 if (!is_valid_ether_addr(ethhdr->h_dest)) in batadv_check_unicast_packet()
471 return -EBADR; in batadv_check_unicast_packet()
474 if (is_multicast_ether_addr(ethhdr->h_source)) in batadv_check_unicast_packet()
475 return -EBADR; in batadv_check_unicast_packet()
478 if (!batadv_is_my_mac(bat_priv, ethhdr->h_dest)) in batadv_check_unicast_packet()
479 return -EREMOTE; in batadv_check_unicast_packet()
485 * batadv_last_bonding_get() - Get last_bonding_candidate of orig_node
497 spin_lock_bh(&orig_node->neigh_list_lock); in batadv_last_bonding_get()
498 last_bonding_candidate = orig_node->last_bonding_candidate; in batadv_last_bonding_get()
501 kref_get(&last_bonding_candidate->refcount); in batadv_last_bonding_get()
502 spin_unlock_bh(&orig_node->neigh_list_lock); in batadv_last_bonding_get()
508 * batadv_last_bonding_replace() - Replace last_bonding_candidate of orig_node
518 spin_lock_bh(&orig_node->neigh_list_lock); in batadv_last_bonding_replace()
519 old_candidate = orig_node->last_bonding_candidate; in batadv_last_bonding_replace()
522 kref_get(&new_candidate->refcount); in batadv_last_bonding_replace()
523 orig_node->last_bonding_candidate = new_candidate; in batadv_last_bonding_replace()
524 spin_unlock_bh(&orig_node->neigh_list_lock); in batadv_last_bonding_replace()
531 * batadv_find_router() - find a suitable router for this originator
544 struct batadv_algo_ops *bao = bat_priv->algo_ops; in batadv_find_router()
565 if (!(recv_if == BATADV_IF_DEFAULT && atomic_read(&bat_priv->bonding))) in batadv_find_router()
574 * router - obviously there are no other candidates. in batadv_find_router()
579 last_cand_router = rcu_dereference(last_candidate->router); in batadv_find_router()
581 hlist_for_each_entry_rcu(cand, &orig_node->ifinfo_list, list) { in batadv_find_router()
583 if (!kref_get_unless_zero(&cand->refcount)) in batadv_find_router()
586 cand_router = rcu_dereference(cand->router); in batadv_find_router()
590 if (!kref_get_unless_zero(&cand_router->refcount)) { in batadv_find_router()
598 if (!bao->neigh.is_similar_or_better(cand_router, in batadv_find_router()
599 cand->if_outgoing, router, in batadv_find_router()
609 kref_get(&cand_router->refcount); in batadv_find_router()
610 kref_get(&cand->refcount); in batadv_find_router()
645 kref_get(&next_candidate_router->refcount); in batadv_find_router()
651 kref_get(&first_candidate_router->refcount); in batadv_find_router()
678 struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface); in batadv_route_unicast_packet()
685 unicast_packet = (struct batadv_unicast_packet *)skb->data; in batadv_route_unicast_packet()
688 if (unicast_packet->ttl < 2) { in batadv_route_unicast_packet()
689 pr_debug("Warning - can't forward unicast packet from %pM to %pM: ttl exceeded\n", in batadv_route_unicast_packet()
690 ethhdr->h_source, unicast_packet->dest); in batadv_route_unicast_packet()
695 orig_node = batadv_orig_hash_find(bat_priv, unicast_packet->dest); in batadv_route_unicast_packet()
705 unicast_packet = (struct batadv_unicast_packet *)skb->data; in batadv_route_unicast_packet()
706 unicast_packet->ttl--; in batadv_route_unicast_packet()
708 switch (unicast_packet->packet_type) { in batadv_route_unicast_packet()
716 /* other packet types not supported - yet */ in batadv_route_unicast_packet()
717 hdr_len = -1; in batadv_route_unicast_packet()
724 len = skb->len; in batadv_route_unicast_packet()
748 * batadv_reroute_unicast_packet() - update the unicast header for re-routing
775 orig_addr = primary_if->net_dev->dev_addr; in batadv_reroute_unicast_packet()
776 orig_ttvn = (u8)atomic_read(&bat_priv->tt.vn); in batadv_reroute_unicast_packet()
783 if (batadv_compare_eth(orig_node->orig, unicast_packet->dest)) in batadv_reroute_unicast_packet()
786 orig_addr = orig_node->orig; in batadv_reroute_unicast_packet()
787 orig_ttvn = (u8)atomic_read(&orig_node->last_ttvn); in batadv_reroute_unicast_packet()
792 ether_addr_copy(unicast_packet->dest, orig_addr); in batadv_reroute_unicast_packet()
793 unicast_packet->ttvn = orig_ttvn; in batadv_reroute_unicast_packet()
821 /* create a copy of the skb (in case of for re-routing) to modify it. */ in batadv_check_unicast_ttvn()
825 unicast_packet = (struct batadv_unicast_packet *)skb->data; in batadv_check_unicast_ttvn()
827 ethhdr = (struct ethhdr *)(skb->data + hdr_len); in batadv_check_unicast_ttvn()
830 if (is_multicast_ether_addr(ethhdr->h_dest)) in batadv_check_unicast_ttvn()
835 * message and that it knows the new destination in the mesh to re-route in batadv_check_unicast_ttvn()
838 if (batadv_tt_local_client_is_roaming(bat_priv, ethhdr->h_dest, vid)) { in batadv_check_unicast_ttvn()
840 ethhdr->h_dest, vid)) in batadv_check_unicast_ttvn()
844 unicast_packet->dest, in batadv_check_unicast_ttvn()
845 ethhdr->h_dest); in batadv_check_unicast_ttvn()
855 * value is used later to check if the node which sent (or re-routed in batadv_check_unicast_ttvn()
858 curr_ttvn = (u8)atomic_read(&bat_priv->tt.vn); in batadv_check_unicast_ttvn()
859 if (!batadv_is_my_mac(bat_priv, unicast_packet->dest)) { in batadv_check_unicast_ttvn()
861 unicast_packet->dest); in batadv_check_unicast_ttvn()
869 curr_ttvn = (u8)atomic_read(&orig_node->last_ttvn); in batadv_check_unicast_ttvn()
876 is_old_ttvn = batadv_seq_before(unicast_packet->ttvn, curr_ttvn); in batadv_check_unicast_ttvn()
880 old_ttvn = unicast_packet->ttvn; in batadv_check_unicast_ttvn()
886 ethhdr->h_dest, vid)) { in batadv_check_unicast_ttvn()
889 unicast_packet->dest, ethhdr->h_dest, in batadv_check_unicast_ttvn()
894 /* the packet has not been re-routed: either the destination is in batadv_check_unicast_ttvn()
898 if (!batadv_is_my_client(bat_priv, ethhdr->h_dest, vid)) in batadv_check_unicast_ttvn()
910 ether_addr_copy(unicast_packet->dest, primary_if->net_dev->dev_addr); in batadv_check_unicast_ttvn()
911 unicast_packet->ttvn = curr_ttvn; in batadv_check_unicast_ttvn()
920 * batadv_recv_unhandled_unicast_packet() - receive and process packets which
932 struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface); in batadv_recv_unhandled_unicast_packet()
940 unicast_packet = (struct batadv_unicast_packet *)skb->data; in batadv_recv_unhandled_unicast_packet()
941 if (batadv_is_my_mac(bat_priv, unicast_packet->dest)) in batadv_recv_unhandled_unicast_packet()
952 * batadv_recv_unicast_packet() - Process incoming unicast packet
961 struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface); in batadv_recv_unicast_packet()
971 unicast_packet = (struct batadv_unicast_packet *)skb->data; in batadv_recv_unicast_packet()
972 is4addr = unicast_packet->packet_type == BATADV_UNICAST_4ADDR; in batadv_recv_unicast_packet()
977 /* function returns -EREMOTE for promiscuous packets */ in batadv_recv_unicast_packet()
983 if (check == -EREMOTE) in batadv_recv_unicast_packet()
991 unicast_packet = (struct batadv_unicast_packet *)skb->data; in batadv_recv_unicast_packet()
994 if (batadv_is_my_mac(bat_priv, unicast_packet->dest)) { in batadv_recv_unicast_packet()
998 orig_addr_gw = eth_hdr(skb)->h_source; in batadv_recv_unicast_packet()
1014 (struct batadv_unicast_4addr_packet *)skb->data; in batadv_recv_unicast_packet()
1015 subtype = unicast_4addr_packet->subtype; in batadv_recv_unicast_packet()
1025 orig_addr = unicast_4addr_packet->src; in batadv_recv_unicast_packet()
1040 batadv_interface_rx(recv_if->soft_iface, skb, hdr_size, in batadv_recv_unicast_packet()
1061 * batadv_recv_unicast_tvlv() - receive and process unicast tvlv packets
1071 struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface); in batadv_recv_unicast_tvlv()
1089 unicast_tvlv_packet = (struct batadv_unicast_tvlv_packet *)skb->data; in batadv_recv_unicast_tvlv()
1091 tvlv_buff = (unsigned char *)(skb->data + hdr_size); in batadv_recv_unicast_tvlv()
1092 tvlv_buff_len = ntohs(unicast_tvlv_packet->tvlv_len); in batadv_recv_unicast_tvlv()
1094 if (tvlv_buff_len > skb->len - hdr_size) in batadv_recv_unicast_tvlv()
1098 unicast_tvlv_packet->src, in batadv_recv_unicast_tvlv()
1099 unicast_tvlv_packet->dst, in batadv_recv_unicast_tvlv()
1115 * batadv_recv_frag_packet() - process received fragment
1128 struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface); in batadv_recv_frag_packet()
1137 frag_packet = (struct batadv_frag_packet *)skb->data; in batadv_recv_frag_packet()
1138 orig_node_src = batadv_orig_hash_find(bat_priv, frag_packet->orig); in batadv_recv_frag_packet()
1142 skb->priority = frag_packet->priority + 256; in batadv_recv_frag_packet()
1145 if (!batadv_is_my_mac(bat_priv, frag_packet->dest) && in batadv_recv_frag_packet()
1154 batadv_add_counter(bat_priv, BATADV_CNT_FRAG_RX_BYTES, skb->len); in batadv_recv_frag_packet()
1164 batadv_batman_skb_recv(skb, recv_if->net_dev, in batadv_recv_frag_packet()
1165 &recv_if->batman_adv_ptype, NULL); in batadv_recv_frag_packet()
1181 * batadv_recv_bcast_packet() - Process incoming broadcast packet
1190 struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface); in batadv_recv_bcast_packet()
1206 if (!is_broadcast_ether_addr(ethhdr->h_dest)) in batadv_recv_bcast_packet()
1210 if (is_multicast_ether_addr(ethhdr->h_source)) in batadv_recv_bcast_packet()
1214 if (batadv_is_my_mac(bat_priv, ethhdr->h_source)) in batadv_recv_bcast_packet()
1217 bcast_packet = (struct batadv_bcast_packet *)skb->data; in batadv_recv_bcast_packet()
1220 if (batadv_is_my_mac(bat_priv, bcast_packet->orig)) in batadv_recv_bcast_packet()
1223 if (bcast_packet->ttl < 2) in batadv_recv_bcast_packet()
1226 orig_node = batadv_orig_hash_find(bat_priv, bcast_packet->orig); in batadv_recv_bcast_packet()
1231 spin_lock_bh(&orig_node->bcast_seqno_lock); in batadv_recv_bcast_packet()
1233 seqno = ntohl(bcast_packet->seqno); in batadv_recv_bcast_packet()
1235 if (batadv_test_bit(orig_node->bcast_bits, orig_node->last_bcast_seqno, in batadv_recv_bcast_packet()
1239 seq_diff = seqno - orig_node->last_bcast_seqno; in batadv_recv_bcast_packet()
1244 &orig_node->bcast_seqno_reset, NULL)) in batadv_recv_bcast_packet()
1250 if (batadv_bit_get_packet(bat_priv, orig_node->bcast_bits, seq_diff, 1)) in batadv_recv_bcast_packet()
1251 orig_node->last_bcast_seqno = seqno; in batadv_recv_bcast_packet()
1253 spin_unlock_bh(&orig_node->bcast_seqno_lock); in batadv_recv_bcast_packet()
1278 batadv_interface_rx(recv_if->soft_iface, skb, hdr_size, orig_node); in batadv_recv_bcast_packet()
1285 spin_unlock_bh(&orig_node->bcast_seqno_lock); in batadv_recv_bcast_packet()