Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
167de77f
Commit
167de77f
authored
Apr 20, 2012
by
David S. Miller
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'tipc_net-next' of
git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux
parents
2528a5dc
9d52ce4b
Changes
11
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
172 additions
and
107 deletions
+172
-107
net/tipc/addr.h
net/tipc/addr.h
+19
-1
net/tipc/bearer.c
net/tipc/bearer.c
+1
-1
net/tipc/config.c
net/tipc/config.c
+1
-1
net/tipc/name_distr.c
net/tipc/name_distr.c
+80
-39
net/tipc/name_table.c
net/tipc/name_table.c
+7
-7
net/tipc/net.c
net/tipc/net.c
+2
-1
net/tipc/node.c
net/tipc/node.c
+1
-1
net/tipc/node_subscr.c
net/tipc/node_subscr.c
+1
-1
net/tipc/port.c
net/tipc/port.c
+57
-44
net/tipc/port.h
net/tipc/port.h
+1
-10
net/tipc/socket.c
net/tipc/socket.c
+2
-1
No files found.
net/tipc/addr.h
View file @
167de77f
...
@@ -50,11 +50,29 @@ static inline u32 tipc_cluster_mask(u32 addr)
...
@@ -50,11 +50,29 @@ static inline u32 tipc_cluster_mask(u32 addr)
return
addr
&
TIPC_CLUSTER_MASK
;
return
addr
&
TIPC_CLUSTER_MASK
;
}
}
static
inline
int
in_own_cluster
(
u32
addr
)
static
inline
int
in_own_cluster
_exact
(
u32
addr
)
{
{
return
!
((
addr
^
tipc_own_addr
)
>>
12
);
return
!
((
addr
^
tipc_own_addr
)
>>
12
);
}
}
/**
* in_own_node - test for node inclusion; <0.0.0> always matches
*/
static
inline
int
in_own_node
(
u32
addr
)
{
return
(
addr
==
tipc_own_addr
)
||
!
addr
;
}
/**
* in_own_cluster - test for cluster inclusion; <0.0.0> always matches
*/
static
inline
int
in_own_cluster
(
u32
addr
)
{
return
in_own_cluster_exact
(
addr
)
||
!
addr
;
}
/**
/**
* addr_domain - convert 2-bit scope value to equivalent message lookup domain
* addr_domain - convert 2-bit scope value to equivalent message lookup domain
*
*
...
...
net/tipc/bearer.c
View file @
167de77f
...
@@ -449,7 +449,7 @@ int tipc_enable_bearer(const char *name, u32 disc_domain, u32 priority)
...
@@ -449,7 +449,7 @@ int tipc_enable_bearer(const char *name, u32 disc_domain, u32 priority)
if
(
tipc_in_scope
(
disc_domain
,
tipc_own_addr
))
{
if
(
tipc_in_scope
(
disc_domain
,
tipc_own_addr
))
{
disc_domain
=
tipc_own_addr
&
TIPC_CLUSTER_MASK
;
disc_domain
=
tipc_own_addr
&
TIPC_CLUSTER_MASK
;
res
=
0
;
/* accept any node in own cluster */
res
=
0
;
/* accept any node in own cluster */
}
else
if
(
in_own_cluster
(
disc_domain
))
}
else
if
(
in_own_cluster
_exact
(
disc_domain
))
res
=
0
;
/* accept specified node in own cluster */
res
=
0
;
/* accept specified node in own cluster */
}
}
if
(
res
)
{
if
(
res
)
{
...
...
net/tipc/config.c
View file @
167de77f
...
@@ -290,7 +290,7 @@ struct sk_buff *tipc_cfg_do_cmd(u32 orig_node, u16 cmd, const void *request_area
...
@@ -290,7 +290,7 @@ struct sk_buff *tipc_cfg_do_cmd(u32 orig_node, u16 cmd, const void *request_area
/* Check command authorization */
/* Check command authorization */
if
(
likely
(
orig_node
==
tipc_own_addr
))
{
if
(
likely
(
in_own_node
(
orig_node
)
))
{
/* command is permitted */
/* command is permitted */
}
else
if
(
cmd
>=
0x8000
)
{
}
else
if
(
cmd
>=
0x8000
)
{
rep_tlv_buf
=
tipc_cfg_reply_error_string
(
TIPC_CFG_NOT_SUPPORTED
rep_tlv_buf
=
tipc_cfg_reply_error_string
(
TIPC_CFG_NOT_SUPPORTED
...
...
net/tipc/name_distr.c
View file @
167de77f
...
@@ -68,12 +68,37 @@ struct distr_item {
...
@@ -68,12 +68,37 @@ struct distr_item {
};
};
/**
/**
* List of externally visible publications by this node --
* struct publ_list - list of publications made by this node
* that is, all publications having scope > TIPC_NODE_SCOPE.
* @list: circular list of publications
* @list_size: number of entries in list
*/
*/
struct
publ_list
{
struct
list_head
list
;
u32
size
;
};
static
struct
publ_list
publ_zone
=
{
.
list
=
LIST_HEAD_INIT
(
publ_zone
.
list
),
.
size
=
0
,
};
static
struct
publ_list
publ_cluster
=
{
.
list
=
LIST_HEAD_INIT
(
publ_cluster
.
list
),
.
size
=
0
,
};
static
struct
publ_list
publ_node
=
{
.
list
=
LIST_HEAD_INIT
(
publ_node
.
list
),
.
size
=
0
,
};
static
struct
publ_list
*
publ_lists
[]
=
{
NULL
,
&
publ_zone
,
/* publ_lists[TIPC_ZONE_SCOPE] */
&
publ_cluster
,
/* publ_lists[TIPC_CLUSTER_SCOPE] */
&
publ_node
/* publ_lists[TIPC_NODE_SCOPE] */
};
static
LIST_HEAD
(
publ_root
);
static
u32
publ_cnt
;
/**
/**
* publ_to_item - add publication info to a publication message
* publ_to_item - add publication info to a publication message
...
@@ -132,8 +157,11 @@ void tipc_named_publish(struct publication *publ)
...
@@ -132,8 +157,11 @@ void tipc_named_publish(struct publication *publ)
struct
sk_buff
*
buf
;
struct
sk_buff
*
buf
;
struct
distr_item
*
item
;
struct
distr_item
*
item
;
list_add_tail
(
&
publ
->
local_list
,
&
publ_root
);
list_add_tail
(
&
publ
->
local_list
,
&
publ_lists
[
publ
->
scope
]
->
list
);
publ_cnt
++
;
publ_lists
[
publ
->
scope
]
->
size
++
;
if
(
publ
->
scope
==
TIPC_NODE_SCOPE
)
return
;
buf
=
named_prepare_buf
(
PUBLICATION
,
ITEM_SIZE
,
0
);
buf
=
named_prepare_buf
(
PUBLICATION
,
ITEM_SIZE
,
0
);
if
(
!
buf
)
{
if
(
!
buf
)
{
...
@@ -156,7 +184,10 @@ void tipc_named_withdraw(struct publication *publ)
...
@@ -156,7 +184,10 @@ void tipc_named_withdraw(struct publication *publ)
struct
distr_item
*
item
;
struct
distr_item
*
item
;
list_del
(
&
publ
->
local_list
);
list_del
(
&
publ
->
local_list
);
publ_cnt
--
;
publ_lists
[
publ
->
scope
]
->
size
--
;
if
(
publ
->
scope
==
TIPC_NODE_SCOPE
)
return
;
buf
=
named_prepare_buf
(
WITHDRAWAL
,
ITEM_SIZE
,
0
);
buf
=
named_prepare_buf
(
WITHDRAWAL
,
ITEM_SIZE
,
0
);
if
(
!
buf
)
{
if
(
!
buf
)
{
...
@@ -169,6 +200,39 @@ void tipc_named_withdraw(struct publication *publ)
...
@@ -169,6 +200,39 @@ void tipc_named_withdraw(struct publication *publ)
named_cluster_distribute
(
buf
);
named_cluster_distribute
(
buf
);
}
}
/*
* named_distribute - prepare name info for bulk distribution to another node
*/
static
void
named_distribute
(
struct
list_head
*
message_list
,
u32
node
,
struct
publ_list
*
pls
,
u32
max_item_buf
)
{
struct
publication
*
publ
;
struct
sk_buff
*
buf
=
NULL
;
struct
distr_item
*
item
=
NULL
;
u32
left
=
0
;
u32
rest
=
pls
->
size
*
ITEM_SIZE
;
list_for_each_entry
(
publ
,
&
pls
->
list
,
local_list
)
{
if
(
!
buf
)
{
left
=
(
rest
<=
max_item_buf
)
?
rest
:
max_item_buf
;
rest
-=
left
;
buf
=
named_prepare_buf
(
PUBLICATION
,
left
,
node
);
if
(
!
buf
)
{
warn
(
"Bulk publication failure
\n
"
);
return
;
}
item
=
(
struct
distr_item
*
)
msg_data
(
buf_msg
(
buf
));
}
publ_to_item
(
item
,
publ
);
item
++
;
left
-=
ITEM_SIZE
;
if
(
!
left
)
{
list_add_tail
((
struct
list_head
*
)
buf
,
message_list
);
buf
=
NULL
;
}
}
}
/**
/**
* tipc_named_node_up - tell specified node about all publications by this node
* tipc_named_node_up - tell specified node about all publications by this node
*/
*/
...
@@ -177,13 +241,8 @@ void tipc_named_node_up(unsigned long nodearg)
...
@@ -177,13 +241,8 @@ void tipc_named_node_up(unsigned long nodearg)
{
{
struct
tipc_node
*
n_ptr
;
struct
tipc_node
*
n_ptr
;
struct
tipc_link
*
l_ptr
;
struct
tipc_link
*
l_ptr
;
struct
publication
*
publ
;
struct
distr_item
*
item
=
NULL
;
struct
sk_buff
*
buf
=
NULL
;
struct
list_head
message_list
;
struct
list_head
message_list
;
u32
node
=
(
u32
)
nodearg
;
u32
node
=
(
u32
)
nodearg
;
u32
left
=
0
;
u32
rest
;
u32
max_item_buf
=
0
;
u32
max_item_buf
=
0
;
/* compute maximum amount of publication data to send per message */
/* compute maximum amount of publication data to send per message */
...
@@ -207,28 +266,8 @@ void tipc_named_node_up(unsigned long nodearg)
...
@@ -207,28 +266,8 @@ void tipc_named_node_up(unsigned long nodearg)
INIT_LIST_HEAD
(
&
message_list
);
INIT_LIST_HEAD
(
&
message_list
);
read_lock_bh
(
&
tipc_nametbl_lock
);
read_lock_bh
(
&
tipc_nametbl_lock
);
rest
=
publ_cnt
*
ITEM_SIZE
;
named_distribute
(
&
message_list
,
node
,
&
publ_cluster
,
max_item_buf
);
named_distribute
(
&
message_list
,
node
,
&
publ_zone
,
max_item_buf
);
list_for_each_entry
(
publ
,
&
publ_root
,
local_list
)
{
if
(
!
buf
)
{
left
=
(
rest
<=
max_item_buf
)
?
rest
:
max_item_buf
;
rest
-=
left
;
buf
=
named_prepare_buf
(
PUBLICATION
,
left
,
node
);
if
(
!
buf
)
{
warn
(
"Bulk publication distribution failure
\n
"
);
goto
exit
;
}
item
=
(
struct
distr_item
*
)
msg_data
(
buf_msg
(
buf
));
}
publ_to_item
(
item
,
publ
);
item
++
;
left
-=
ITEM_SIZE
;
if
(
!
left
)
{
list_add_tail
((
struct
list_head
*
)
buf
,
&
message_list
);
buf
=
NULL
;
}
}
exit:
read_unlock_bh
(
&
tipc_nametbl_lock
);
read_unlock_bh
(
&
tipc_nametbl_lock
);
tipc_link_send_names
(
&
message_list
,
(
u32
)
node
);
tipc_link_send_names
(
&
message_list
,
(
u32
)
node
);
...
@@ -316,20 +355,22 @@ void tipc_named_recv(struct sk_buff *buf)
...
@@ -316,20 +355,22 @@ void tipc_named_recv(struct sk_buff *buf)
}
}
/**
/**
* tipc_named_reinit - re-initialize local publication
list
* tipc_named_reinit - re-initialize local publication
s
*
*
* This routine is called whenever TIPC networking is enabled.
* This routine is called whenever TIPC networking is enabled.
* All
existing publications by this node that have "cluster" or "zone" scope
* All
name table entries published by this node are updated to reflect
*
are updated to reflect
the node's new network address.
* the node's new network address.
*/
*/
void
tipc_named_reinit
(
void
)
void
tipc_named_reinit
(
void
)
{
{
struct
publication
*
publ
;
struct
publication
*
publ
;
int
scope
;
write_lock_bh
(
&
tipc_nametbl_lock
);
write_lock_bh
(
&
tipc_nametbl_lock
);
list_for_each_entry
(
publ
,
&
publ_root
,
local_list
)
for
(
scope
=
TIPC_ZONE_SCOPE
;
scope
<=
TIPC_NODE_SCOPE
;
scope
++
)
list_for_each_entry
(
publ
,
&
publ_lists
[
scope
]
->
list
,
local_list
)
publ
->
node
=
tipc_own_addr
;
publ
->
node
=
tipc_own_addr
;
write_unlock_bh
(
&
tipc_nametbl_lock
);
write_unlock_bh
(
&
tipc_nametbl_lock
);
...
...
net/tipc/name_table.c
View file @
167de77f
...
@@ -347,7 +347,7 @@ static struct publication *tipc_nameseq_insert_publ(struct name_seq *nseq,
...
@@ -347,7 +347,7 @@ static struct publication *tipc_nameseq_insert_publ(struct name_seq *nseq,
info
->
cluster_list_size
++
;
info
->
cluster_list_size
++
;
}
}
if
(
node
==
tipc_own_addr
)
{
if
(
in_own_node
(
node
)
)
{
list_add
(
&
publ
->
node_list
,
&
info
->
node_list
);
list_add
(
&
publ
->
node_list
,
&
info
->
node_list
);
info
->
node_list_size
++
;
info
->
node_list_size
++
;
}
}
...
@@ -418,7 +418,7 @@ static struct publication *tipc_nameseq_remove_publ(struct name_seq *nseq, u32 i
...
@@ -418,7 +418,7 @@ static struct publication *tipc_nameseq_remove_publ(struct name_seq *nseq, u32 i
/* Remove publication from node scope list, if present */
/* Remove publication from node scope list, if present */
if
(
node
==
tipc_own_addr
)
{
if
(
in_own_node
(
node
)
)
{
list_del
(
&
publ
->
node_list
);
list_del
(
&
publ
->
node_list
);
info
->
node_list_size
--
;
info
->
node_list_size
--
;
}
}
...
@@ -604,7 +604,7 @@ u32 tipc_nametbl_translate(u32 type, u32 instance, u32 *destnode)
...
@@ -604,7 +604,7 @@ u32 tipc_nametbl_translate(u32 type, u32 instance, u32 *destnode)
publ
=
list_first_entry
(
&
info
->
node_list
,
struct
publication
,
publ
=
list_first_entry
(
&
info
->
node_list
,
struct
publication
,
node_list
);
node_list
);
list_move_tail
(
&
publ
->
node_list
,
&
info
->
node_list
);
list_move_tail
(
&
publ
->
node_list
,
&
info
->
node_list
);
}
else
if
(
in_own_cluster
(
*
destnode
))
{
}
else
if
(
in_own_cluster
_exact
(
*
destnode
))
{
if
(
list_empty
(
&
info
->
cluster_list
))
if
(
list_empty
(
&
info
->
cluster_list
))
goto
no_match
;
goto
no_match
;
publ
=
list_first_entry
(
&
info
->
cluster_list
,
struct
publication
,
publ
=
list_first_entry
(
&
info
->
cluster_list
,
struct
publication
,
...
@@ -695,11 +695,12 @@ struct publication *tipc_nametbl_publish(u32 type, u32 lower, u32 upper,
...
@@ -695,11 +695,12 @@ struct publication *tipc_nametbl_publish(u32 type, u32 lower, u32 upper,
}
}
write_lock_bh
(
&
tipc_nametbl_lock
);
write_lock_bh
(
&
tipc_nametbl_lock
);
table
.
local_publ_count
++
;
publ
=
tipc_nametbl_insert_publ
(
type
,
lower
,
upper
,
scope
,
publ
=
tipc_nametbl_insert_publ
(
type
,
lower
,
upper
,
scope
,
tipc_own_addr
,
port_ref
,
key
);
tipc_own_addr
,
port_ref
,
key
);
if
(
publ
&&
(
scope
!=
TIPC_NODE_SCOPE
))
if
(
likely
(
publ
))
{
table
.
local_publ_count
++
;
tipc_named_publish
(
publ
);
tipc_named_publish
(
publ
);
}
write_unlock_bh
(
&
tipc_nametbl_lock
);
write_unlock_bh
(
&
tipc_nametbl_lock
);
return
publ
;
return
publ
;
}
}
...
@@ -716,7 +717,6 @@ int tipc_nametbl_withdraw(u32 type, u32 lower, u32 ref, u32 key)
...
@@ -716,7 +717,6 @@ int tipc_nametbl_withdraw(u32 type, u32 lower, u32 ref, u32 key)
publ
=
tipc_nametbl_remove_publ
(
type
,
lower
,
tipc_own_addr
,
ref
,
key
);
publ
=
tipc_nametbl_remove_publ
(
type
,
lower
,
tipc_own_addr
,
ref
,
key
);
if
(
likely
(
publ
))
{
if
(
likely
(
publ
))
{
table
.
local_publ_count
--
;
table
.
local_publ_count
--
;
if
(
publ
->
scope
!=
TIPC_NODE_SCOPE
)
tipc_named_withdraw
(
publ
);
tipc_named_withdraw
(
publ
);
write_unlock_bh
(
&
tipc_nametbl_lock
);
write_unlock_bh
(
&
tipc_nametbl_lock
);
list_del_init
(
&
publ
->
pport_list
);
list_del_init
(
&
publ
->
pport_list
);
...
...
net/tipc/net.c
View file @
167de77f
...
@@ -178,11 +178,12 @@ int tipc_net_start(u32 addr)
...
@@ -178,11 +178,12 @@ int tipc_net_start(u32 addr)
tipc_subscr_stop
();
tipc_subscr_stop
();
tipc_cfg_stop
();
tipc_cfg_stop
();
write_lock_bh
(
&
tipc_net_lock
);
tipc_own_addr
=
addr
;
tipc_own_addr
=
addr
;
tipc_named_reinit
();
tipc_named_reinit
();
tipc_port_reinit
();
tipc_port_reinit
();
tipc_bclink_init
();
tipc_bclink_init
();
write_unlock_bh
(
&
tipc_net_lock
);
tipc_k_signal
((
Handler
)
tipc_subscr_start
,
0
);
tipc_k_signal
((
Handler
)
tipc_subscr_start
,
0
);
tipc_k_signal
((
Handler
)
tipc_cfg_init
,
0
);
tipc_k_signal
((
Handler
)
tipc_cfg_init
,
0
);
...
...
net/tipc/node.c
View file @
167de77f
...
@@ -72,7 +72,7 @@ struct tipc_node *tipc_node_find(u32 addr)
...
@@ -72,7 +72,7 @@ struct tipc_node *tipc_node_find(u32 addr)
struct
tipc_node
*
node
;
struct
tipc_node
*
node
;
struct
hlist_node
*
pos
;
struct
hlist_node
*
pos
;
if
(
unlikely
(
!
in_own_cluster
(
addr
)))
if
(
unlikely
(
!
in_own_cluster
_exact
(
addr
)))
return
NULL
;
return
NULL
;
hlist_for_each_entry
(
node
,
pos
,
&
node_htable
[
tipc_hashfn
(
addr
)],
hash
)
{
hlist_for_each_entry
(
node
,
pos
,
&
node_htable
[
tipc_hashfn
(
addr
)],
hash
)
{
...
...
net/tipc/node_subscr.c
View file @
167de77f
...
@@ -45,7 +45,7 @@
...
@@ -45,7 +45,7 @@
void
tipc_nodesub_subscribe
(
struct
tipc_node_subscr
*
node_sub
,
u32
addr
,
void
tipc_nodesub_subscribe
(
struct
tipc_node_subscr
*
node_sub
,
u32
addr
,
void
*
usr_handle
,
net_ev_handler
handle_down
)
void
*
usr_handle
,
net_ev_handler
handle_down
)
{
{
if
(
addr
==
tipc_own_addr
)
{
if
(
in_own_node
(
addr
)
)
{
node_sub
->
node
=
NULL
;
node_sub
->
node
=
NULL
;
return
;
return
;
}
}
...
...
net/tipc/port.c
View file @
167de77f
...
@@ -59,16 +59,38 @@ static struct sk_buff *port_build_peer_abort_msg(struct tipc_port *, u32 err);
...
@@ -59,16 +59,38 @@ static struct sk_buff *port_build_peer_abort_msg(struct tipc_port *, u32 err);
static
void
port_timeout
(
unsigned
long
ref
);
static
void
port_timeout
(
unsigned
long
ref
);
static
u32
port_peernode
(
struct
tipc_port
*
p_ptr
)
static
inline
u32
port_peernode
(
struct
tipc_port
*
p_ptr
)
{
{
return
msg_destnode
(
&
p_ptr
->
phdr
);
return
msg_destnode
(
&
p_ptr
->
phdr
);
}
}
static
u32
port_peerport
(
struct
tipc_port
*
p_ptr
)
static
inline
u32
port_peerport
(
struct
tipc_port
*
p_ptr
)
{
{
return
msg_destport
(
&
p_ptr
->
phdr
);
return
msg_destport
(
&
p_ptr
->
phdr
);
}
}
/*
* tipc_port_peer_msg - verify message was sent by connected port's peer
*
* Handles cases where the node's network address has changed from
* the default of <0.0.0> to its configured setting.
*/
int
tipc_port_peer_msg
(
struct
tipc_port
*
p_ptr
,
struct
tipc_msg
*
msg
)
{
u32
peernode
;
u32
orignode
;
if
(
msg_origport
(
msg
)
!=
port_peerport
(
p_ptr
))
return
0
;
orignode
=
msg_orignode
(
msg
);
peernode
=
port_peernode
(
p_ptr
);
return
(
orignode
==
peernode
)
||
(
!
orignode
&&
(
peernode
==
tipc_own_addr
))
||
(
!
peernode
&&
(
orignode
==
tipc_own_addr
));
}
/**
/**
* tipc_multicast - send a multicast message to local and remote destinations
* tipc_multicast - send a multicast message to local and remote destinations
*/
*/
...
@@ -221,18 +243,25 @@ struct tipc_port *tipc_createport_raw(void *usr_handle,
...
@@ -221,18 +243,25 @@ struct tipc_port *tipc_createport_raw(void *usr_handle,
p_ptr
->
usr_handle
=
usr_handle
;
p_ptr
->
usr_handle
=
usr_handle
;
p_ptr
->
max_pkt
=
MAX_PKT_DEFAULT
;
p_ptr
->
max_pkt
=
MAX_PKT_DEFAULT
;
p_ptr
->
ref
=
ref
;
p_ptr
->
ref
=
ref
;
msg
=
&
p_ptr
->
phdr
;
tipc_msg_init
(
msg
,
importance
,
TIPC_NAMED_MSG
,
NAMED_H_SIZE
,
0
);
msg_set_origport
(
msg
,
ref
);
INIT_LIST_HEAD
(
&
p_ptr
->
wait_list
);
INIT_LIST_HEAD
(
&
p_ptr
->
wait_list
);
INIT_LIST_HEAD
(
&
p_ptr
->
subscription
.
nodesub_list
);
INIT_LIST_HEAD
(
&
p_ptr
->
subscription
.
nodesub_list
);
p_ptr
->
dispatcher
=
dispatcher
;
p_ptr
->
dispatcher
=
dispatcher
;
p_ptr
->
wakeup
=
wakeup
;
p_ptr
->
wakeup
=
wakeup
;
p_ptr
->
user_port
=
NULL
;
p_ptr
->
user_port
=
NULL
;
k_init_timer
(
&
p_ptr
->
timer
,
(
Handler
)
port_timeout
,
ref
);
k_init_timer
(
&
p_ptr
->
timer
,
(
Handler
)
port_timeout
,
ref
);
spin_lock_bh
(
&
tipc_port_list_lock
);
INIT_LIST_HEAD
(
&
p_ptr
->
publications
);
INIT_LIST_HEAD
(
&
p_ptr
->
publications
);
INIT_LIST_HEAD
(
&
p_ptr
->
port_list
);
INIT_LIST_HEAD
(
&
p_ptr
->
port_list
);
/*
* Must hold port list lock while initializing message header template
* to ensure a change to node's own network address doesn't result
* in template containing out-dated network address information
*/
spin_lock_bh
(
&
tipc_port_list_lock
);
msg
=
&
p_ptr
->
phdr
;
tipc_msg_init
(
msg
,
importance
,
TIPC_NAMED_MSG
,
NAMED_H_SIZE
,
0
);
msg_set_origport
(
msg
,
ref
);
list_add_tail
(
&
p_ptr
->
port_list
,
&
ports
);
list_add_tail
(
&
p_ptr
->
port_list
,
&
ports
);
spin_unlock_bh
(
&
tipc_port_list_lock
);
spin_unlock_bh
(
&
tipc_port_list_lock
);
return
p_ptr
;
return
p_ptr
;
...
@@ -415,7 +444,7 @@ int tipc_reject_msg(struct sk_buff *buf, u32 err)
...
@@ -415,7 +444,7 @@ int tipc_reject_msg(struct sk_buff *buf, u32 err)
/* send returned message & dispose of rejected message */
/* send returned message & dispose of rejected message */
src_node
=
msg_prevnode
(
msg
);
src_node
=
msg_prevnode
(
msg
);
if
(
src_node
==
tipc_own_addr
)
if
(
in_own_node
(
src_node
)
)
tipc_port_recv_msg
(
rbuf
);
tipc_port_recv_msg
(
rbuf
);
else
else
tipc_link_send
(
rbuf
,
src_node
,
msg_link_selector
(
rmsg
));
tipc_link_send
(
rbuf
,
src_node
,
msg_link_selector
(
rmsg
));
...
@@ -519,25 +548,21 @@ void tipc_port_recv_proto_msg(struct sk_buff *buf)
...
@@ -519,25 +548,21 @@ void tipc_port_recv_proto_msg(struct sk_buff *buf)
struct
tipc_msg
*
msg
=
buf_msg
(
buf
);
struct
tipc_msg
*
msg
=
buf_msg
(
buf
);
struct
tipc_port
*
p_ptr
;
struct
tipc_port
*
p_ptr
;
struct
sk_buff
*
r_buf
=
NULL
;
struct
sk_buff
*
r_buf
=
NULL
;
u32
orignode
=
msg_orignode
(
msg
);
u32
origport
=
msg_origport
(
msg
);
u32
destport
=
msg_destport
(
msg
);
u32
destport
=
msg_destport
(
msg
);
int
wakeable
;
int
wakeable
;
/* Validate connection */
/* Validate connection */
p_ptr
=
tipc_port_lock
(
destport
);
p_ptr
=
tipc_port_lock
(
destport
);
if
(
!
p_ptr
||
!
p_ptr
->
connected
||
if
(
!
p_ptr
||
!
p_ptr
->
connected
||
!
tipc_port_peer_msg
(
p_ptr
,
msg
))
{
(
port_peernode
(
p_ptr
)
!=
orignode
)
||
(
port_peerport
(
p_ptr
)
!=
origport
))
{
r_buf
=
tipc_buf_acquire
(
BASIC_H_SIZE
);
r_buf
=
tipc_buf_acquire
(
BASIC_H_SIZE
);
if
(
r_buf
)
{
if
(
r_buf
)
{
msg
=
buf_msg
(
r_buf
);
msg
=
buf_msg
(
r_buf
);
tipc_msg_init
(
msg
,
TIPC_HIGH_IMPORTANCE
,
TIPC_CONN_MSG
,
tipc_msg_init
(
msg
,
TIPC_HIGH_IMPORTANCE
,
TIPC_CONN_MSG
,
BASIC_H_SIZE
,
orignode
);
BASIC_H_SIZE
,
msg_orignode
(
msg
)
);
msg_set_errcode
(
msg
,
TIPC_ERR_NO_PORT
);
msg_set_errcode
(
msg
,
TIPC_ERR_NO_PORT
);
msg_set_origport
(
msg
,
destport
);
msg_set_origport
(
msg
,
destport
);
msg_set_destport
(
msg
,
origport
);
msg_set_destport
(
msg
,
msg_origport
(
msg
)
);
}
}
if
(
p_ptr
)
if
(
p_ptr
)
tipc_port_unlock
(
p_ptr
);
tipc_port_unlock
(
p_ptr
);
...
@@ -646,8 +671,6 @@ void tipc_port_reinit(void)
...
@@ -646,8 +671,6 @@ void tipc_port_reinit(void)
spin_lock_bh
(
&
tipc_port_list_lock
);
spin_lock_bh
(
&
tipc_port_list_lock
);
list_for_each_entry
(
p_ptr
,
&
ports
,
port_list
)
{
list_for_each_entry
(
p_ptr
,
&
ports
,
port_list
)
{
msg
=
&
p_ptr
->
phdr
;
msg
=
&
p_ptr
->
phdr
;
if
(
msg_orignode
(
msg
)
==
tipc_own_addr
)
break
;
msg_set_prevnode
(
msg
,
tipc_own_addr
);
msg_set_prevnode
(
msg
,
tipc_own_addr
);
msg_set_orignode
(
msg
,
tipc_own_addr
);
msg_set_orignode
(
msg
,
tipc_own_addr
);
}
}
...
@@ -676,6 +699,7 @@ static void port_dispatcher_sigh(void *dummy)
...
@@ -676,6 +699,7 @@ static void port_dispatcher_sigh(void *dummy)
struct
tipc_name_seq
dseq
;
struct
tipc_name_seq
dseq
;
void
*
usr_handle
;
void
*
usr_handle
;
int
connected
;
int
connected
;
int
peer_invalid
;
int
published
;
int
published
;
u32
message_type
;
u32
message_type
;
...
@@ -696,6 +720,7 @@ static void port_dispatcher_sigh(void *dummy)
...
@@ -696,6 +720,7 @@ static void port_dispatcher_sigh(void *dummy)
up_ptr
=
p_ptr
->
user_port
;
up_ptr
=
p_ptr
->
user_port
;
usr_handle
=
up_ptr
->
usr_handle
;
usr_handle
=
up_ptr
->
usr_handle
;
connected
=
p_ptr
->
connected
;
connected
=
p_ptr
->
connected
;
peer_invalid
=
connected
&&
!
tipc_port_peer_msg
(
p_ptr
,
msg
);
published
=
p_ptr
->
published
;
published
=
p_ptr
->
published
;
if
(
unlikely
(
msg_errcode
(
msg
)))
if
(
unlikely
(
msg_errcode
(
msg
)))
...
@@ -705,8 +730,6 @@ static void port_dispatcher_sigh(void *dummy)
...
@@ -705,8 +730,6 @@ static void port_dispatcher_sigh(void *dummy)
case
TIPC_CONN_MSG
:{
case
TIPC_CONN_MSG
:{
tipc_conn_msg_event
cb
=
up_ptr
->
conn_msg_cb
;
tipc_conn_msg_event
cb
=
up_ptr
->
conn_msg_cb
;
u32
peer_port
=
port_peerport
(
p_ptr
);
u32
peer_node
=
port_peernode
(
p_ptr
);
u32
dsz
;
u32
dsz
;
tipc_port_unlock
(
p_ptr
);
tipc_port_unlock
(
p_ptr
);
...
@@ -715,8 +738,7 @@ static void port_dispatcher_sigh(void *dummy)
...
@@ -715,8 +738,7 @@ static void port_dispatcher_sigh(void *dummy)
if
(
unlikely
(
!
connected
))
{
if
(
unlikely
(
!
connected
))
{
if
(
tipc_connect2port
(
dref
,
&
orig
))
if
(
tipc_connect2port
(
dref
,
&
orig
))
goto
reject
;
goto
reject
;
}
else
if
((
msg_origport
(
msg
)
!=
peer_port
)
||
}
else
if
(
peer_invalid
)
(
msg_orignode
(
msg
)
!=
peer_node
))
goto
reject
;
goto
reject
;
dsz
=
msg_data_sz
(
msg
);
dsz
=
msg_data_sz
(
msg
);
if
(
unlikely
(
dsz
&&
if
(
unlikely
(
dsz
&&
...
@@ -768,14 +790,9 @@ static void port_dispatcher_sigh(void *dummy)
...
@@ -768,14 +790,9 @@ static void port_dispatcher_sigh(void *dummy)
case
TIPC_CONN_MSG
:{
case
TIPC_CONN_MSG
:{
tipc_conn_shutdown_event
cb
=
tipc_conn_shutdown_event
cb
=
up_ptr
->
conn_err_cb
;
up_ptr
->
conn_err_cb
;
u32
peer_port
=
port_peerport
(
p_ptr
);
u32
peer_node
=
port_peernode
(
p_ptr
);
tipc_port_unlock
(
p_ptr
);
tipc_port_unlock
(
p_ptr
);
if
(
!
cb
||
!
connected
)
if
(
!
cb
||
!
connected
||
peer_invalid
)
break
;
if
((
msg_origport
(
msg
)
!=
peer_port
)
||
(
msg_orignode
(
msg
)
!=
peer_node
))
break
;
break
;
tipc_disconnect
(
dref
);
tipc_disconnect
(
dref
);
skb_pull
(
buf
,
msg_hdr_sz
(
msg
));
skb_pull
(
buf
,
msg_hdr_sz
(
msg
));
...
@@ -1152,17 +1169,6 @@ int tipc_port_recv_msg(struct sk_buff *buf)
...
@@ -1152,17 +1169,6 @@ int tipc_port_recv_msg(struct sk_buff *buf)
/* validate destination & pass to port, otherwise reject message */
/* validate destination & pass to port, otherwise reject message */
p_ptr
=
tipc_port_lock
(
destport
);
p_ptr
=
tipc_port_lock
(
destport
);
if
(
likely
(
p_ptr
))
{
if
(
likely
(
p_ptr
))
{
if
(
likely
(
p_ptr
->
connected
))
{
if
((
unlikely
(
msg_origport
(
msg
)
!=
tipc_peer_port
(
p_ptr
)))
||
(
unlikely
(
msg_orignode
(
msg
)
!=
tipc_peer_node
(
p_ptr
)))
||
(
unlikely
(
!
msg_connected
(
msg
))))
{
err
=
TIPC_ERR_NO_PORT
;
tipc_port_unlock
(
p_ptr
);
goto
reject
;
}
}
err
=
p_ptr
->
dispatcher
(
p_ptr
,
buf
);
err
=
p_ptr
->
dispatcher
(
p_ptr
,
buf
);
tipc_port_unlock
(
p_ptr
);
tipc_port_unlock
(
p_ptr
);
if
(
likely
(
!
err
))
if
(
likely
(
!
err
))
...
@@ -1170,7 +1176,7 @@ int tipc_port_recv_msg(struct sk_buff *buf)
...
@@ -1170,7 +1176,7 @@ int tipc_port_recv_msg(struct sk_buff *buf)
}
else
{
}
else
{
err
=
TIPC_ERR_NO_PORT
;
err
=
TIPC_ERR_NO_PORT
;
}
}
reject:
return
tipc_reject_msg
(
buf
,
err
);
return
tipc_reject_msg
(
buf
,
err
);
}
}
...
@@ -1211,7 +1217,7 @@ int tipc_send(u32 ref, unsigned int num_sect, struct iovec const *msg_sect,
...
@@ -1211,7 +1217,7 @@ int tipc_send(u32 ref, unsigned int num_sect, struct iovec const *msg_sect,
p_ptr
->
congested
=
1
;
p_ptr
->
congested
=
1
;
if
(
!
tipc_port_congested
(
p_ptr
))
{
if
(
!
tipc_port_congested
(
p_ptr
))
{
destnode
=
port_peernode
(
p_ptr
);
destnode
=
port_peernode
(
p_ptr
);
if
(
likely
(
destnode
!=
tipc_own_addr
))
if
(
likely
(
!
in_own_node
(
destnode
)
))
res
=
tipc_link_send_sections_fast
(
p_ptr
,
msg_sect
,
num_sect
,
res
=
tipc_link_send_sections_fast
(
p_ptr
,
msg_sect
,
num_sect
,
total_len
,
destnode
);
total_len
,
destnode
);
else
else
...
@@ -1261,13 +1267,17 @@ int tipc_send2name(u32 ref, struct tipc_name const *name, unsigned int domain,
...
@@ -1261,13 +1267,17 @@ int tipc_send2name(u32 ref, struct tipc_name const *name, unsigned int domain,
msg_set_destport
(
msg
,
destport
);
msg_set_destport
(
msg
,
destport
);
if
(
likely
(
destport
||
destnode
))
{
if
(
likely
(
destport
||
destnode
))
{
if
(
likely
(
destnode
==
tipc_own_addr
))
if
(
likely
(
in_own_node
(
destnode
)
))
res
=
tipc_port_recv_sections
(
p_ptr
,
num_sect
,
res
=
tipc_port_recv_sections
(
p_ptr
,
num_sect
,
msg_sect
,
total_len
);
msg_sect
,
total_len
);
else
else
if
(
tipc_own_addr
)
res
=
tipc_link_send_sections_fast
(
p_ptr
,
msg_sect
,
res
=
tipc_link_send_sections_fast
(
p_ptr
,
msg_sect
,
num_sect
,
total_len
,
num_sect
,
total_len
,
destnode
);
destnode
);
else
res
=
tipc_port_reject_sections
(
p_ptr
,
msg
,
msg_sect
,
num_sect
,
total_len
,
TIPC_ERR_NO_NODE
);
if
(
likely
(
res
!=
-
ELINKCONG
))
{
if
(
likely
(
res
!=
-
ELINKCONG
))
{
if
(
res
>
0
)
if
(
res
>
0
)
p_ptr
->
sent
++
;
p_ptr
->
sent
++
;
...
@@ -1305,12 +1315,15 @@ int tipc_send2port(u32 ref, struct tipc_portid const *dest,
...
@@ -1305,12 +1315,15 @@ int tipc_send2port(u32 ref, struct tipc_portid const *dest,
msg_set_destport
(
msg
,
dest
->
ref
);
msg_set_destport
(
msg
,
dest
->
ref
);
msg_set_hdr_sz
(
msg
,
BASIC_H_SIZE
);
msg_set_hdr_sz
(
msg
,
BASIC_H_SIZE
);
if
(
dest
->
node
==
tipc_own_addr
)
if
(
in_own_node
(
dest
->
node
)
)
res
=
tipc_port_recv_sections
(
p_ptr
,
num_sect
,
msg_sect
,
res
=
tipc_port_recv_sections
(
p_ptr
,
num_sect
,
msg_sect
,
total_len
);
total_len
);
else
else
if
(
tipc_own_addr
)
res
=
tipc_link_send_sections_fast
(
p_ptr
,
msg_sect
,
num_sect
,
res
=
tipc_link_send_sections_fast
(
p_ptr
,
msg_sect
,
num_sect
,
total_len
,
dest
->
node
);
total_len
,
dest
->
node
);
else
res
=
tipc_port_reject_sections
(
p_ptr
,
msg
,
msg_sect
,
num_sect
,
total_len
,
TIPC_ERR_NO_NODE
);
if
(
likely
(
res
!=
-
ELINKCONG
))
{
if
(
likely
(
res
!=
-
ELINKCONG
))
{
if
(
res
>
0
)
if
(
res
>
0
)
p_ptr
->
sent
++
;
p_ptr
->
sent
++
;
...
@@ -1349,7 +1362,7 @@ int tipc_send_buf2port(u32 ref, struct tipc_portid const *dest,
...
@@ -1349,7 +1362,7 @@ int tipc_send_buf2port(u32 ref, struct tipc_portid const *dest,
skb_push
(
buf
,
BASIC_H_SIZE
);
skb_push
(
buf
,
BASIC_H_SIZE
);
skb_copy_to_linear_data
(
buf
,
msg
,
BASIC_H_SIZE
);
skb_copy_to_linear_data
(
buf
,
msg
,
BASIC_H_SIZE
);
if
(
dest
->
node
==
tipc_own_addr
)
if
(
in_own_node
(
dest
->
node
)
)
res
=
tipc_port_recv_msg
(
buf
);
res
=
tipc_port_recv_msg
(
buf
);
else
else
res
=
tipc_send_buf_fast
(
buf
,
dest
->
node
);
res
=
tipc_send_buf_fast
(
buf
,
dest
->
node
);
...
...
net/tipc/port.h
View file @
167de77f
...
@@ -201,6 +201,7 @@ int tipc_shutdown(u32 ref);
...
@@ -201,6 +201,7 @@ int tipc_shutdown(u32 ref);
* The following routines require that the port be locked on entry
* The following routines require that the port be locked on entry
*/
*/
int
tipc_disconnect_port
(
struct
tipc_port
*
tp_ptr
);
int
tipc_disconnect_port
(
struct
tipc_port
*
tp_ptr
);
int
tipc_port_peer_msg
(
struct
tipc_port
*
p_ptr
,
struct
tipc_msg
*
msg
);
/*
/*
* TIPC messaging routines
* TIPC messaging routines
...
@@ -257,16 +258,6 @@ static inline struct tipc_port *tipc_port_deref(u32 ref)
...
@@ -257,16 +258,6 @@ static inline struct tipc_port *tipc_port_deref(u32 ref)
return
(
struct
tipc_port
*
)
tipc_ref_deref
(
ref
);
return
(
struct
tipc_port
*
)
tipc_ref_deref
(
ref
);
}
}
static
inline
u32
tipc_peer_port
(
struct
tipc_port
*
p_ptr
)
{
return
msg_destport
(
&
p_ptr
->
phdr
);
}
static
inline
u32
tipc_peer_node
(
struct
tipc_port
*
p_ptr
)
{
return
msg_destnode
(
&
p_ptr
->
phdr
);
}
static
inline
int
tipc_port_congested
(
struct
tipc_port
*
p_ptr
)
static
inline
int
tipc_port_congested
(
struct
tipc_port
*
p_ptr
)
{
{
return
(
p_ptr
->
sent
-
p_ptr
->
acked
)
>=
(
TIPC_FLOW_CONTROL_WIN
*
2
);
return
(
p_ptr
->
sent
-
p_ptr
->
acked
)
>=
(
TIPC_FLOW_CONTROL_WIN
*
2
);
...
...
net/tipc/socket.c
View file @
167de77f
...
@@ -1236,7 +1236,8 @@ static u32 filter_rcv(struct sock *sk, struct sk_buff *buf)
...
@@ -1236,7 +1236,8 @@ static u32 filter_rcv(struct sock *sk, struct sk_buff *buf)
if
(
msg_mcast
(
msg
))
if
(
msg_mcast
(
msg
))
return
TIPC_ERR_NO_PORT
;
return
TIPC_ERR_NO_PORT
;
if
(
sock
->
state
==
SS_CONNECTED
)
{
if
(
sock
->
state
==
SS_CONNECTED
)
{
if
(
!
msg_connected
(
msg
))
if
(
!
msg_connected
(
msg
)
||
!
tipc_port_peer_msg
(
tipc_sk_port
(
sk
),
msg
))
return
TIPC_ERR_NO_PORT
;
return
TIPC_ERR_NO_PORT
;
}
else
if
(
sock
->
state
==
SS_CONNECTING
)
{
}
else
if
(
sock
->
state
==
SS_CONNECTING
)
{
if
(
!
msg_connected
(
msg
)
&&
(
msg_errcode
(
msg
)
==
0
))
if
(
!
msg_connected
(
msg
)
&&
(
msg_errcode
(
msg
)
==
0
))
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment