提交 0e05498e 编写于 作者: J Jon Paul Maloy 提交者: David S. Miller

tipc: make link implementation independent from struct tipc_bearer

In reality, the link implementation is already independent from
struct tipc_bearer, in that it doesn't store any reference to it.
However, we still pass on a pointer to a bearer instance in the
function tipc_link_create(), just to have it extract some
initialization information from it.

I later commits, we need to create instances of tipc_link without
having any associated struct tipc_bearer. To facilitate this, we
want to extract the initialization data already in the creator
function in node.c, before calling tipc_link_create(), and pass
this info on as individual parameters in the call.

This commit introduces this change.
Signed-off-by: NJon Maloy <jon.maloy@ericsson.com>
Reviewed-by: NYing Xue <ying.xue@windriver.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 5fd9fd63
...@@ -165,9 +165,16 @@ static u32 link_own_addr(struct tipc_link *l) ...@@ -165,9 +165,16 @@ static u32 link_own_addr(struct tipc_link *l)
/** /**
* tipc_link_create - create a new link * tipc_link_create - create a new link
* @n: pointer to associated node * @n: pointer to associated node
* @b: pointer to associated bearer * @if_name: associated interface name
* @bearer_id: id (index) of associated bearer
* @tolerance: link tolerance to be used by link
* @net_plane: network plane (A,B,c..) this link belongs to
* @mtu: mtu to be advertised by link
* @priority: priority to be used by link
* @window: send window to be used by link
* @session: session to be used by link
* @ownnode: identity of own node * @ownnode: identity of own node
* @peer: identity of peer node * @peer: node id of peer node
* @maddr: media address to be used * @maddr: media address to be used
* @inputq: queue to put messages ready for delivery * @inputq: queue to put messages ready for delivery
* @namedq: queue to put binding table update messages ready for delivery * @namedq: queue to put binding table update messages ready for delivery
...@@ -175,47 +182,47 @@ static u32 link_own_addr(struct tipc_link *l) ...@@ -175,47 +182,47 @@ static u32 link_own_addr(struct tipc_link *l)
* *
* Returns true if link was created, otherwise false * Returns true if link was created, otherwise false
*/ */
bool tipc_link_create(struct tipc_node *n, struct tipc_bearer *b, u32 session, bool tipc_link_create(struct tipc_node *n, char *if_name, int bearer_id,
u32 ownnode, u32 peer, struct tipc_media_addr *maddr, int tolerance, char net_plane, u32 mtu, int priority,
int window, u32 session, u32 ownnode, u32 peer,
struct tipc_media_addr *maddr,
struct sk_buff_head *inputq, struct sk_buff_head *namedq, struct sk_buff_head *inputq, struct sk_buff_head *namedq,
struct tipc_link **link) struct tipc_link **link)
{ {
struct tipc_link *l; struct tipc_link *l;
struct tipc_msg *hdr; struct tipc_msg *hdr;
char *if_name;
l = kzalloc(sizeof(*l), GFP_ATOMIC); l = kzalloc(sizeof(*l), GFP_ATOMIC);
if (!l) if (!l)
return false; return false;
*link = l; *link = l;
l->pmsg = (struct tipc_msg *)&l->proto_msg;
hdr = l->pmsg;
tipc_msg_init(ownnode, hdr, LINK_PROTOCOL, RESET_MSG, INT_H_SIZE, peer);
msg_set_size(hdr, sizeof(l->proto_msg));
msg_set_session(hdr, session);
msg_set_bearer_id(hdr, l->bearer_id);
/* Note: peer i/f name is completed by reset/activate message */ /* Note: peer i/f name is completed by reset/activate message */
if_name = strchr(b->name, ':') + 1;
sprintf(l->name, "%u.%u.%u:%s-%u.%u.%u:unknown", sprintf(l->name, "%u.%u.%u:%s-%u.%u.%u:unknown",
tipc_zone(ownnode), tipc_cluster(ownnode), tipc_node(ownnode), tipc_zone(ownnode), tipc_cluster(ownnode), tipc_node(ownnode),
if_name, tipc_zone(peer), tipc_cluster(peer), tipc_node(peer)); if_name, tipc_zone(peer), tipc_cluster(peer), tipc_node(peer));
strcpy((char *)msg_data(hdr), if_name);
l->addr = peer; l->addr = peer;
l->media_addr = maddr; l->media_addr = maddr;
l->owner = n; l->owner = n;
l->peer_session = WILDCARD_SESSION; l->peer_session = WILDCARD_SESSION;
l->bearer_id = b->identity; l->bearer_id = bearer_id;
l->tolerance = b->tolerance; l->tolerance = tolerance;
l->net_plane = b->net_plane; l->net_plane = net_plane;
l->advertised_mtu = b->mtu; l->advertised_mtu = mtu;
l->mtu = b->mtu; l->mtu = mtu;
l->priority = b->priority; l->priority = priority;
tipc_link_set_queue_limits(l, b->window); tipc_link_set_queue_limits(l, window);
l->inputq = inputq; l->inputq = inputq;
l->namedq = namedq; l->namedq = namedq;
l->state = LINK_RESETTING; l->state = LINK_RESETTING;
l->pmsg = (struct tipc_msg *)&l->proto_msg;
hdr = l->pmsg;
tipc_msg_init(ownnode, hdr, LINK_PROTOCOL, RESET_MSG, INT_H_SIZE, peer);
msg_set_size(hdr, sizeof(l->proto_msg));
msg_set_session(hdr, session);
msg_set_bearer_id(hdr, l->bearer_id);
strcpy((char *)msg_data(hdr), if_name);
__skb_queue_head_init(&l->transmq); __skb_queue_head_init(&l->transmq);
__skb_queue_head_init(&l->backlogq); __skb_queue_head_init(&l->backlogq);
__skb_queue_head_init(&l->deferdq); __skb_queue_head_init(&l->deferdq);
......
...@@ -205,8 +205,10 @@ struct tipc_link { ...@@ -205,8 +205,10 @@ struct tipc_link {
struct tipc_stats stats; struct tipc_stats stats;
}; };
bool tipc_link_create(struct tipc_node *n, struct tipc_bearer *b, u32 session, bool tipc_link_create(struct tipc_node *n, char *if_name, int bearer_id,
u32 ownnode, u32 peer, struct tipc_media_addr *maddr, int tolerance, char net_plane, u32 mtu, int priority,
int window, u32 session, u32 ownnode, u32 peer,
struct tipc_media_addr *maddr,
struct sk_buff_head *inputq, struct sk_buff_head *namedq, struct sk_buff_head *inputq, struct sk_buff_head *namedq,
struct tipc_link **link); struct tipc_link **link);
void tipc_link_tnl_prepare(struct tipc_link *l, struct tipc_link *tnl, void tipc_link_tnl_prepare(struct tipc_link *l, struct tipc_link *tnl,
......
...@@ -493,6 +493,7 @@ void tipc_node_check_dest(struct net *net, u32 onode, ...@@ -493,6 +493,7 @@ void tipc_node_check_dest(struct net *net, u32 onode,
bool link_up = false; bool link_up = false;
bool accept_addr = false; bool accept_addr = false;
bool reset = true; bool reset = true;
char *if_name;
*dupl_addr = false; *dupl_addr = false;
*respond = false; *respond = false;
...@@ -579,7 +580,10 @@ void tipc_node_check_dest(struct net *net, u32 onode, ...@@ -579,7 +580,10 @@ void tipc_node_check_dest(struct net *net, u32 onode,
pr_warn("Cannot establish 3rd link to %x\n", n->addr); pr_warn("Cannot establish 3rd link to %x\n", n->addr);
goto exit; goto exit;
} }
if (!tipc_link_create(n, b, mod(tipc_net(net)->random), if_name = strchr(b->name, ':') + 1;
if (!tipc_link_create(n, if_name, b->identity, b->tolerance,
b->net_plane, b->mtu, b->priority,
b->window, mod(tipc_net(net)->random),
tipc_own_addr(net), onode, &le->maddr, tipc_own_addr(net), onode, &le->maddr,
&le->inputq, &n->bclink.namedq, &l)) { &le->inputq, &n->bclink.namedq, &l)) {
*respond = false; *respond = false;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册