tipc: make tipc broadcast link support net namespace
TIPC broadcast link is statically established and its relevant states are maintained with the global variables: "bcbearer", "bclink" and "bcl". Allowing different namespace to own different broadcast link instances, these variables must be moved to tipc_net structure and broadcast link instances would be allocated and initialized when namespace is created. Signed-off-by: Ying Xue <ying.xue@windriver.com> Tested-by: Tero Aho <Tero.Aho@coriant.com> Reviewed-by: Jon Maloy <jon.maloy@ericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
7f9f95d9d9
commit
1da465683a
@@ -37,23 +37,13 @@
|
||||
#ifndef _TIPC_BCAST_H
|
||||
#define _TIPC_BCAST_H
|
||||
|
||||
#include "netlink.h"
|
||||
#include <linux/tipc_config.h>
|
||||
#include "link.h"
|
||||
#include "node.h"
|
||||
|
||||
#define MAX_NODES 4096
|
||||
#define WSIZE 32
|
||||
#define TIPC_BCLINK_RESET 1
|
||||
|
||||
/**
|
||||
* struct tipc_node_map - set of node identifiers
|
||||
* @count: # of nodes in set
|
||||
* @map: bitmap of node identifiers that are in the set
|
||||
*/
|
||||
struct tipc_node_map {
|
||||
u32 count;
|
||||
u32 map[MAX_NODES / WSIZE];
|
||||
};
|
||||
|
||||
#define PLSIZE 32
|
||||
#define TIPC_BCLINK_RESET 1
|
||||
#define PLSIZE 32
|
||||
#define BCBEARER MAX_BEARERS
|
||||
|
||||
/**
|
||||
* struct tipc_port_list - set of node local destination ports
|
||||
@@ -67,9 +57,64 @@ struct tipc_port_list {
|
||||
u32 ports[PLSIZE];
|
||||
};
|
||||
|
||||
/**
|
||||
* struct tipc_bcbearer_pair - a pair of bearers used by broadcast link
|
||||
* @primary: pointer to primary bearer
|
||||
* @secondary: pointer to secondary bearer
|
||||
*
|
||||
* Bearers must have same priority and same set of reachable destinations
|
||||
* to be paired.
|
||||
*/
|
||||
|
||||
struct tipc_bcbearer_pair {
|
||||
struct tipc_bearer *primary;
|
||||
struct tipc_bearer *secondary;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct tipc_bcbearer - bearer used by broadcast link
|
||||
* @bearer: (non-standard) broadcast bearer structure
|
||||
* @media: (non-standard) broadcast media structure
|
||||
* @bpairs: array of bearer pairs
|
||||
* @bpairs_temp: temporary array of bearer pairs used by tipc_bcbearer_sort()
|
||||
* @remains: temporary node map used by tipc_bcbearer_send()
|
||||
* @remains_new: temporary node map used tipc_bcbearer_send()
|
||||
*
|
||||
* Note: The fields labelled "temporary" are incorporated into the bearer
|
||||
* to avoid consuming potentially limited stack space through the use of
|
||||
* large local variables within multicast routines. Concurrent access is
|
||||
* prevented through use of the spinlock "bclink_lock".
|
||||
*/
|
||||
struct tipc_bcbearer {
|
||||
struct tipc_bearer bearer;
|
||||
struct tipc_media media;
|
||||
struct tipc_bcbearer_pair bpairs[MAX_BEARERS];
|
||||
struct tipc_bcbearer_pair bpairs_temp[TIPC_MAX_LINK_PRI + 1];
|
||||
struct tipc_node_map remains;
|
||||
struct tipc_node_map remains_new;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct tipc_bclink - link used for broadcast messages
|
||||
* @lock: spinlock governing access to structure
|
||||
* @link: (non-standard) broadcast link structure
|
||||
* @node: (non-standard) node structure representing b'cast link's peer node
|
||||
* @flags: represent bclink states
|
||||
* @bcast_nodes: map of broadcast-capable nodes
|
||||
* @retransmit_to: node that most recently requested a retransmit
|
||||
*
|
||||
* Handles sequence numbering, fragmentation, bundling, etc.
|
||||
*/
|
||||
struct tipc_bclink {
|
||||
spinlock_t lock;
|
||||
struct tipc_link link;
|
||||
struct tipc_node node;
|
||||
unsigned int flags;
|
||||
struct tipc_node_map bcast_nodes;
|
||||
struct tipc_node *retransmit_to;
|
||||
};
|
||||
|
||||
struct tipc_node;
|
||||
|
||||
extern const char tipc_bclink_name[];
|
||||
|
||||
/**
|
||||
@@ -86,24 +131,24 @@ void tipc_port_list_free(struct tipc_port_list *pl_ptr);
|
||||
|
||||
int tipc_bclink_init(struct net *net);
|
||||
void tipc_bclink_stop(struct net *net);
|
||||
void tipc_bclink_set_flags(unsigned int flags);
|
||||
void tipc_bclink_add_node(u32 addr);
|
||||
void tipc_bclink_remove_node(u32 addr);
|
||||
struct tipc_node *tipc_bclink_retransmit_to(void);
|
||||
void tipc_bclink_set_flags(struct net *tn, unsigned int flags);
|
||||
void tipc_bclink_add_node(struct net *net, u32 addr);
|
||||
void tipc_bclink_remove_node(struct net *net, u32 addr);
|
||||
struct tipc_node *tipc_bclink_retransmit_to(struct net *tn);
|
||||
void tipc_bclink_acknowledge(struct tipc_node *n_ptr, u32 acked);
|
||||
void tipc_bclink_rcv(struct net *net, struct sk_buff *buf);
|
||||
u32 tipc_bclink_get_last_sent(void);
|
||||
u32 tipc_bclink_get_last_sent(struct net *net);
|
||||
u32 tipc_bclink_acks_missing(struct tipc_node *n_ptr);
|
||||
void tipc_bclink_update_link_state(struct net *net, struct tipc_node *n_ptr,
|
||||
u32 last_sent);
|
||||
int tipc_bclink_stats(char *stats_buf, const u32 buf_size);
|
||||
int tipc_bclink_reset_stats(void);
|
||||
int tipc_bclink_set_queue_limits(u32 limit);
|
||||
int tipc_bclink_stats(struct net *net, char *stats_buf, const u32 buf_size);
|
||||
int tipc_bclink_reset_stats(struct net *net);
|
||||
int tipc_bclink_set_queue_limits(struct net *net, u32 limit);
|
||||
void tipc_bcbearer_sort(struct net *net, struct tipc_node_map *nm_ptr,
|
||||
u32 node, bool action);
|
||||
uint tipc_bclink_get_mtu(void);
|
||||
int tipc_bclink_xmit(struct net *net, struct sk_buff_head *list);
|
||||
void tipc_bclink_wakeup_users(struct net *net);
|
||||
int tipc_nl_add_bc_link(struct tipc_nl_msg *msg);
|
||||
int tipc_nl_add_bc_link(struct net *net, struct tipc_nl_msg *msg);
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user