Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 215522
b: refs/heads/master
c: db5a753
h: refs/heads/master
v: v3
  • Loading branch information
Neil Horman authored and David S. Miller committed Oct 21, 2010
1 parent d6eb211 commit ff4d736
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 23 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 8c974438085d2c81b006daeaab8801eedbd19758
refs/heads/master: db5a753bf198ef7a50e17d2ff358adf37efe8648
57 changes: 35 additions & 22 deletions trunk/net/tipc/subscr.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,19 @@ struct top_srv {

static struct top_srv topsrv = { 0 };

/**
* htohl - convert value to endianness used by destination
* @in: value to convert
* @swap: non-zero if endianness must be reversed
*
* Returns converted value
*/

static u32 htohl(u32 in, int swap)
{
return swap ? swab32(in) : in;
}

/**
* subscr_send_event - send a message containing a tipc_event to the subscriber
*
Expand All @@ -94,11 +107,11 @@ static void subscr_send_event(struct subscription *sub,
msg_sect.iov_base = (void *)&sub->evt;
msg_sect.iov_len = sizeof(struct tipc_event);

sub->evt.event = htonl(event);
sub->evt.found_lower = htonl(found_lower);
sub->evt.found_upper = htonl(found_upper);
sub->evt.port.ref = htonl(port_ref);
sub->evt.port.node = htonl(node);
sub->evt.event = htohl(event, sub->swap);
sub->evt.found_lower = htohl(found_lower, sub->swap);
sub->evt.found_upper = htohl(found_upper, sub->swap);
sub->evt.port.ref = htohl(port_ref, sub->swap);
sub->evt.port.node = htohl(node, sub->swap);
tipc_send(sub->server_ref, 1, &msg_sect);
}

Expand Down Expand Up @@ -274,23 +287,16 @@ static void subscr_cancel(struct tipc_subscr *s,
{
struct subscription *sub;
struct subscription *sub_temp;
__u32 type, lower, upper;
int found = 0;

/* Find first matching subscription, exit if not found */

type = ntohl(s->seq.type);
lower = ntohl(s->seq.lower);
upper = ntohl(s->seq.upper);

list_for_each_entry_safe(sub, sub_temp, &subscriber->subscription_list,
subscription_list) {
if ((type == sub->seq.type) &&
(lower == sub->seq.lower) &&
(upper == sub->seq.upper)) {
found = 1;
break;
}
if (!memcmp(s, &sub->evt.s, sizeof(struct tipc_subscr))) {
found = 1;
break;
}
}
if (!found)
return;
Expand Down Expand Up @@ -319,10 +325,16 @@ static struct subscription *subscr_subscribe(struct tipc_subscr *s,
struct subscriber *subscriber)
{
struct subscription *sub;
int swap;

/* Determine subscriber's endianness */

swap = !(s->filter & (TIPC_SUB_PORTS | TIPC_SUB_SERVICE));

/* Detect & process a subscription cancellation request */

if (ntohl(s->filter) & TIPC_SUB_CANCEL) {
if (s->filter & htohl(TIPC_SUB_CANCEL, swap)) {
s->filter &= ~htohl(TIPC_SUB_CANCEL, swap);
subscr_cancel(s, subscriber);
return NULL;
}
Expand All @@ -347,11 +359,11 @@ static struct subscription *subscr_subscribe(struct tipc_subscr *s,

/* Initialize subscription object */

sub->seq.type = ntohl(s->seq.type);
sub->seq.lower = ntohl(s->seq.lower);
sub->seq.upper = ntohl(s->seq.upper);
sub->timeout = ntohl(s->timeout);
sub->filter = ntohl(s->filter);
sub->seq.type = htohl(s->seq.type, swap);
sub->seq.lower = htohl(s->seq.lower, swap);
sub->seq.upper = htohl(s->seq.upper, swap);
sub->timeout = htohl(s->timeout, swap);
sub->filter = htohl(s->filter, swap);
if ((!(sub->filter & TIPC_SUB_PORTS) ==
!(sub->filter & TIPC_SUB_SERVICE)) ||
(sub->seq.lower > sub->seq.upper)) {
Expand All @@ -364,6 +376,7 @@ static struct subscription *subscr_subscribe(struct tipc_subscr *s,
INIT_LIST_HEAD(&sub->nameseq_list);
list_add(&sub->subscription_list, &subscriber->subscription_list);
sub->server_ref = subscriber->port_ref;
sub->swap = swap;
memcpy(&sub->evt.s, s, sizeof(struct tipc_subscr));
atomic_inc(&topsrv.subscription_count);
if (sub->timeout != TIPC_WAIT_FOREVER) {
Expand Down
2 changes: 2 additions & 0 deletions trunk/net/tipc/subscr.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ typedef void (*tipc_subscr_event) (struct subscription *sub,
* @nameseq_list: adjacent subscriptions in name sequence's subscription list
* @subscription_list: adjacent subscriptions in subscriber's subscription list
* @server_ref: object reference of server port associated with subscription
* @swap: indicates if subscriber uses opposite endianness in its messages
* @evt: template for events generated by subscription
*/

Expand All @@ -65,6 +66,7 @@ struct subscription {
struct list_head nameseq_list;
struct list_head subscription_list;
u32 server_ref;
int swap;
struct tipc_event evt;
};

Expand Down

0 comments on commit ff4d736

Please sign in to comment.