forked from Minki/linux
Merge branch 'tipc-Jun24-2011' of git://git.kernel.org/pub/scm/linux/kernel/git/paulg/net-next-2.6
This commit is contained in:
commit
1897fe55e1
@ -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 */
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
*/
|
||||
|
@ -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%% "
|
||||
"-16354:%u%% -32768:%u%% -66000:%u%%\n",
|
||||
"-16384:%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),
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
info = sseq->info;
|
||||
|
||||
/* Locate publication, if it exists */
|
||||
|
||||
list_for_each_entry(publ, &info->zone_list, zone_list) {
|
||||
if ((publ->key == key) && (publ->ref == ref) &&
|
||||
(!publ->node || (publ->node == node)))
|
||||
goto found;
|
||||
}
|
||||
return NULL;
|
||||
|
||||
found:
|
||||
/* Remove publication from zone scope list */
|
||||
|
||||
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) {
|
||||
|
||||
/* 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;
|
||||
}
|
||||
sseq->zone_list_size--;
|
||||
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");
|
||||
}
|
||||
|
@ -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_next;
|
||||
struct publication *cluster_list_next;
|
||||
struct publication *zone_list_next;
|
||||
struct list_head node_list;
|
||||
struct list_head cluster_list;
|
||||
struct list_head zone_list;
|
||||
};
|
||||
|
||||
|
||||
|
282
net/tipc/port.c
282
net/tipc/port.c
@ -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->phdr);
|
||||
struct sk_buff *buf = port_build_peer_abort_msg(p_ptr, err);
|
||||
|
||||
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;
|
||||
u32 orignode = msg_orignode(msg);
|
||||
u32 origport = msg_origport(msg);
|
||||
u32 destport = msg_destport(msg);
|
||||
int wakeable;
|
||||
|
||||
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;
|
||||
/* 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);
|
||||
|
@ -36,9 +36,6 @@
|
||||
|
||||
#include <net/sock.h>
|
||||
|
||||
#include <linux/tipc.h>
|
||||
#include <linux/tipc_config.h>
|
||||
|
||||
#include "core.h"
|
||||
#include "port.h"
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user