TIPC: Updated topology subscription protocol according to latest spec
authorJon Paul Maloy <jon.maloy@ericsson.com>
Tue, 6 Apr 2010 11:40:52 +0000 (11:40 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 7 Apr 2010 02:50:19 +0000 (19:50 -0700)
This patch makes it explicit in the API that all fields in subscriptions and events exchanged with the Topology Server must be in
network byte order.
It also ensures that all fields of a subscription are compared when cancelling a subscription, in order to avoid inadvertent
cancelling of the wrong subscription.
Finally, the tipc module version is updated to 2.0.0, to reflect the API change.

Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/tipc.h
net/tipc/core.c
net/tipc/subscr.c

index 3d92396639de9a6f542357d4276075c97dedc758..9536d8aeadf17db62c4a906face8258bc2500125 100644 (file)
@@ -127,23 +127,17 @@ static inline unsigned int tipc_node(__u32 addr)
  * TIPC topology subscription service definitions
  */
 
-#define TIPC_SUB_PORTS         0x01    /* filter for port availability */
-#define TIPC_SUB_SERVICE       0x02    /* filter for service availability */
-#define TIPC_SUB_CANCEL         0x04    /* cancel a subscription */
-#if 0
-/* The following filter options are not currently implemented */
-#define TIPC_SUB_NO_BIND_EVTS  0x04    /* filter out "publish" events */
-#define TIPC_SUB_NO_UNBIND_EVTS        0x08    /* filter out "withdraw" events */
-#define TIPC_SUB_SINGLE_EVT    0x10    /* expire after first event */
-#endif
+#define TIPC_SUB_SERVICE       0x00    /* Filter for service availability    */
+#define TIPC_SUB_PORTS         0x01    /* Filter for port availability  */
+#define TIPC_SUB_CANCEL         0x04    /* Cancel a subscription         */
 
 #define TIPC_WAIT_FOREVER      ~0      /* timeout for permanent subscription */
 
 struct tipc_subscr {
-       struct tipc_name_seq seq;       /* name sequence of interest */
-       __u32 timeout;                  /* subscription duration (in ms) */
-        __u32 filter;                  /* bitmask of filter options */
-       char usr_handle[8];             /* available for subscriber use */
+       struct tipc_name_seq seq;       /* NBO. Name sequence of interest */
+       __u32 timeout;                  /* NBO. Subscription duration (in ms) */
+        __u32 filter;                  /* NBO. Bitmask of filter options */
+       char usr_handle[8];             /* Opaque. Available for subscriber use */
 };
 
 #define TIPC_PUBLISHED         1       /* publication event */
@@ -151,11 +145,11 @@ struct tipc_subscr {
 #define TIPC_SUBSCR_TIMEOUT    3       /* subscription timeout event */
 
 struct tipc_event {
-       __u32 event;                    /* event type */
-       __u32 found_lower;              /* matching name seq instances */
-       __u32 found_upper;              /*    "      "    "     "      */
-       struct tipc_portid port;        /* associated port */
-       struct tipc_subscr s;           /* associated subscription */
+       __u32 event;                    /* NBO. Event type, as defined above */
+       __u32 found_lower;              /* NBO. Matching name seq instances  */
+       __u32 found_upper;              /*  "      "       "   "    "        */
+       struct tipc_portid port;        /* NBO. Associated port              */
+       struct tipc_subscr s;           /* Original, associated subscription */
 };
 
 /*
index 52c571fedbe05892ed9e7690e68063af7aabf1e6..4e84c8431f32632a65ca743ee043cd4e742d3421 100644 (file)
@@ -49,7 +49,7 @@
 #include "config.h"
 
 
-#define TIPC_MOD_VER "1.6.4"
+#define TIPC_MOD_VER "2.0.0"
 
 #ifndef CONFIG_TIPC_ZONES
 #define CONFIG_TIPC_ZONES 3
index ff123e56114a14e5e05671ac846d59a4e5555723..ab6eab4c45e2b0ecbbc460ddbed0045d48792f1c 100644 (file)
@@ -274,7 +274,7 @@ static void subscr_cancel(struct tipc_subscr *s,
 {
        struct subscription *sub;
        struct subscription *sub_temp;
-       __u32 type, lower, upper;
+       __u32 type, lower, upper, timeout, filter;
        int found = 0;
 
        /* Find first matching subscription, exit if not found */
@@ -282,12 +282,18 @@ static void subscr_cancel(struct tipc_subscr *s,
        type = ntohl(s->seq.type);
        lower = ntohl(s->seq.lower);
        upper = ntohl(s->seq.upper);
+       timeout = ntohl(s->timeout);
+       filter = ntohl(s->filter) & ~TIPC_SUB_CANCEL;
 
        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)) {
+                           (upper == sub->seq.upper) &&
+                           (timeout == sub->timeout) &&
+                            (filter == sub->filter) &&
+                             !memcmp(s->usr_handle,sub->evt.s.usr_handle,
+                                    sizeof(s->usr_handle)) ){
                                found = 1;
                                break;
                        }
@@ -304,7 +310,7 @@ static void subscr_cancel(struct tipc_subscr *s,
                k_term_timer(&sub->timer);
                spin_lock_bh(subscriber->lock);
        }
-       dbg("Cancel: removing sub %u,%u,%u from subscriber %x list\n",
+       dbg("Cancel: removing sub %u,%u,%u from subscriber %p list\n",
            sub->seq.type, sub->seq.lower, sub->seq.upper, subscriber);
        subscr_del(sub);
 }
@@ -352,8 +358,7 @@ static struct subscription *subscr_subscribe(struct tipc_subscr *s,
        sub->seq.upper = ntohl(s->seq.upper);
        sub->timeout = ntohl(s->timeout);
        sub->filter = ntohl(s->filter);
-       if ((!(sub->filter & TIPC_SUB_PORTS) ==
-            !(sub->filter & TIPC_SUB_SERVICE)) ||
+       if ((sub->filter && (sub->filter != TIPC_SUB_PORTS)) ||
            (sub->seq.lower > sub->seq.upper)) {
                warn("Subscription rejected, illegal request\n");
                kfree(sub);