1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* Copyright (C) 2007-2017 B.A.T.M.A.N. contributors: 3 * 4 * Marek Lindner, Simon Wunderlich 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of version 2 of the GNU General Public 8 * License as published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope that it will be useful, but 11 * WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, see <http://www.gnu.org/licenses/>. 17 */ 18 19 #ifndef _NET_BATMAN_ADV_SEND_H_ 20 #define _NET_BATMAN_ADV_SEND_H_ 21 22 #include "main.h" 23 24 #include <linux/compiler.h> 25 #include <linux/spinlock.h> 26 #include <linux/types.h> 27 #include <uapi/linux/batadv_packet.h> 28 29 struct sk_buff; 30 31 void batadv_forw_packet_free(struct batadv_forw_packet *forw_packet, 32 bool dropped); 33 struct batadv_forw_packet * 34 batadv_forw_packet_alloc(struct batadv_hard_iface *if_incoming, 35 struct batadv_hard_iface *if_outgoing, 36 atomic_t *queue_left, 37 struct batadv_priv *bat_priv, 38 struct sk_buff *skb); 39 bool batadv_forw_packet_steal(struct batadv_forw_packet *packet, spinlock_t *l); 40 void batadv_forw_packet_ogmv1_queue(struct batadv_priv *bat_priv, 41 struct batadv_forw_packet *forw_packet, 42 unsigned long send_time); 43 bool batadv_forw_packet_is_rebroadcast(struct batadv_forw_packet *forw_packet); 44 45 int batadv_send_skb_to_orig(struct sk_buff *skb, 46 struct batadv_orig_node *orig_node, 47 struct batadv_hard_iface *recv_if); 48 int batadv_send_skb_packet(struct sk_buff *skb, 49 struct batadv_hard_iface *hard_iface, 50 const u8 *dst_addr); 51 int batadv_send_broadcast_skb(struct sk_buff *skb, 52 struct batadv_hard_iface *hard_iface); 53 int batadv_send_unicast_skb(struct sk_buff *skb, 54 struct batadv_neigh_node *neigh_node); 55 int batadv_add_bcast_packet_to_list(struct batadv_priv *bat_priv, 56 const struct sk_buff *skb, 57 unsigned long delay, 58 bool own_packet); 59 void 60 batadv_purge_outstanding_packets(struct batadv_priv *bat_priv, 61 const struct batadv_hard_iface *hard_iface); 62 bool batadv_send_skb_prepare_unicast_4addr(struct batadv_priv *bat_priv, 63 struct sk_buff *skb, 64 struct batadv_orig_node *orig_node, 65 int packet_subtype); 66 int batadv_send_skb_unicast(struct batadv_priv *bat_priv, 67 struct sk_buff *skb, int packet_type, 68 int packet_subtype, 69 struct batadv_orig_node *orig_node, 70 unsigned short vid); 71 int batadv_send_skb_via_tt_generic(struct batadv_priv *bat_priv, 72 struct sk_buff *skb, int packet_type, 73 int packet_subtype, u8 *dst_hint, 74 unsigned short vid); 75 int batadv_send_skb_via_gw(struct batadv_priv *bat_priv, struct sk_buff *skb, 76 unsigned short vid); 77 78 /** 79 * batadv_send_skb_via_tt() - send an skb via TT lookup 80 * @bat_priv: the bat priv with all the soft interface information 81 * @skb: the payload to send 82 * @dst_hint: can be used to override the destination contained in the skb 83 * @vid: the vid to be used to search the translation table 84 * 85 * Look up the recipient node for the destination address in the ethernet 86 * header via the translation table. Wrap the given skb into a batman-adv 87 * unicast header. Then send this frame to the according destination node. 88 * 89 * Return: NET_XMIT_DROP in case of error or NET_XMIT_SUCCESS otherwise. 90 */ 91 static inline int batadv_send_skb_via_tt(struct batadv_priv *bat_priv, 92 struct sk_buff *skb, u8 *dst_hint, 93 unsigned short vid) 94 { 95 return batadv_send_skb_via_tt_generic(bat_priv, skb, BATADV_UNICAST, 0, 96 dst_hint, vid); 97 } 98 99 /** 100 * batadv_send_skb_via_tt_4addr() - send an skb via TT lookup 101 * @bat_priv: the bat priv with all the soft interface information 102 * @skb: the payload to send 103 * @packet_subtype: the unicast 4addr packet subtype to use 104 * @dst_hint: can be used to override the destination contained in the skb 105 * @vid: the vid to be used to search the translation table 106 * 107 * Look up the recipient node for the destination address in the ethernet 108 * header via the translation table. Wrap the given skb into a batman-adv 109 * unicast-4addr header. Then send this frame to the according destination 110 * node. 111 * 112 * Return: NET_XMIT_DROP in case of error or NET_XMIT_SUCCESS otherwise. 113 */ 114 static inline int batadv_send_skb_via_tt_4addr(struct batadv_priv *bat_priv, 115 struct sk_buff *skb, 116 int packet_subtype, 117 u8 *dst_hint, 118 unsigned short vid) 119 { 120 return batadv_send_skb_via_tt_generic(bat_priv, skb, 121 BATADV_UNICAST_4ADDR, 122 packet_subtype, dst_hint, vid); 123 } 124 125 #endif /* _NET_BATMAN_ADV_SEND_H_ */ 126