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 28 #include "packet.h" 29 30 struct sk_buff; 31 32 void batadv_forw_packet_free(struct batadv_forw_packet *forw_packet, 33 bool dropped); 34 struct batadv_forw_packet * 35 batadv_forw_packet_alloc(struct batadv_hard_iface *if_incoming, 36 struct batadv_hard_iface *if_outgoing, 37 atomic_t *queue_left, 38 struct batadv_priv *bat_priv, 39 struct sk_buff *skb); 40 bool batadv_forw_packet_steal(struct batadv_forw_packet *packet, spinlock_t *l); 41 void batadv_forw_packet_ogmv1_queue(struct batadv_priv *bat_priv, 42 struct batadv_forw_packet *forw_packet, 43 unsigned long send_time); 44 bool batadv_forw_packet_is_rebroadcast(struct batadv_forw_packet *forw_packet); 45 46 int batadv_send_skb_to_orig(struct sk_buff *skb, 47 struct batadv_orig_node *orig_node, 48 struct batadv_hard_iface *recv_if); 49 int batadv_send_skb_packet(struct sk_buff *skb, 50 struct batadv_hard_iface *hard_iface, 51 const u8 *dst_addr); 52 int batadv_send_broadcast_skb(struct sk_buff *skb, 53 struct batadv_hard_iface *hard_iface); 54 int batadv_send_unicast_skb(struct sk_buff *skb, 55 struct batadv_neigh_node *neigh_node); 56 int batadv_add_bcast_packet_to_list(struct batadv_priv *bat_priv, 57 const struct sk_buff *skb, 58 unsigned long delay, 59 bool own_packet); 60 void 61 batadv_purge_outstanding_packets(struct batadv_priv *bat_priv, 62 const struct batadv_hard_iface *hard_iface); 63 bool batadv_send_skb_prepare_unicast_4addr(struct batadv_priv *bat_priv, 64 struct sk_buff *skb, 65 struct batadv_orig_node *orig_node, 66 int packet_subtype); 67 int batadv_send_skb_unicast(struct batadv_priv *bat_priv, 68 struct sk_buff *skb, int packet_type, 69 int packet_subtype, 70 struct batadv_orig_node *orig_node, 71 unsigned short vid); 72 int batadv_send_skb_via_tt_generic(struct batadv_priv *bat_priv, 73 struct sk_buff *skb, int packet_type, 74 int packet_subtype, u8 *dst_hint, 75 unsigned short vid); 76 int batadv_send_skb_via_gw(struct batadv_priv *bat_priv, struct sk_buff *skb, 77 unsigned short vid); 78 79 /** 80 * batadv_send_skb_via_tt() - send an skb via TT lookup 81 * @bat_priv: the bat priv with all the soft interface information 82 * @skb: the payload to send 83 * @dst_hint: can be used to override the destination contained in the skb 84 * @vid: the vid to be used to search the translation table 85 * 86 * Look up the recipient node for the destination address in the ethernet 87 * header via the translation table. Wrap the given skb into a batman-adv 88 * unicast header. Then send this frame to the according destination node. 89 * 90 * Return: NET_XMIT_DROP in case of error or NET_XMIT_SUCCESS otherwise. 91 */ 92 static inline int batadv_send_skb_via_tt(struct batadv_priv *bat_priv, 93 struct sk_buff *skb, u8 *dst_hint, 94 unsigned short vid) 95 { 96 return batadv_send_skb_via_tt_generic(bat_priv, skb, BATADV_UNICAST, 0, 97 dst_hint, vid); 98 } 99 100 /** 101 * batadv_send_skb_via_tt_4addr() - send an skb via TT lookup 102 * @bat_priv: the bat priv with all the soft interface information 103 * @skb: the payload to send 104 * @packet_subtype: the unicast 4addr packet subtype to use 105 * @dst_hint: can be used to override the destination contained in the skb 106 * @vid: the vid to be used to search the translation table 107 * 108 * Look up the recipient node for the destination address in the ethernet 109 * header via the translation table. Wrap the given skb into a batman-adv 110 * unicast-4addr header. Then send this frame to the according destination 111 * node. 112 * 113 * Return: NET_XMIT_DROP in case of error or NET_XMIT_SUCCESS otherwise. 114 */ 115 static inline int batadv_send_skb_via_tt_4addr(struct batadv_priv *bat_priv, 116 struct sk_buff *skb, 117 int packet_subtype, 118 u8 *dst_hint, 119 unsigned short vid) 120 { 121 return batadv_send_skb_via_tt_generic(bat_priv, skb, 122 BATADV_UNICAST_4ADDR, 123 packet_subtype, dst_hint, vid); 124 } 125 126 #endif /* _NET_BATMAN_ADV_SEND_H_ */ 127