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
Kirill Smelkov
linux
Commits
1897fe55
Commit
1897fe55
authored
Jun 24, 2011
by
David S. Miller
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'tipc-Jun24-2011' of
git://git.kernel.org/pub/scm/linux/kernel/git/paulg/net-next-2.6
parents
cd5f3e20
e4a0aee4
Changes
12
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
276 additions
and
381 deletions
+276
-381
net/tipc/bcast.c
net/tipc/bcast.c
+5
-1
net/tipc/bearer.c
net/tipc/bearer.c
+0
-1
net/tipc/bearer.h
net/tipc/bearer.h
+0
-2
net/tipc/core.h
net/tipc/core.h
+0
-6
net/tipc/link.c
net/tipc/link.c
+3
-3
net/tipc/msg.c
net/tipc/msg.c
+2
-4
net/tipc/msg.h
net/tipc/msg.h
+7
-27
net/tipc/name_distr.c
net/tipc/name_distr.c
+3
-3
net/tipc/name_table.c
net/tipc/name_table.c
+120
-169
net/tipc/name_table.h
net/tipc/name_table.h
+7
-7
net/tipc/port.c
net/tipc/port.c
+129
-155
net/tipc/socket.c
net/tipc/socket.c
+0
-3
No files found.
net/tipc/bcast.c
View file @
1897fe55
...
...
@@ -552,12 +552,16 @@ static int tipc_bcbearer_send(struct sk_buff *buf,
if
(
likely
(
!
msg_non_seq
(
buf_msg
(
buf
))))
{
struct
tipc_msg
*
msg
;
assert
(
tipc_bcast_nmap
.
count
!=
0
);
bcbuf_set_acks
(
buf
,
tipc_bcast_nmap
.
count
);
msg
=
buf_msg
(
buf
);
msg_set_non_seq
(
msg
,
1
);
msg_set_mc_netid
(
msg
,
tipc_net_id
);
bcl
->
stats
.
sent_info
++
;
if
(
WARN_ON
(
!
tipc_bcast_nmap
.
count
))
{
dump_stack
();
return
0
;
}
}
/* Send buffer over bearers until all targets reached */
...
...
net/tipc/bearer.c
View file @
1897fe55
...
...
@@ -402,7 +402,6 @@ void tipc_bearer_lock_push(struct tipc_bearer *b_ptr)
void
tipc_continue
(
struct
tipc_bearer
*
b_ptr
)
{
spin_lock_bh
(
&
b_ptr
->
lock
);
b_ptr
->
continue_count
++
;
if
(
!
list_empty
(
&
b_ptr
->
cong_links
))
tipc_k_signal
((
Handler
)
tipc_bearer_lock_push
,
(
unsigned
long
)
b_ptr
);
b_ptr
->
blocked
=
0
;
...
...
net/tipc/bearer.h
View file @
1897fe55
...
...
@@ -107,7 +107,6 @@ struct media {
* @link_req: ptr to (optional) structure making periodic link setup requests
* @links: list of non-congested links associated with bearer
* @cong_links: list of congested links associated with bearer
* @continue_count: # of times bearer has resumed after congestion or blocking
* @active: non-zero if bearer structure is represents a bearer
* @net_plane: network plane ('A' through 'H') currently associated with bearer
* @nodes: indicates which nodes in cluster can be reached through bearer
...
...
@@ -129,7 +128,6 @@ struct tipc_bearer {
struct
link_req
*
link_req
;
struct
list_head
links
;
struct
list_head
cong_links
;
u32
continue_count
;
int
active
;
char
net_plane
;
struct
tipc_node_map
nodes
;
...
...
net/tipc/core.h
View file @
1897fe55
...
...
@@ -61,12 +61,6 @@
struct
tipc_msg
;
/* msg.h */
struct
print_buf
;
/* log.h */
/*
* TIPC sanity test macros
*/
#define assert(i) BUG_ON(!(i))
/*
* TIPC system monitoring code
*/
...
...
net/tipc/link.c
View file @
1897fe55
...
...
@@ -1572,7 +1572,7 @@ static struct sk_buff *link_insert_deferred_queue(struct link *l_ptr,
static
int
link_recv_buf_validate
(
struct
sk_buff
*
buf
)
{
static
u32
min_data_hdr_size
[
8
]
=
{
SHORT_H_SIZE
,
MCAST_H_SIZE
,
LONG_H_SIZE
,
DIR_MSG
_H_SIZE
,
SHORT_H_SIZE
,
MCAST_H_SIZE
,
NAMED_H_SIZE
,
BASIC
_H_SIZE
,
MAX_H_SIZE
,
MAX_H_SIZE
,
MAX_H_SIZE
,
MAX_H_SIZE
};
...
...
@@ -2553,7 +2553,7 @@ int tipc_link_recv_fragment(struct sk_buff **pending, struct sk_buff **fb,
u32
msg_sz
=
msg_size
(
imsg
);
u32
fragm_sz
=
msg_data_sz
(
fragm
);
u32
exp_fragm_cnt
=
msg_sz
/
fragm_sz
+
!!
(
msg_sz
%
fragm_sz
);
u32
max
=
TIPC_MAX_USER_MSG_SIZE
+
LONG
_H_SIZE
;
u32
max
=
TIPC_MAX_USER_MSG_SIZE
+
NAMED
_H_SIZE
;
if
(
msg_type
(
imsg
)
==
TIPC_MCAST_MSG
)
max
=
TIPC_MAX_USER_MSG_SIZE
+
MCAST_H_SIZE
;
if
(
msg_size
(
imsg
)
>
max
)
{
...
...
@@ -2882,7 +2882,7 @@ static int tipc_link_stats(const char *name, char *buf, const u32 buf_size)
profile_total
=
1
;
tipc_printf
(
&
pb
,
" TX profile sample:%u packets average:%u octets
\n
"
" 0-64:%u%% -256:%u%% -1024:%u%% -4096:%u%% "
"-163
5
4:%u%% -32768:%u%% -66000:%u%%
\n
"
,
"-163
8
4:%u%% -32768:%u%% -66000:%u%%
\n
"
,
l_ptr
->
stats
.
msg_length_counts
,
l_ptr
->
stats
.
msg_lengths_total
/
profile_total
,
percent
(
l_ptr
->
stats
.
msg_length_profile
[
0
],
profile_total
),
...
...
net/tipc/msg.c
View file @
1897fe55
...
...
@@ -61,10 +61,8 @@ void tipc_msg_init(struct tipc_msg *m, u32 user, u32 type,
msg_set_size
(
m
,
hsize
);
msg_set_prevnode
(
m
,
tipc_own_addr
);
msg_set_type
(
m
,
type
);
if
(
!
msg_short
(
m
))
{
msg_set_orignode
(
m
,
tipc_own_addr
);
msg_set_destnode
(
m
,
destnode
);
}
msg_set_orignode
(
m
,
tipc_own_addr
);
msg_set_destnode
(
m
,
destnode
);
}
/**
...
...
net/tipc/msg.h
View file @
1897fe55
...
...
@@ -68,10 +68,10 @@
* Message header sizes
*/
#define SHORT_H_SIZE 24
/*
Connected, in-cluster messages
*/
#define
DIR_MSG_H_SIZE 32
/* Directly addressed messages
*/
#define
LONG_H_SIZE 40
/* Named messages
*/
#define MCAST_H_SIZE 44
/* Multicast
messages
*/
#define SHORT_H_SIZE 24
/*
In-cluster basic payload message
*/
#define
BASIC_H_SIZE 32
/* Basic payload message
*/
#define
NAMED_H_SIZE 40
/* Named payload message
*/
#define MCAST_H_SIZE 44
/* Multicast
payload message
*/
#define INT_H_SIZE 40
/* Internal messages */
#define MIN_H_SIZE 24
/* Smallest legal TIPC header size */
#define MAX_H_SIZE 60
/* Largest possible TIPC header size */
...
...
@@ -310,26 +310,6 @@ static inline void msg_set_seqno(struct tipc_msg *m, u32 n)
msg_set_bits
(
m
,
2
,
0
,
0xffff
,
n
);
}
/*
* TIPC may utilize the "link ack #" and "link seq #" fields of a short
* message header to hold the destination node for the message, since the
* normal "dest node" field isn't present. This cache is only referenced
* when required, so populating the cache of a longer message header is
* harmless (as long as the header has the two link sequence fields present).
*
* Note: Host byte order is OK here, since the info never goes off-card.
*/
static
inline
u32
msg_destnode_cache
(
struct
tipc_msg
*
m
)
{
return
m
->
hdr
[
2
];
}
static
inline
void
msg_set_destnode_cache
(
struct
tipc_msg
*
m
,
u32
dnode
)
{
m
->
hdr
[
2
]
=
dnode
;
}
/*
* Words 3-10
*/
...
...
@@ -377,7 +357,7 @@ static inline void msg_set_mc_netid(struct tipc_msg *m, u32 p)
static
inline
int
msg_short
(
struct
tipc_msg
*
m
)
{
return
msg_hdr_sz
(
m
)
==
24
;
return
msg_hdr_sz
(
m
)
==
SHORT_H_SIZE
;
}
static
inline
u32
msg_orignode
(
struct
tipc_msg
*
m
)
...
...
@@ -635,7 +615,7 @@ static inline u32 msg_link_selector(struct tipc_msg *m)
static
inline
void
msg_set_link_selector
(
struct
tipc_msg
*
m
,
u32
n
)
{
msg_set_bits
(
m
,
4
,
0
,
1
,
(
n
&
1
)
);
msg_set_bits
(
m
,
4
,
0
,
1
,
n
);
}
/*
...
...
@@ -659,7 +639,7 @@ static inline u32 msg_probe(struct tipc_msg *m)
static
inline
void
msg_set_probe
(
struct
tipc_msg
*
m
,
u32
val
)
{
msg_set_bits
(
m
,
5
,
0
,
1
,
(
val
&
1
)
);
msg_set_bits
(
m
,
5
,
0
,
1
,
val
);
}
static
inline
char
msg_net_plane
(
struct
tipc_msg
*
m
)
...
...
net/tipc/name_distr.c
View file @
1897fe55
...
...
@@ -94,13 +94,13 @@ static void publ_to_item(struct distr_item *i, struct publication *p)
static
struct
sk_buff
*
named_prepare_buf
(
u32
type
,
u32
size
,
u32
dest
)
{
struct
sk_buff
*
buf
=
tipc_buf_acquire
(
LONG
_H_SIZE
+
size
);
struct
sk_buff
*
buf
=
tipc_buf_acquire
(
INT
_H_SIZE
+
size
);
struct
tipc_msg
*
msg
;
if
(
buf
!=
NULL
)
{
msg
=
buf_msg
(
buf
);
tipc_msg_init
(
msg
,
NAME_DISTRIBUTOR
,
type
,
LONG
_H_SIZE
,
dest
);
msg_set_size
(
msg
,
LONG
_H_SIZE
+
size
);
tipc_msg_init
(
msg
,
NAME_DISTRIBUTOR
,
type
,
INT
_H_SIZE
,
dest
);
msg_set_size
(
msg
,
INT
_H_SIZE
+
size
);
}
return
buf
;
}
...
...
net/tipc/name_table.c
View file @
1897fe55
...
...
@@ -2,7 +2,7 @@
* net/tipc/name_table.c: TIPC name table code
*
* Copyright (c) 2000-2006, Ericsson AB
* Copyright (c) 2004-2008, Wind River Systems
* Copyright (c) 2004-2008,
2010-2011,
Wind River Systems
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
...
...
@@ -44,9 +44,7 @@
static
int
tipc_nametbl_size
=
1024
;
/* must be a power of 2 */
/**
* struct sub_seq - container for all published instances of a name sequence
* @lower: name sequence lower bound
* @upper: name sequence upper bound
* struct name_info - name sequence publication info
* @node_list: circular list of publications made by own node
* @cluster_list: circular list of publications made by own cluster
* @zone_list: circular list of publications made by own zone
...
...
@@ -59,17 +57,28 @@ static int tipc_nametbl_size = 1024; /* must be a power of 2 */
* (The cluster and node lists may be empty.)
*/
struct
sub_seq
{
u32
lower
;
u32
upper
;
struct
publication
*
node_list
;
struct
publication
*
cluster_list
;
struct
publication
*
zone_list
;
struct
name_info
{
struct
list_head
node_list
;
struct
list_head
cluster_list
;
struct
list_head
zone_list
;
u32
node_list_size
;
u32
cluster_list_size
;
u32
zone_list_size
;
};
/**
* struct sub_seq - container for all published instances of a name sequence
* @lower: name sequence lower bound
* @upper: name sequence upper bound
* @info: pointer to name sequence publication info
*/
struct
sub_seq
{
u32
lower
;
u32
upper
;
struct
name_info
*
info
;
};
/**
* struct name_seq - container for all published instances of a name type
* @type: 32 bit 'type' value for name sequence
...
...
@@ -246,6 +255,7 @@ static struct publication *tipc_nameseq_insert_publ(struct name_seq *nseq,
struct
subscription
*
st
;
struct
publication
*
publ
;
struct
sub_seq
*
sseq
;
struct
name_info
*
info
;
int
created_subseq
=
0
;
sseq
=
nameseq_find_subseq
(
nseq
,
lower
);
...
...
@@ -258,6 +268,8 @@ static struct publication *tipc_nameseq_insert_publ(struct name_seq *nseq,
type
,
lower
,
upper
);
return
NULL
;
}
info
=
sseq
->
info
;
}
else
{
u32
inspos
;
struct
sub_seq
*
freesseq
;
...
...
@@ -292,6 +304,17 @@ static struct publication *tipc_nameseq_insert_publ(struct name_seq *nseq,
nseq
->
alloc
*=
2
;
}
info
=
kzalloc
(
sizeof
(
*
info
),
GFP_ATOMIC
);
if
(
!
info
)
{
warn
(
"Cannot publish {%u,%u,%u}, no memory
\n
"
,
type
,
lower
,
upper
);
return
NULL
;
}
INIT_LIST_HEAD
(
&
info
->
node_list
);
INIT_LIST_HEAD
(
&
info
->
cluster_list
);
INIT_LIST_HEAD
(
&
info
->
zone_list
);
/* Insert new sub-sequence */
sseq
=
&
nseq
->
sseqs
[
inspos
];
...
...
@@ -301,6 +324,7 @@ static struct publication *tipc_nameseq_insert_publ(struct name_seq *nseq,
nseq
->
first_free
++
;
sseq
->
lower
=
lower
;
sseq
->
upper
=
upper
;
sseq
->
info
=
info
;
created_subseq
=
1
;
}
...
...
@@ -310,33 +334,17 @@ static struct publication *tipc_nameseq_insert_publ(struct name_seq *nseq,
if
(
!
publ
)
return
NULL
;
sseq
->
zone_list_size
++
;
if
(
!
sseq
->
zone_list
)
sseq
->
zone_list
=
publ
->
zone_list_next
=
publ
;
else
{
publ
->
zone_list_next
=
sseq
->
zone_list
->
zone_list_next
;
sseq
->
zone_list
->
zone_list_next
=
publ
;
}
list_add
(
&
publ
->
zone_list
,
&
info
->
zone_list
);
info
->
zone_list_size
++
;
if
(
in_own_cluster
(
node
))
{
sseq
->
cluster_list_size
++
;
if
(
!
sseq
->
cluster_list
)
sseq
->
cluster_list
=
publ
->
cluster_list_next
=
publ
;
else
{
publ
->
cluster_list_next
=
sseq
->
cluster_list
->
cluster_list_next
;
sseq
->
cluster_list
->
cluster_list_next
=
publ
;
}
list_add
(
&
publ
->
cluster_list
,
&
info
->
cluster_list
);
info
->
cluster_list_size
++
;
}
if
(
node
==
tipc_own_addr
)
{
sseq
->
node_list_size
++
;
if
(
!
sseq
->
node_list
)
sseq
->
node_list
=
publ
->
node_list_next
=
publ
;
else
{
publ
->
node_list_next
=
sseq
->
node_list
->
node_list_next
;
sseq
->
node_list
->
node_list_next
=
publ
;
}
list_add
(
&
publ
->
node_list
,
&
info
->
node_list
);
info
->
node_list_size
++
;
}
/*
...
...
@@ -370,9 +378,8 @@ static struct publication *tipc_nameseq_remove_publ(struct name_seq *nseq, u32 i
u32
node
,
u32
ref
,
u32
key
)
{
struct
publication
*
publ
;
struct
publication
*
curr
;
struct
publication
*
prev
;
struct
sub_seq
*
sseq
=
nameseq_find_subseq
(
nseq
,
inst
);
struct
name_info
*
info
;
struct
sub_seq
*
free
;
struct
subscription
*
s
,
*
st
;
int
removed_subseq
=
0
;
...
...
@@ -380,96 +387,41 @@ static struct publication *tipc_nameseq_remove_publ(struct name_seq *nseq, u32 i
if
(
!
sseq
)
return
NULL
;
/* Remove publication from zone scope list */
info
=
sseq
->
info
;
prev
=
sseq
->
zone_list
;
publ
=
sseq
->
zone_list
->
zone_list_next
;
while
((
publ
->
key
!=
key
)
||
(
publ
->
ref
!=
ref
)
||
(
publ
->
node
&&
(
publ
->
node
!=
node
)))
{
prev
=
publ
;
publ
=
publ
->
zone_list_next
;
if
(
prev
==
sseq
->
zone_list
)
{
/* Locate publication, if it exists */
/* Prevent endless loop if publication not found */
return
NULL
;
}
}
if
(
publ
!=
sseq
->
zone_list
)
prev
->
zone_list_next
=
publ
->
zone_list_next
;
else
if
(
publ
->
zone_list_next
!=
publ
)
{
prev
->
zone_list_next
=
publ
->
zone_list_next
;
sseq
->
zone_list
=
publ
->
zone_list_next
;
}
else
{
sseq
->
zone_list
=
NULL
;
list_for_each_entry
(
publ
,
&
info
->
zone_list
,
zone_list
)
{
if
((
publ
->
key
==
key
)
&&
(
publ
->
ref
==
ref
)
&&
(
!
publ
->
node
||
(
publ
->
node
==
node
)))
goto
found
;
}
sseq
->
zone_list_size
--
;
return
NULL
;
found:
/* Remove publication from zone scope list */
list_del
(
&
publ
->
zone_list
);
info
->
zone_list_size
--
;
/* Remove publication from cluster scope list, if present */
if
(
in_own_cluster
(
node
))
{
prev
=
sseq
->
cluster_list
;
curr
=
sseq
->
cluster_list
->
cluster_list_next
;
while
(
curr
!=
publ
)
{
prev
=
curr
;
curr
=
curr
->
cluster_list_next
;
if
(
prev
==
sseq
->
cluster_list
)
{
/* Prevent endless loop for malformed list */
err
(
"Unable to de-list cluster publication
\n
"
"{%u%u}, node=0x%x, ref=%u, key=%u)
\n
"
,
publ
->
type
,
publ
->
lower
,
publ
->
node
,
publ
->
ref
,
publ
->
key
);
goto
end_cluster
;
}
}
if
(
publ
!=
sseq
->
cluster_list
)
prev
->
cluster_list_next
=
publ
->
cluster_list_next
;
else
if
(
publ
->
cluster_list_next
!=
publ
)
{
prev
->
cluster_list_next
=
publ
->
cluster_list_next
;
sseq
->
cluster_list
=
publ
->
cluster_list_next
;
}
else
{
sseq
->
cluster_list
=
NULL
;
}
sseq
->
cluster_list_size
--
;
list_del
(
&
publ
->
cluster_list
);
info
->
cluster_list_size
--
;
}
end_cluster:
/* Remove publication from node scope list, if present */
if
(
node
==
tipc_own_addr
)
{
prev
=
sseq
->
node_list
;
curr
=
sseq
->
node_list
->
node_list_next
;
while
(
curr
!=
publ
)
{
prev
=
curr
;
curr
=
curr
->
node_list_next
;
if
(
prev
==
sseq
->
node_list
)
{
/* Prevent endless loop for malformed list */
err
(
"Unable to de-list node publication
\n
"
"{%u%u}, node=0x%x, ref=%u, key=%u)
\n
"
,
publ
->
type
,
publ
->
lower
,
publ
->
node
,
publ
->
ref
,
publ
->
key
);
goto
end_node
;
}
}
if
(
publ
!=
sseq
->
node_list
)
prev
->
node_list_next
=
publ
->
node_list_next
;
else
if
(
publ
->
node_list_next
!=
publ
)
{
prev
->
node_list_next
=
publ
->
node_list_next
;
sseq
->
node_list
=
publ
->
node_list_next
;
}
else
{
sseq
->
node_list
=
NULL
;
}
sseq
->
node_list_size
--
;
list_del
(
&
publ
->
node_list
);
info
->
node_list_size
--
;
}
end_node:
/* Contract subseq list if no more publications for that subseq */
if
(
!
sseq
->
zone_list
)
{
if
(
list_empty
(
&
info
->
zone_list
))
{
kfree
(
info
);
free
=
&
nseq
->
sseqs
[
nseq
->
first_free
--
];
memmove
(
sseq
,
sseq
+
1
,
(
free
-
(
sseq
+
1
))
*
sizeof
(
*
sseq
));
removed_subseq
=
1
;
...
...
@@ -506,12 +458,12 @@ static void tipc_nameseq_subscribe(struct name_seq *nseq, struct subscription *s
return
;
while
(
sseq
!=
&
nseq
->
sseqs
[
nseq
->
first_free
])
{
struct
publication
*
zl
=
sseq
->
zone_list
;
if
(
zl
&&
tipc_subscr_overlap
(
s
,
sseq
->
lower
,
sseq
->
upper
))
{
struct
publication
*
crs
=
zl
;
if
(
tipc_subscr_overlap
(
s
,
sseq
->
lower
,
sseq
->
upper
))
{
struct
publication
*
crs
;
struct
name_info
*
info
=
sseq
->
info
;
int
must_report
=
1
;
do
{
list_for_each_entry
(
crs
,
&
info
->
zone_list
,
zone_list
)
{
tipc_subscr_report_overlap
(
s
,
sseq
->
lower
,
sseq
->
upper
,
...
...
@@ -520,8 +472,7 @@ static void tipc_nameseq_subscribe(struct name_seq *nseq, struct subscription *s
crs
->
node
,
must_report
);
must_report
=
0
;
crs
=
crs
->
zone_list_next
;
}
while
(
crs
!=
zl
);
}
}
sseq
++
;
}
...
...
@@ -591,9 +542,10 @@ struct publication *tipc_nametbl_remove_publ(u32 type, u32 lower,
u32
tipc_nametbl_translate
(
u32
type
,
u32
instance
,
u32
*
destnode
)
{
struct
sub_seq
*
sseq
;
struct
publication
*
publ
=
NULL
;
struct
name_info
*
info
;
struct
publication
*
publ
;
struct
name_seq
*
seq
;
u32
ref
;
u32
ref
=
0
;
if
(
!
tipc_in_scope
(
*
destnode
,
tipc_own_addr
))
return
0
;
...
...
@@ -606,55 +558,57 @@ u32 tipc_nametbl_translate(u32 type, u32 instance, u32 *destnode)
if
(
unlikely
(
!
sseq
))
goto
not_found
;
spin_lock_bh
(
&
seq
->
lock
);
info
=
sseq
->
info
;
/* Closest-First Algorithm: */
if
(
likely
(
!*
destnode
))
{
publ
=
sseq
->
node_list
;
if
(
publ
)
{
sseq
->
node_list
=
publ
->
node_list_next
;
found:
ref
=
publ
->
ref
;
*
destnode
=
publ
->
node
;
spin_unlock_bh
(
&
seq
->
lock
);
read_unlock_bh
(
&
tipc_nametbl_lock
);
return
ref
;
}
publ
=
sseq
->
cluster_list
;
if
(
publ
)
{
sseq
->
cluster_list
=
publ
->
cluster_list_next
;
goto
found
;
}
publ
=
sseq
->
zone_list
;
if
(
publ
)
{
sseq
->
zone_list
=
publ
->
zone_list_next
;
goto
found
;
if
(
!
list_empty
(
&
info
->
node_list
))
{
publ
=
list_first_entry
(
&
info
->
node_list
,
struct
publication
,
node_list
);
list_move_tail
(
&
publ
->
node_list
,
&
info
->
node_list
);
}
else
if
(
!
list_empty
(
&
info
->
cluster_list
))
{
publ
=
list_first_entry
(
&
info
->
cluster_list
,
struct
publication
,
cluster_list
);
list_move_tail
(
&
publ
->
cluster_list
,
&
info
->
cluster_list
);
}
else
{
publ
=
list_first_entry
(
&
info
->
zone_list
,
struct
publication
,
zone_list
);
list_move_tail
(
&
publ
->
zone_list
,
&
info
->
zone_list
);
}
}
/* Round-Robin Algorithm: */
else
if
(
*
destnode
==
tipc_own_addr
)
{
publ
=
sseq
->
node_list
;
if
(
publ
)
{
sseq
->
node_list
=
publ
->
node_list_next
;
goto
found
;
}
if
(
list_empty
(
&
info
->
node_list
))
goto
no_match
;
publ
=
list_first_entry
(
&
info
->
node_list
,
struct
publication
,
node_list
)
;
list_move_tail
(
&
publ
->
node_list
,
&
info
->
node_list
);
}
else
if
(
in_own_cluster
(
*
destnode
))
{
publ
=
sseq
->
cluster_list
;
if
(
publ
)
{
sseq
->
cluster_list
=
publ
->
cluster_list_next
;
goto
found
;
}
if
(
list_empty
(
&
info
->
cluster_list
))
goto
no_match
;
publ
=
list_first_entry
(
&
info
->
cluster_list
,
struct
publication
,
cluster_list
)
;
list_move_tail
(
&
publ
->
cluster_list
,
&
info
->
cluster_list
);
}
else
{
publ
=
sseq
->
zone_list
;
if
(
publ
)
{
sseq
->
zone_list
=
publ
->
zone_list_next
;
goto
found
;
}
publ
=
list_first_entry
(
&
info
->
zone_list
,
struct
publication
,
zone_list
);
list_move_tail
(
&
publ
->
zone_list
,
&
info
->
zone_list
);
}
ref
=
publ
->
ref
;
*
destnode
=
publ
->
node
;
no_match:
spin_unlock_bh
(
&
seq
->
lock
);
not_found:
read_unlock_bh
(
&
tipc_nametbl_lock
);
return
0
;
return
ref
;
}
/**
...
...
@@ -676,6 +630,7 @@ int tipc_nametbl_mc_translate(u32 type, u32 lower, u32 upper, u32 limit,
struct
name_seq
*
seq
;
struct
sub_seq
*
sseq
;
struct
sub_seq
*
sseq_stop
;
struct
name_info
*
info
;
int
res
=
0
;
read_lock_bh
(
&
tipc_nametbl_lock
);
...
...
@@ -693,16 +648,13 @@ int tipc_nametbl_mc_translate(u32 type, u32 lower, u32 upper, u32 limit,
if
(
sseq
->
lower
>
upper
)
break
;
publ
=
sseq
->
node_list
;
if
(
publ
)
{
do
{
if
(
publ
->
scope
<=
limit
)
tipc_port_list_add
(
dports
,
publ
->
ref
);
publ
=
publ
->
node_list_next
;
}
while
(
publ
!=
sseq
->
node_list
);
info
=
sseq
->
info
;
list_for_each_entry
(
publ
,
&
info
->
node_list
,
node_list
)
{
if
(
publ
->
scope
<=
limit
)
tipc_port_list_add
(
dports
,
publ
->
ref
);
}
if
(
sseq
->
cluster_list_size
!=
sseq
->
node_list_size
)
if
(
info
->
cluster_list_size
!=
info
->
node_list_size
)
res
=
1
;
}
...
...
@@ -840,16 +792,19 @@ static void subseq_list(struct sub_seq *sseq, struct print_buf *buf, u32 depth,
{
char
portIdStr
[
27
];
const
char
*
scope_str
[]
=
{
""
,
" zone"
,
" cluster"
,
" node"
};
struct
publication
*
publ
=
sseq
->
zone_list
;
struct
publication
*
publ
;
struct
name_info
*
info
;
tipc_printf
(
buf
,
"%-10u %-10u "
,
sseq
->
lower
,
sseq
->
upper
);
if
(
depth
==
2
||
!
publ
)
{
if
(
depth
==
2
)
{
tipc_printf
(
buf
,
"
\n
"
);
return
;
}
do
{
info
=
sseq
->
info
;
list_for_each_entry
(
publ
,
&
info
->
zone_list
,
zone_list
)
{
sprintf
(
portIdStr
,
"<%u.%u.%u:%u>"
,
tipc_zone
(
publ
->
node
),
tipc_cluster
(
publ
->
node
),
tipc_node
(
publ
->
node
),
publ
->
ref
);
...
...
@@ -858,13 +813,9 @@ static void subseq_list(struct sub_seq *sseq, struct print_buf *buf, u32 depth,
tipc_printf
(
buf
,
"%-10u %s"
,
publ
->
key
,
scope_str
[
publ
->
scope
]);
}
publ
=
publ
->
zone_list_next
;
if
(
publ
==
sseq
->
zone_list
)
break
;
tipc_printf
(
buf
,
"
\n
%33s"
,
" "
);
}
while
(
1
);
if
(
!
list_is_last
(
&
publ
->
zone_list
,
&
info
->
zone_list
))
tipc_printf
(
buf
,
"
\n
%33s"
,
" "
);
};
tipc_printf
(
buf
,
"
\n
"
);
}
...
...
net/tipc/name_table.h
View file @
1897fe55
...
...
@@ -2,7 +2,7 @@
* net/tipc/name_table.h: Include file for TIPC name table code
*
* Copyright (c) 2000-2006, Ericsson AB
* Copyright (c) 2004-2005, Wind River Systems
* Copyright (c) 2004-2005,
2010-2011,
Wind River Systems
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
...
...
@@ -61,9 +61,9 @@ struct port_list;
* @subscr: subscription to "node down" event (for off-node publications only)
* @local_list: adjacent entries in list of publications made by this node
* @pport_list: adjacent entries in list of publications made by this port
* @node_list:
next matching name seq publication
with >= node scope
* @cluster_list:
next matching name seq publication
with >= cluster scope
* @zone_list:
next matching name seq publication
with >= zone scope
* @node_list:
adjacent matching name seq publications
with >= node scope
* @cluster_list:
adjacent matching name seq publications
with >= cluster scope
* @zone_list:
adjacent matching name seq publications
with >= zone scope
*
* Note that the node list, cluster list, and zone list are circular lists.
*/
...
...
@@ -79,9 +79,9 @@ struct publication {
struct
tipc_node_subscr
subscr
;
struct
list_head
local_list
;
struct
list_head
pport_list
;
struct
publication
*
node_list_nex
t
;
struct
publication
*
cluster_list_nex
t
;
struct
publication
*
zone_list_nex
t
;
struct
list_head
node_lis
t
;
struct
list_head
cluster_lis
t
;
struct
list_head
zone_lis
t
;
};
...
...
net/tipc/port.c
View file @
1897fe55
...
...
@@ -222,7 +222,7 @@ struct tipc_port *tipc_createport_raw(void *usr_handle,
p_ptr
->
max_pkt
=
MAX_PKT_DEFAULT
;
p_ptr
->
ref
=
ref
;
msg
=
&
p_ptr
->
phdr
;
tipc_msg_init
(
msg
,
importance
,
TIPC_NAMED_MSG
,
LONG
_H_SIZE
,
0
);
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
->
subscription
.
nodesub_list
);
...
...
@@ -327,26 +327,23 @@ int tipc_set_portunreturnable(u32 ref, unsigned int isunrejectable)
}
/*
* port_build_proto_msg():
build a port level protocol
*
or a connection abortion message. Called with
*
tipc_port lock on
.
* port_build_proto_msg():
create connection protocol message for port
*
*
On entry the port must be locked and connected
.
*/
static
struct
sk_buff
*
port_build_proto_msg
(
u32
destport
,
u32
destnode
,
u32
origport
,
u32
orignode
,
u32
usr
,
u32
type
,
u32
err
,
u32
ack
)
static
struct
sk_buff
*
port_build_proto_msg
(
struct
tipc_port
*
p_ptr
,
u32
type
,
u32
ack
)
{
struct
sk_buff
*
buf
;
struct
tipc_msg
*
msg
;
buf
=
tipc_buf_acquire
(
LONG
_H_SIZE
);
buf
=
tipc_buf_acquire
(
INT
_H_SIZE
);
if
(
buf
)
{
msg
=
buf_msg
(
buf
);
tipc_msg_init
(
msg
,
usr
,
type
,
LONG_H_SIZE
,
destnode
);
msg_set_errcode
(
msg
,
err
);
msg_set_destport
(
msg
,
destport
);
msg_set_origport
(
msg
,
origport
);
msg_set_orignode
(
msg
,
orignode
);
tipc_msg_init
(
msg
,
CONN_MANAGER
,
type
,
INT_H_SIZE
,
port_peernode
(
p_ptr
));
msg_set_destport
(
msg
,
port_peerport
(
p_ptr
));
msg_set_origport
(
msg
,
p_ptr
->
ref
);
msg_set_msgcnt
(
msg
,
ack
);
}
return
buf
;
...
...
@@ -358,45 +355,48 @@ int tipc_reject_msg(struct sk_buff *buf, u32 err)
struct
sk_buff
*
rbuf
;
struct
tipc_msg
*
rmsg
;
int
hdr_sz
;
u32
imp
=
msg_importance
(
msg
)
;
u32
imp
;
u32
data_sz
=
msg_data_sz
(
msg
);
if
(
data_sz
>
MAX_REJECT_SIZE
)
data_sz
=
MAX_REJECT_SIZE
;
if
(
msg_connected
(
msg
)
&&
(
imp
<
TIPC_CRITICAL_IMPORTANCE
))
imp
++
;
u32
src_node
;
u32
rmsg_sz
;
/* discard rejected message if it shouldn't be returned to sender */
if
(
msg_errcode
(
msg
)
||
msg_dest_droppable
(
msg
))
{
buf_discard
(
buf
);
return
data_sz
;
}
/* construct rejected message */
if
(
msg_mcast
(
msg
))
hdr_sz
=
MCAST_H_SIZE
;
else
hdr_sz
=
LONG_H_SIZE
;
rbuf
=
tipc_buf_acquire
(
data_sz
+
hdr_sz
);
if
(
rbuf
==
NULL
)
{
buf_discard
(
buf
);
return
data_sz
;
if
(
WARN
(
!
msg_isdata
(
msg
),
"attempt to reject message with user=%u"
,
msg_user
(
msg
)))
{
dump_stack
();
goto
exit
;
}
if
(
msg_errcode
(
msg
)
||
msg_dest_droppable
(
msg
))
goto
exit
;
/*
* construct returned message by copying rejected message header and
* data (or subset), then updating header fields that need adjusting
*/
hdr_sz
=
msg_hdr_sz
(
msg
);
rmsg_sz
=
hdr_sz
+
min_t
(
u32
,
data_sz
,
MAX_REJECT_SIZE
);
rbuf
=
tipc_buf_acquire
(
rmsg_sz
);
if
(
rbuf
==
NULL
)
goto
exit
;
rmsg
=
buf_msg
(
rbuf
);
tipc_msg_init
(
rmsg
,
imp
,
msg_type
(
msg
),
hdr_sz
,
msg_orignode
(
msg
));
msg_set_errcode
(
rmsg
,
err
);
msg_set_destport
(
rmsg
,
msg_origport
(
msg
));
msg_set_origport
(
rmsg
,
msg_destport
(
msg
));
if
(
msg_short
(
msg
))
{
msg_set_orignode
(
rmsg
,
tipc_own_addr
);
/* leave name type & instance as zeroes */
}
else
{
msg_set_orignode
(
rmsg
,
msg_destnode
(
msg
));
msg_set_nametype
(
rmsg
,
msg_nametype
(
msg
));
msg_set_nameinst
(
rmsg
,
msg_nameinst
(
msg
));
skb_copy_to_linear_data
(
rbuf
,
msg
,
rmsg_sz
);
if
(
msg_connected
(
rmsg
))
{
imp
=
msg_importance
(
rmsg
);
if
(
imp
<
TIPC_CRITICAL_IMPORTANCE
)
msg_set_importance
(
rmsg
,
++
imp
);
}
msg_set_size
(
rmsg
,
data_sz
+
hdr_sz
);
skb_copy_to_linear_data_offset
(
rbuf
,
hdr_sz
,
msg_data
(
msg
),
data_sz
);
msg_set_non_seq
(
rmsg
,
0
);
msg_set_size
(
rmsg
,
rmsg_sz
);
msg_set_errcode
(
rmsg
,
err
);
msg_set_prevnode
(
rmsg
,
tipc_own_addr
);
msg_swap_words
(
rmsg
,
4
,
5
);
if
(
!
msg_short
(
rmsg
))
msg_swap_words
(
rmsg
,
6
,
7
);
/* send self-abort message when rejecting on a connected port */
if
(
msg_connected
(
msg
))
{
...
...
@@ -411,9 +411,15 @@ int tipc_reject_msg(struct sk_buff *buf, u32 err)
tipc_net_route_msg
(
abuf
);
}
/* send rejected message */
/* send returned message & dispose of rejected message */
src_node
=
msg_prevnode
(
msg
);
if
(
src_node
==
tipc_own_addr
)
tipc_port_recv_msg
(
rbuf
);
else
tipc_link_send
(
rbuf
,
src_node
,
msg_link_selector
(
rmsg
));
exit:
buf_discard
(
buf
);
tipc_net_route_msg
(
rbuf
);
return
data_sz
;
}
...
...
@@ -449,14 +455,7 @@ static void port_timeout(unsigned long ref)
if
(
p_ptr
->
probing_state
==
PROBING
)
{
buf
=
port_build_self_abort_msg
(
p_ptr
,
TIPC_ERR_NO_PORT
);
}
else
{
buf
=
port_build_proto_msg
(
port_peerport
(
p_ptr
),
port_peernode
(
p_ptr
),
p_ptr
->
ref
,
tipc_own_addr
,
CONN_MANAGER
,
CONN_PROBE
,
TIPC_OK
,
0
);
buf
=
port_build_proto_msg
(
p_ptr
,
CONN_PROBE
,
0
);
p_ptr
->
probing_state
=
PROBING
;
k_start_timer
(
&
p_ptr
->
timer
,
p_ptr
->
probing_interval
);
}
...
...
@@ -480,100 +479,94 @@ static void port_handle_node_down(unsigned long ref)
static
struct
sk_buff
*
port_build_self_abort_msg
(
struct
tipc_port
*
p_ptr
,
u32
err
)
{
u32
imp
=
msg_importance
(
&
p_ptr
->
phd
r
);
struct
sk_buff
*
buf
=
port_build_peer_abort_msg
(
p_ptr
,
er
r
);
if
(
!
p_ptr
->
connected
)
return
NULL
;
if
(
imp
<
TIPC_CRITICAL_IMPORTANCE
)
imp
++
;
return
port_build_proto_msg
(
p_ptr
->
ref
,
tipc_own_addr
,
port_peerport
(
p_ptr
),
port_peernode
(
p_ptr
),
imp
,
TIPC_CONN_MSG
,
err
,
0
);
if
(
buf
)
{
struct
tipc_msg
*
msg
=
buf_msg
(
buf
);
msg_swap_words
(
msg
,
4
,
5
);
msg_swap_words
(
msg
,
6
,
7
);
}
return
buf
;
}
static
struct
sk_buff
*
port_build_peer_abort_msg
(
struct
tipc_port
*
p_ptr
,
u32
err
)
{
u32
imp
=
msg_importance
(
&
p_ptr
->
phdr
);
struct
sk_buff
*
buf
;
struct
tipc_msg
*
msg
;
u32
imp
;
if
(
!
p_ptr
->
connected
)
return
NULL
;
if
(
imp
<
TIPC_CRITICAL_IMPORTANCE
)
imp
++
;
return
port_build_proto_msg
(
port_peerport
(
p_ptr
),
port_peernode
(
p_ptr
),
p_ptr
->
ref
,
tipc_own_addr
,
imp
,
TIPC_CONN_MSG
,
err
,
0
);
buf
=
tipc_buf_acquire
(
BASIC_H_SIZE
);
if
(
buf
)
{
msg
=
buf_msg
(
buf
);
memcpy
(
msg
,
&
p_ptr
->
phdr
,
BASIC_H_SIZE
);
msg_set_hdr_sz
(
msg
,
BASIC_H_SIZE
);
msg_set_size
(
msg
,
BASIC_H_SIZE
);
imp
=
msg_importance
(
msg
);
if
(
imp
<
TIPC_CRITICAL_IMPORTANCE
)
msg_set_importance
(
msg
,
++
imp
);
msg_set_errcode
(
msg
,
err
);
}
return
buf
;
}
void
tipc_port_recv_proto_msg
(
struct
sk_buff
*
buf
)
{
struct
tipc_msg
*
msg
=
buf_msg
(
buf
);
struct
tipc_port
*
p_ptr
=
tipc_port_lock
(
msg_destport
(
msg
));
u32
err
=
TIPC_OK
;
struct
tipc_port
*
p_ptr
;
struct
sk_buff
*
r_buf
=
NULL
;
struct
sk_buff
*
abort_buf
=
NULL
;
if
(
!
p_ptr
)
{
err
=
TIPC_ERR_NO_PORT
;
}
else
if
(
p_ptr
->
connected
)
{
if
((
port_peernode
(
p_ptr
)
!=
msg_orignode
(
msg
))
||
(
port_peerport
(
p_ptr
)
!=
msg_origport
(
msg
)))
{
err
=
TIPC_ERR_NO_PORT
;
}
else
if
(
msg_type
(
msg
)
==
CONN_ACK
)
{
int
wakeup
=
tipc_port_congested
(
p_ptr
)
&&
p_ptr
->
congested
&&
p_ptr
->
wakeup
;
p_ptr
->
acked
+=
msg_msgcnt
(
msg
);
if
(
tipc_port_congested
(
p_ptr
))
goto
exit
;
p_ptr
->
congested
=
0
;
if
(
!
wakeup
)
goto
exit
;
p_ptr
->
wakeup
(
p_ptr
);
goto
exit
;
u32
orignode
=
msg_orignode
(
msg
);
u32
origport
=
msg_origport
(
msg
);
u32
destport
=
msg_destport
(
msg
);
int
wakeable
;
/* Validate connection */
p_ptr
=
tipc_port_lock
(
destport
);
if
(
!
p_ptr
||
!
p_ptr
->
connected
||
(
port_peernode
(
p_ptr
)
!=
orignode
)
||
(
port_peerport
(
p_ptr
)
!=
origport
))
{
r_buf
=
tipc_buf_acquire
(
BASIC_H_SIZE
);
if
(
r_buf
)
{
msg
=
buf_msg
(
r_buf
);
tipc_msg_init
(
msg
,
TIPC_HIGH_IMPORTANCE
,
TIPC_CONN_MSG
,
BASIC_H_SIZE
,
orignode
);
msg_set_errcode
(
msg
,
TIPC_ERR_NO_PORT
);
msg_set_origport
(
msg
,
destport
);
msg_set_destport
(
msg
,
origport
);
}
}
else
if
(
p_ptr
->
published
)
{
err
=
TIPC_ERR_NO_PORT
;
}
if
(
err
)
{
r_buf
=
port_build_proto_msg
(
msg_origport
(
msg
),
msg_orignode
(
msg
),
msg_destport
(
msg
),
tipc_own_addr
,
TIPC_HIGH_IMPORTANCE
,
TIPC_CONN_MSG
,
err
,
0
);
if
(
p_ptr
)
tipc_port_unlock
(
p_ptr
);
goto
exit
;
}
/* All is fine */
if
(
msg_type
(
msg
)
==
CONN_PROBE
)
{
r_buf
=
port_build_proto_msg
(
msg_origport
(
msg
),
msg_orignode
(
msg
),
msg_destport
(
msg
),
tipc_own_addr
,
CONN_MANAGER
,
CONN_PROBE_REPLY
,
TIPC_OK
,
0
);
/* Process protocol message sent by peer */
switch
(
msg_type
(
msg
))
{
case
CONN_ACK
:
wakeable
=
tipc_port_congested
(
p_ptr
)
&&
p_ptr
->
congested
&&
p_ptr
->
wakeup
;
p_ptr
->
acked
+=
msg_msgcnt
(
msg
);
if
(
!
tipc_port_congested
(
p_ptr
))
{
p_ptr
->
congested
=
0
;
if
(
wakeable
)
p_ptr
->
wakeup
(
p_ptr
);
}
break
;
case
CONN_PROBE
:
r_buf
=
port_build_proto_msg
(
p_ptr
,
CONN_PROBE_REPLY
,
0
);
break
;
default:
/* CONN_PROBE_REPLY or unrecognized - no action required */
break
;
}
p_ptr
->
probing_state
=
CONFIRMED
;
tipc_port_unlock
(
p_ptr
);
exit:
if
(
p_ptr
)
tipc_port_unlock
(
p_ptr
);
tipc_net_route_msg
(
r_buf
);
tipc_net_route_msg
(
abort_buf
);
buf_discard
(
buf
);
}
...
...
@@ -889,14 +882,7 @@ void tipc_acknowledge(u32 ref, u32 ack)
return
;
if
(
p_ptr
->
connected
)
{
p_ptr
->
conn_unacked
-=
ack
;
buf
=
port_build_proto_msg
(
port_peerport
(
p_ptr
),
port_peernode
(
p_ptr
),
ref
,
tipc_own_addr
,
CONN_MANAGER
,
CONN_ACK
,
TIPC_OK
,
ack
);
buf
=
port_build_proto_msg
(
p_ptr
,
CONN_ACK
,
ack
);
}
tipc_port_unlock
(
p_ptr
);
tipc_net_route_msg
(
buf
);
...
...
@@ -1140,19 +1126,7 @@ int tipc_shutdown(u32 ref)
if
(
!
p_ptr
)
return
-
EINVAL
;
if
(
p_ptr
->
connected
)
{
u32
imp
=
msg_importance
(
&
p_ptr
->
phdr
);
if
(
imp
<
TIPC_CRITICAL_IMPORTANCE
)
imp
++
;
buf
=
port_build_proto_msg
(
port_peerport
(
p_ptr
),
port_peernode
(
p_ptr
),
ref
,
tipc_own_addr
,
imp
,
TIPC_CONN_MSG
,
TIPC_CONN_SHUTDOWN
,
0
);
}
buf
=
port_build_peer_abort_msg
(
p_ptr
,
TIPC_CONN_SHUTDOWN
);
tipc_port_unlock
(
p_ptr
);
tipc_net_route_msg
(
buf
);
return
tipc_disconnect
(
ref
);
...
...
@@ -1238,7 +1212,7 @@ int tipc_send2name(u32 ref, struct tipc_name const *name, unsigned int domain,
msg_set_type
(
msg
,
TIPC_NAMED_MSG
);
msg_set_orignode
(
msg
,
tipc_own_addr
);
msg_set_origport
(
msg
,
ref
);
msg_set_hdr_sz
(
msg
,
LONG
_H_SIZE
);
msg_set_hdr_sz
(
msg
,
NAMED
_H_SIZE
);
msg_set_nametype
(
msg
,
name
->
type
);
msg_set_nameinst
(
msg
,
name
->
instance
);
msg_set_lookup_scope
(
msg
,
tipc_addr_scope
(
domain
));
...
...
@@ -1291,7 +1265,7 @@ int tipc_send2port(u32 ref, struct tipc_portid const *dest,
msg_set_origport
(
msg
,
ref
);
msg_set_destnode
(
msg
,
dest
->
node
);
msg_set_destport
(
msg
,
dest
->
ref
);
msg_set_hdr_sz
(
msg
,
DIR_MSG
_H_SIZE
);
msg_set_hdr_sz
(
msg
,
BASIC
_H_SIZE
);
if
(
dest
->
node
==
tipc_own_addr
)
res
=
tipc_port_recv_sections
(
p_ptr
,
num_sect
,
msg_sect
,
...
...
@@ -1331,13 +1305,13 @@ int tipc_send_buf2port(u32 ref, struct tipc_portid const *dest,
msg_set_origport
(
msg
,
ref
);
msg_set_destnode
(
msg
,
dest
->
node
);
msg_set_destport
(
msg
,
dest
->
ref
);
msg_set_hdr_sz
(
msg
,
DIR_MSG
_H_SIZE
);
msg_set_size
(
msg
,
DIR_MSG
_H_SIZE
+
dsz
);
if
(
skb_cow
(
buf
,
DIR_MSG
_H_SIZE
))
msg_set_hdr_sz
(
msg
,
BASIC
_H_SIZE
);
msg_set_size
(
msg
,
BASIC
_H_SIZE
+
dsz
);
if
(
skb_cow
(
buf
,
BASIC
_H_SIZE
))
return
-
ENOMEM
;
skb_push
(
buf
,
DIR_MSG
_H_SIZE
);
skb_copy_to_linear_data
(
buf
,
msg
,
DIR_MSG
_H_SIZE
);
skb_push
(
buf
,
BASIC
_H_SIZE
);
skb_copy_to_linear_data
(
buf
,
msg
,
BASIC
_H_SIZE
);
if
(
dest
->
node
==
tipc_own_addr
)
res
=
tipc_port_recv_msg
(
buf
);
...
...
net/tipc/socket.c
View file @
1897fe55
...
...
@@ -36,9 +36,6 @@
#include <net/sock.h>
#include <linux/tipc.h>
#include <linux/tipc_config.h>
#include "core.h"
#include "port.h"
...
...
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