xref: /openbmc/linux/net/tipc/bearer.h (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
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