1b97bf3fdSPer Liden /*
2b97bf3fdSPer Liden * net/tipc/bearer.h: Include file for TIPC bearer code
3b97bf3fdSPer Liden *
435c55c98SJon Paul Maloy * Copyright (c) 1996-2006, 2013-2016, Ericsson AB
52d627b92SAllan Stephens * Copyright (c) 2005, 2010-2011, Wind River Systems
6b97bf3fdSPer Liden * All rights reserved.
7b97bf3fdSPer Liden *
8b97bf3fdSPer Liden * Redistribution and use in source and binary forms, with or without
9b97bf3fdSPer Liden * modification, are permitted provided that the following conditions are met:
10b97bf3fdSPer Liden *
119ea1fd3cSPer Liden * 1. Redistributions of source code must retain the above copyright
129ea1fd3cSPer Liden * notice, this list of conditions and the following disclaimer.
139ea1fd3cSPer Liden * 2. Redistributions in binary form must reproduce the above copyright
149ea1fd3cSPer Liden * notice, this list of conditions and the following disclaimer in the
159ea1fd3cSPer Liden * documentation and/or other materials provided with the distribution.
169ea1fd3cSPer Liden * 3. Neither the names of the copyright holders nor the names of its
179ea1fd3cSPer Liden * contributors may be used to endorse or promote products derived from
189ea1fd3cSPer Liden * this software without specific prior written permission.
199ea1fd3cSPer Liden *
209ea1fd3cSPer Liden * Alternatively, this software may be distributed under the terms of the
219ea1fd3cSPer Liden * GNU General Public License ("GPL") version 2 as published by the Free
229ea1fd3cSPer Liden * Software Foundation.
23b97bf3fdSPer Liden *
24b97bf3fdSPer Liden * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25b97bf3fdSPer Liden * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26b97bf3fdSPer Liden * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27b97bf3fdSPer Liden * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
28b97bf3fdSPer Liden * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29b97bf3fdSPer Liden * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30b97bf3fdSPer Liden * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31b97bf3fdSPer Liden * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32b97bf3fdSPer Liden * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33b97bf3fdSPer Liden * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34b97bf3fdSPer Liden * POSSIBILITY OF SUCH DAMAGE.
35b97bf3fdSPer Liden */
36b97bf3fdSPer Liden
37b97bf3fdSPer Liden #ifndef _TIPC_BEARER_H
38b97bf3fdSPer Liden #define _TIPC_BEARER_H
39b97bf3fdSPer Liden
400655f6a8SRichard Alpe #include "netlink.h"
41a6bf70f7SJon Paul Maloy #include "core.h"
423de81b75SMichal Kubeček #include "msg.h"
430655f6a8SRichard Alpe #include <net/genetlink.h>
44b97bf3fdSPer Liden
45d0f91938SErik Hugne #define MAX_MEDIA 3
46b97bf3fdSPer Liden
4738504c28SJon Paul Maloy /* Identifiers associated with TIPC message header media address info
4838504c28SJon Paul Maloy * - address info field is 32 bytes long
4938504c28SJon Paul Maloy * - the field's actual content and length is defined per media
5038504c28SJon Paul Maloy * - remaining unused bytes in the field are set to zero
514d163a32SAllan Stephens */
5291e2eb56SErik Hugne #define TIPC_MEDIA_INFO_SIZE 32
534d163a32SAllan Stephens #define TIPC_MEDIA_TYPE_OFFSET 3
54d76a436dSErik Hugne #define TIPC_MEDIA_ADDR_OFFSET 4
554d163a32SAllan Stephens
564d163a32SAllan Stephens /*
57d265fef6SAllan Stephens * Identifiers of supported TIPC media types
58d265fef6SAllan Stephens */
59d265fef6SAllan Stephens #define TIPC_MEDIA_TYPE_ETH 1
60a29a194aSPatrick McHardy #define TIPC_MEDIA_TYPE_IB 2
61d0f91938SErik Hugne #define TIPC_MEDIA_TYPE_UDP 3
62d265fef6SAllan Stephens
639999974aSJon Paul Maloy /* Minimum bearer MTU */
643de81b75SMichal Kubeček #define TIPC_MIN_BEARER_MTU (MAX_H_SIZE + INT_H_SIZE)
653de81b75SMichal Kubeček
669999974aSJon Paul Maloy /* Identifiers for distinguishing between broadcast/multicast and replicast
679999974aSJon Paul Maloy */
689999974aSJon Paul Maloy #define TIPC_BROADCAST_SUPPORT 1
699999974aSJon Paul Maloy #define TIPC_REPLICAST_SUPPORT 2
709999974aSJon Paul Maloy
712c53040fSBen Hutchings /**
723d749a6aSAllan Stephens * struct tipc_media_addr - destination address used by TIPC bearers
733d749a6aSAllan Stephens * @value: address info (format defined by media)
743d749a6aSAllan Stephens * @media_id: TIPC media type identifier
753d749a6aSAllan Stephens * @broadcast: non-zero if address is a broadcast address
76d265fef6SAllan Stephens */
77d265fef6SAllan Stephens struct tipc_media_addr {
7891e2eb56SErik Hugne u8 value[TIPC_MEDIA_INFO_SIZE];
793d749a6aSAllan Stephens u8 media_id;
803d749a6aSAllan Stephens u8 broadcast;
81d265fef6SAllan Stephens };
82d265fef6SAllan Stephens
832d627b92SAllan Stephens struct tipc_bearer;
84b97bf3fdSPer Liden
85b97bf3fdSPer Liden /**
86ef72a7e0SJon Paul Maloy * struct tipc_media - Media specific info exposed to generic bearer layer
87b97bf3fdSPer Liden * @send_msg: routine which handles buffer transmission
884babbaa8SYing Xue * @enable_media: routine which enables a media
894babbaa8SYing Xue * @disable_media: routine which disables a media
9038504c28SJon Paul Maloy * @addr2str: convert media address format to string
9138504c28SJon Paul Maloy * @addr2msg: convert from media addr format to discovery msg addr format
9238504c28SJon Paul Maloy * @msg2addr: convert from discovery msg addr format to media addr format
9338504c28SJon Paul Maloy * @raw2addr: convert from raw addr format to media addr format
94b97bf3fdSPer Liden * @priority: default link (and bearer) priority
95b97bf3fdSPer Liden * @tolerance: default time (in ms) before declaring link failure
96ff10527eSRandy Dunlap * @min_win: minimum window (in packets) before declaring link congestion
97ff10527eSRandy Dunlap * @max_win: maximum window (in packets) before declaring link congestion
98901271e0SGhantaKrishnamurthy MohanKrishna * @mtu: max packet size bearer can support for media type not dependent on
99901271e0SGhantaKrishnamurthy MohanKrishna * underlying device MTU
100d265fef6SAllan Stephens * @type_id: TIPC media identifier
101e4d050cbSYing Xue * @hwaddr_len: TIPC media address len
102b97bf3fdSPer Liden * @name: media name
103b97bf3fdSPer Liden */
104358a0d1cSPaul Gortmaker struct tipc_media {
1051da46568SYing Xue int (*send_msg)(struct net *net, struct sk_buff *buf,
1061a90632dSJon Paul Maloy struct tipc_bearer *b,
107b97bf3fdSPer Liden struct tipc_media_addr *dest);
1081a90632dSJon Paul Maloy int (*enable_media)(struct net *net, struct tipc_bearer *b,
109d0f91938SErik Hugne struct nlattr *attr[]);
1101a90632dSJon Paul Maloy void (*disable_media)(struct tipc_bearer *b);
11138504c28SJon Paul Maloy int (*addr2str)(struct tipc_media_addr *addr,
11238504c28SJon Paul Maloy char *strbuf,
11338504c28SJon Paul Maloy int bufsz);
11438504c28SJon Paul Maloy int (*addr2msg)(char *msg, struct tipc_media_addr *addr);
11538504c28SJon Paul Maloy int (*msg2addr)(struct tipc_bearer *b,
11638504c28SJon Paul Maloy struct tipc_media_addr *addr,
11738504c28SJon Paul Maloy char *msg);
11838504c28SJon Paul Maloy int (*raw2addr)(struct tipc_bearer *b,
11938504c28SJon Paul Maloy struct tipc_media_addr *addr,
1206cf86280SJakub Kicinski const char *raw);
121b97bf3fdSPer Liden u32 priority;
122b97bf3fdSPer Liden u32 tolerance;
12316ad3f40SJon Maloy u32 min_win;
12416ad3f40SJon Maloy u32 max_win;
125901271e0SGhantaKrishnamurthy MohanKrishna u32 mtu;
126b97bf3fdSPer Liden u32 type_id;
127e4d050cbSYing Xue u32 hwaddr_len;
128b97bf3fdSPer Liden char name[TIPC_MAX_MEDIA_NAME];
129b97bf3fdSPer Liden };
130b97bf3fdSPer Liden
131b97bf3fdSPer Liden /**
132ef72a7e0SJon Paul Maloy * struct tipc_bearer - Generic TIPC bearer structure
133a8304529SYing Xue * @media_ptr: pointer to additional media-specific information about bearer
1342d627b92SAllan Stephens * @mtu: max packet size bearer can support
1352d627b92SAllan Stephens * @addr: media-specific address associated with bearer
1362d627b92SAllan Stephens * @name: bearer name (format = media:interface)
137b97bf3fdSPer Liden * @media: ptr to media structure associated with bearer
138ef72a7e0SJon Paul Maloy * @bcast_addr: media address used in broadcasting
139d55c60ebSParthasarathy Bhuvaragan * @pt: packet type for bearer
140f8322dfcSYing Xue * @rcu: rcu struct for tipc_bearer
141b97bf3fdSPer Liden * @priority: default link priority for bearer
142ff10527eSRandy Dunlap * @min_win: minimum window (in packets) before declaring link congestion
143ff10527eSRandy Dunlap * @max_win: maximum window (in packets) before declaring link congestion
1445c216e1dSAllan Stephens * @tolerance: default link tolerance for bearer
145a21a584dSErik Hugne * @domain: network domain to which links can be established
146b97bf3fdSPer Liden * @identity: array index of this bearer within TIPC bearer array
147ff10527eSRandy Dunlap * @disc: ptr to link setup request
148b97bf3fdSPer Liden * @net_plane: network plane ('A' through 'H') currently associated with bearer
1493ae6d66bSXin Long * @encap_hlen: encap headers length
150ff10527eSRandy Dunlap * @up: bearer up flag (bit 0)
151ff10527eSRandy Dunlap * @refcnt: tipc_bearer reference counter
1522d627b92SAllan Stephens *
1532d627b92SAllan Stephens * Note: media-specific code is responsible for initialization of the fields
1542d627b92SAllan Stephens * indicated below when a bearer is enabled; TIPC's generic bearer code takes
1552d627b92SAllan Stephens * care of initializing all other fields.
156b97bf3fdSPer Liden */
1572d627b92SAllan Stephens struct tipc_bearer {
158a79ace4bSZheng Yongjun void __rcu *media_ptr; /* initialized by media */
159a79ace4bSZheng Yongjun u32 mtu; /* initialized by media */
160a79ace4bSZheng Yongjun struct tipc_media_addr addr; /* initialized by media */
1612d627b92SAllan Stephens char name[TIPC_MAX_BEARER_NAME];
162358a0d1cSPaul Gortmaker struct tipc_media *media;
1638aeb89f2SPatrick McHardy struct tipc_media_addr bcast_addr;
164d55c60ebSParthasarathy Bhuvaragan struct packet_type pt;
165f8322dfcSYing Xue struct rcu_head rcu;
166b97bf3fdSPer Liden u32 priority;
16716ad3f40SJon Maloy u32 min_win;
16816ad3f40SJon Maloy u32 max_win;
1695c216e1dSAllan Stephens u32 tolerance;
170a21a584dSErik Hugne u32 domain;
171b97bf3fdSPer Liden u32 identity;
172b39e465eSJon Maloy struct tipc_discoverer *disc;
173b97bf3fdSPer Liden char net_plane;
1743ae6d66bSXin Long u16 encap_hlen;
1750d051bf9SJon Paul Maloy unsigned long up;
1762a7ee696STuong Lien refcount_t refcnt;
177b97bf3fdSPer Liden };
178b97bf3fdSPer Liden
179f19765f4SPaul Gortmaker struct tipc_bearer_names {
180b97bf3fdSPer Liden char media_name[TIPC_MAX_MEDIA_NAME];
181b97bf3fdSPer Liden char if_name[TIPC_MAX_IF_NAME];
182b97bf3fdSPer Liden };
183b97bf3fdSPer Liden
184d265fef6SAllan Stephens /*
185d265fef6SAllan Stephens * TIPC routines available to supported media types
186d265fef6SAllan Stephens */
187d265fef6SAllan Stephens
1881a90632dSJon Paul Maloy void tipc_rcv(struct net *net, struct sk_buff *skb, struct tipc_bearer *b);
189d265fef6SAllan Stephens
190d265fef6SAllan Stephens /*
191d265fef6SAllan Stephens * Routines made available to TIPC by supported media types
192d265fef6SAllan Stephens */
1935702dbabSJon Paul Maloy extern struct tipc_media eth_media_info;
194d265fef6SAllan Stephens
195a29a194aSPatrick McHardy #ifdef CONFIG_TIPC_MEDIA_IB
1965702dbabSJon Paul Maloy extern struct tipc_media ib_media_info;
197a29a194aSPatrick McHardy #endif
198d0f91938SErik Hugne #ifdef CONFIG_TIPC_MEDIA_UDP
199d0f91938SErik Hugne extern struct tipc_media udp_media_info;
200d0f91938SErik Hugne #endif
201a29a194aSPatrick McHardy
2020655f6a8SRichard Alpe int tipc_nl_bearer_disable(struct sk_buff *skb, struct genl_info *info);
203d59d8b77SYing Xue int __tipc_nl_bearer_disable(struct sk_buff *skb, struct genl_info *info);
2040655f6a8SRichard Alpe int tipc_nl_bearer_enable(struct sk_buff *skb, struct genl_info *info);
20545cf7edfSYing Xue int __tipc_nl_bearer_enable(struct sk_buff *skb, struct genl_info *info);
20635b9dd76SRichard Alpe int tipc_nl_bearer_dump(struct sk_buff *skb, struct netlink_callback *cb);
20735b9dd76SRichard Alpe int tipc_nl_bearer_get(struct sk_buff *skb, struct genl_info *info);
208315c00bcSRichard Alpe int tipc_nl_bearer_set(struct sk_buff *skb, struct genl_info *info);
20993532bb1SYing Xue int __tipc_nl_bearer_set(struct sk_buff *skb, struct genl_info *info);
210ef20cd4dSRichard Alpe int tipc_nl_bearer_add(struct sk_buff *skb, struct genl_info *info);
2110655f6a8SRichard Alpe
21246f15c67SRichard Alpe int tipc_nl_media_dump(struct sk_buff *skb, struct netlink_callback *cb);
21346f15c67SRichard Alpe int tipc_nl_media_get(struct sk_buff *skb, struct genl_info *info);
2141e55417dSRichard Alpe int tipc_nl_media_set(struct sk_buff *skb, struct genl_info *info);
21507ffb223SYing Xue int __tipc_nl_media_set(struct sk_buff *skb, struct genl_info *info);
21646f15c67SRichard Alpe
217b4b9771bSTuong Lien int tipc_media_addr_printf(char *buf, int len, struct tipc_media_addr *a);
218d0f91938SErik Hugne int tipc_enable_l2_media(struct net *net, struct tipc_bearer *b,
219d0f91938SErik Hugne struct nlattr *attrs[]);
2202a7ee696STuong Lien bool tipc_bearer_hold(struct tipc_bearer *b);
2212a7ee696STuong Lien void tipc_bearer_put(struct tipc_bearer *b);
222e4d050cbSYing Xue void tipc_disable_l2_media(struct tipc_bearer *b);
2231da46568SYing Xue int tipc_l2_send_msg(struct net *net, struct sk_buff *buf,
2241da46568SYing Xue struct tipc_bearer *b, struct tipc_media_addr *dest);
225b97bf3fdSPer Liden
2267f9f95d9SYing Xue void tipc_bearer_add_dest(struct net *net, u32 bearer_id, u32 dest);
2277f9f95d9SYing Xue void tipc_bearer_remove_dest(struct net *net, u32 bearer_id, u32 dest);
2287f9f95d9SYing Xue struct tipc_bearer *tipc_bearer_find(struct net *net, const char *name);
229ff0d3e78SParthasarathy Bhuvaragan int tipc_bearer_get_name(struct net *net, char *name, u32 bearer_id);
230358a0d1cSPaul Gortmaker struct tipc_media *tipc_media_find(const char *name);
2316e967adfSYing Xue int tipc_bearer_setup(void);
2326e967adfSYing Xue void tipc_bearer_cleanup(void);
233f2f9800dSYing Xue void tipc_bearer_stop(struct net *net);
234959e1781SJon Paul Maloy int tipc_bearer_mtu(struct net *net, u32 bearer_id);
2353ae6d66bSXin Long int tipc_bearer_min_mtu(struct net *net, u32 bearer_id);
2369999974aSJon Paul Maloy bool tipc_bearer_bcast_support(struct net *net, u32 bearer_id);
23760852d67SJon Paul Maloy void tipc_bearer_xmit_skb(struct net *net, u32 bearer_id,
23860852d67SJon Paul Maloy struct sk_buff *skb,
23960852d67SJon Paul Maloy struct tipc_media_addr *dest);
240af9b028eSJon Paul Maloy void tipc_bearer_xmit(struct net *net, u32 bearer_id,
241af9b028eSJon Paul Maloy struct sk_buff_head *xmitq,
242fc1b6d6dSTuong Lien struct tipc_media_addr *dst,
243fc1b6d6dSTuong Lien struct tipc_node *__dnode);
244b06b281eSJon Paul Maloy void tipc_bearer_bc_xmit(struct net *net, u32 bearer_id,
245b06b281eSJon Paul Maloy struct sk_buff_head *xmitq);
2466c9081a3SJohn Rutherford void tipc_clone_to_loopback(struct net *net, struct sk_buff_head *pkts);
2476c9081a3SJohn Rutherford int tipc_attach_loopback(struct net *net);
2486c9081a3SJohn Rutherford void tipc_detach_loopback(struct net *net);
2496c9081a3SJohn Rutherford
tipc_loopback_trace(struct net * net,struct sk_buff_head * pkts)2506c9081a3SJohn Rutherford static inline void tipc_loopback_trace(struct net *net,
2516c9081a3SJohn Rutherford struct sk_buff_head *pkts)
2526c9081a3SJohn Rutherford {
2536c9081a3SJohn Rutherford if (unlikely(dev_nit_active(net->loopback_dev)))
2546c9081a3SJohn Rutherford tipc_clone_to_loopback(net, pkts);
2556c9081a3SJohn Rutherford }
256b97bf3fdSPer Liden
2573de81b75SMichal Kubeček /* check if device MTU is too low for tipc headers */
tipc_mtu_bad(struct net_device * dev)258*6cd8ec58SXin Long static inline bool tipc_mtu_bad(struct net_device *dev)
2593de81b75SMichal Kubeček {
260*6cd8ec58SXin Long if (dev->mtu >= TIPC_MIN_BEARER_MTU)
2613de81b75SMichal Kubeček return false;
2623de81b75SMichal Kubeček netdev_warn(dev, "MTU too low for tipc bearer\n");
2633de81b75SMichal Kubeček return true;
2643de81b75SMichal Kubeček }
2653de81b75SMichal Kubeček
266b274f4abSAllan Stephens #endif /* _TIPC_BEARER_H */
267