blob: e72ddf3d20e82e4e8def8d92e1702992a97aacab [file] [log] [blame]
Ben Menchaca84f36632014-02-28 20:57:38 +00001/*
2 **************************************************************************
Gareth Williamsd5618a82015-05-20 11:13:32 +01003 * Copyright (c) 2014-2015 The Linux Foundation. All rights reserved.
Ben Menchaca84f36632014-02-28 20:57:38 +00004 * Permission to use, copy, modify, and/or distribute this software for
5 * any purpose with or without fee is hereby granted, provided that the
6 * above copyright notice and this permission notice appear in all copies.
7 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
10 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
12 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
13 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14 **************************************************************************
15 */
16
17/*
Ben Menchaca84f36632014-02-28 20:57:38 +000018 * struct ecm_interface_route
19 * An ecm route supports either v4 or v6 routing information
20 */
21struct ecm_interface_route {
22 struct dst_entry *dst; /* Both ipv4 and v6 have a common dst entry */
23 union {
24 struct rtable *rtv4; /* IPv4 route */
25 struct rt6_info *rtv6; /* IPv6 route */
26 } rt;
27 bool v4_route; /* True when a v4 route, false when v6 */
28};
29
30/*
Shyam Sunder6358b862015-05-04 15:06:24 +053031 * Netdev Index value for a Loopback device
32 */
33#define ECM_INTERFACE_LOOPBACK_DEV_INDEX 1
34
35/*
Ben Menchaca84f36632014-02-28 20:57:38 +000036 * External defined functions
37 */
38extern struct net_device *bond_get_tx_dev(struct sk_buff *skb, uint8_t *src_mac,
39 uint8_t *dst_mac, void *src,
40 void *dst, uint16_t protocol,
41 struct net_device *bond_dev);
42bool ecm_interface_mac_addr_get(ip_addr_t addr, uint8_t *mac_addr, bool *on_link, ip_addr_t gw_addr);
43bool ecm_interface_find_route_by_addr(ip_addr_t addr, struct ecm_interface_route *ecm_rt);
44void ecm_interface_route_release(struct ecm_interface_route *rt);
Murat Sezgin188b4a32015-06-03 10:58:59 -070045#ifdef ECM_IPV6_ENABLE
46void ecm_interface_send_neighbour_solicitation(struct net_device *dev, ip_addr_t addr);
47#endif
48void ecm_interface_send_arp_request(struct net_device *dest_dev, ip_addr_t dest_addr, bool on_link, ip_addr_t gw_addr);
Xiaoping Fan80e406b2015-01-29 16:15:31 -080049bool ecm_interface_skip_l2tp_pptp(struct sk_buff *skb, const struct net_device *out);
Murat Sezgin91c5d712015-06-12 15:16:22 -070050struct ecm_db_iface_instance *ecm_interface_establish_and_ref(struct ecm_front_end_connection_instance *feci, struct net_device *dev);
Shyam Sunder6358b862015-05-04 15:06:24 +053051
52#ifdef ECM_MULTICAST_ENABLE
Murat Sezgin91c5d712015-06-12 15:16:22 -070053int32_t ecm_interface_multicast_heirarchy_construct_routed(struct ecm_front_end_connection_instance *feci, struct ecm_db_iface_instance *interfaces, struct net_device *in_dev, ip_addr_t packet_src_addr, ip_addr_t packet_dest_addr, uint8_t maxvif, uint32_t *dst_dev, uint32_t *to_interface_first);
Shyam Sunder6358b862015-05-04 15:06:24 +053054
Shyam Sunder81836832015-07-09 19:18:25 +053055int32_t ecm_interface_multicast_heirarchy_construct_bridged(struct ecm_front_end_connection_instance *feci, struct ecm_db_iface_instance *interfaces, struct net_device *br_dev, ip_addr_t src_addr, ip_addr_t dest_addr, uint8_t mc_max_dst, int32_t *mc_dst_dev, uint32_t *to_interface_first, uint8_t *src_node_addr);
Shyam Sunder6358b862015-05-04 15:06:24 +053056
57void ecm_interface_multicast_stats_update(struct ecm_db_connection_instance *ci, uint32_t from_tx_packets, uint32_t from_tx_bytes, uint32_t from_rx_packets, uint32_t from_rx_bytes, uint32_t to_tx_packets, uint32_t to_tx_bytes, uint32_t to_rx_packets, uint32_t to_rx_bytes);
58
59bool ecm_interface_multicast_find_updates_to_iface_list(struct ecm_db_connection_instance *ci, struct ecm_multicast_if_update *, uint32_t flags, bool is_br_snooper, uint32_t *dst_dev, uint32_t max_to_dev);
60
61bool ecm_interface_multicast_check_for_br_dev(uint32_t dest_if[], uint8_t max_if);
62#endif
63
Murat Sezgin91c5d712015-06-12 15:16:22 -070064int32_t ecm_interface_heirarchy_construct(struct ecm_front_end_connection_instance *feci,
65 struct ecm_db_iface_instance *interfaces[],
Murat Sezgin188b4a32015-06-03 10:58:59 -070066 ip_addr_t packet_src_addr, ip_addr_t packet_dest_addr,
67 int ip_version, int packet_protocol,
68 struct net_device *given_dest_dev, bool is_routed,
69 struct net_device *given_src_dev,
70 uint8_t *dest_node_addr, uint8_t *src_node_addr);
71void ecm_interface_stats_update(struct ecm_db_connection_instance *ci, uint32_t from_tx_packets, uint32_t from_tx_bytes, uint32_t from_rx_packets, uint32_t from_rx_bytes, uint32_t to_tx_packets, uint32_t to_tx_bytes, uint32_t to_rx_packets, uint32_t to_rx_bytes);
Gareth Williams46f4b5f2014-06-01 23:35:23 +010072struct net_device *ecm_interface_dev_find_by_addr(ip_addr_t addr, bool *from_local_addr);
Shyam Sunder6358b862015-05-04 15:06:24 +053073void ecm_interface_stats_update(struct ecm_db_connection_instance *ci, uint32_t from_tx_packets, uint32_t from_tx_bytes, uint32_t from_rx_packets, uint32_t from_rx_bytes, uint32_t to_tx_packets, uint32_t to_tx_bytes, uint32_t to_rx_packets, uint32_t to_rx_bytes);
74
Murat Sezginb3731e82014-11-26 12:20:59 -080075struct net_device *ecm_interface_get_and_hold_dev_master(struct net_device *dev);
Tushar Mathurcccbf282015-01-13 01:22:44 +053076void ecm_interface_dev_regenerate_connections(struct net_device *dev);