From: Jon Maloy <jma...@redhat.com>

The existing 32-bit based address types in TIPC have a value space
that is perceived as too limited in some environments. It would
be more attractive in a modern user environment such as Kubernetes
if it could provide a larger address range.

Advantages:
- Users could directly use UUIDs, strings or other values as service
  instances types and instances.
- No more risk of collisions between randomly selected service types

The effect on the TIPC implementation and protocol would be significant,
but this is still worth considering.
---
 include/uapi/linux/tipc.h | 56 ++++++++++++++++++++++++++++++++++-----
 1 file changed, 50 insertions(+), 6 deletions(-)

diff --git a/include/uapi/linux/tipc.h b/include/uapi/linux/tipc.h
index add01db1daef..c0c46742ffbd 100644
--- a/include/uapi/linux/tipc.h
+++ b/include/uapi/linux/tipc.h
@@ -42,9 +42,22 @@
 #include <linux/sockios.h>
 
 /*
- * TIPC addressing primitives
+ * Unified address type
+ * node: destination node id or binding scope. Zero if whole cluster.
+ * type: service type. Must be unique for service.
+ * instance: service instance. Can be bound to by multiple sockets.
+ * range: binding, subscription or multicast range.
  */
+struct tipc_addr {
+        __u8 node[16];      /* zero if whole cluster */
+        __u8 type[16];      /* zero if socket address */
+        __u8 instance[16];  /* port number if socket address */
+        __u8 range;         /* number of trailing bits in 'instance' */
+};
 
+/*
+ * Legacy address types
+ */
 struct tipc_socket_addr {
        __u32 ref;
        __u32 node;
@@ -74,7 +87,7 @@ struct tipc_service_range {
  * Publication scopes when binding service / service range
  */
 enum tipc_scope {
-       TIPC_CLUSTER_SCOPE = 2, /* 0 can also be used */
+       TIPC_GLOBAL_SCOPE  = 0,
        TIPC_NODE_SCOPE    = 3
 };
 
@@ -114,8 +127,18 @@ enum tipc_scope {
 
 #define TIPC_WAIT_FOREVER      (~0)    /* timeout for permanent subscription */
 
+struct tipc_topsub {
+        struct tipc_addr service;       /* subscribed service */
+        __u32 timeout;                  /* subscription duration [ms] */
+        __u32 filter;                   /* subscription option bits */
+        __u8 handle[16];                /* user handle */
+};
+
+/*
+ * Legacy subscription structure
+ */
 struct tipc_subscr {
-       struct tipc_service_range seq;  /* range of interest */
+        struct tipc_service_range seq; /* range of interest */
        __u32 timeout;                  /* subscription duration (in ms) */
        __u32 filter;                   /* bitmask of filter options */
        char usr_handle[8];             /* available for subscriber use */
@@ -125,6 +148,16 @@ struct tipc_subscr {
 #define TIPC_WITHDRAWN         2       /* withdrawal event */
 #define TIPC_SUBSCR_TIMEOUT    3       /* subscription timeout event */
 
+struct tipc_topevt {
+        struct tipc_topsub sub;        /* original subscription */
+        struct tipc_addr socket;       /* associated socket */
+        struct tipc_addr service;      /* matching address */
+       __u32 event;                    /* publ/withdraw/timeout */
+};
+
+/*
+ * Legacy event structure
+ */
 struct tipc_event {
        __u32 event;                    /* event type */
        __u32 found_lower;              /* matching range */
@@ -153,18 +186,21 @@ struct tipc_event {
 #define TIPC_SERVICE_RANGE      1
 #define TIPC_SERVICE_ADDR       2
 #define TIPC_SOCKET_ADDR        3
+#define TIPC_ADDR               4
 
 struct sockaddr_tipc {
        unsigned short family;
        unsigned char  addrtype;
        signed   char  scope;
        union {
+
                struct tipc_socket_addr id;
                struct tipc_service_range nameseq;
                struct {
                        struct tipc_service_addr name;
                        __u32 domain;
                } name;
+                struct tipc_addr a;
        } addr;
 };
 
@@ -188,17 +224,25 @@ struct sockaddr_tipc {
 #define TIPC_SOCK_RECVQ_DEPTH  132     /* Default: none (read only) */
 #define TIPC_MCAST_BROADCAST    133     /* Default: TIPC selects. No arg */
 #define TIPC_MCAST_REPLICAST    134     /* Default: TIPC selects. No arg */
-#define TIPC_GROUP_JOIN         135     /* Takes struct tipc_group_req* */
+#define TIPC_GROUP_JOIN         135     /* Takes struct tipc_group_join */
 #define TIPC_GROUP_LEAVE        136     /* No argument */
 #define TIPC_SOCK_RECVQ_USED    137     /* Default: none (read only) */
 #define TIPC_NODELAY            138     /* Default: false */
 
 /*
- * Flag values
+ * Group join flag values
  */
 #define TIPC_GROUP_LOOPBACK     0x1  /* Receive copy of sent msg when match */
 #define TIPC_GROUP_MEMBER_EVTS  0x2  /* Receive membership events in socket */
 
+struct tipc_group_join {
+       struct tipc_addr addr;
+       __u32 flags;
+};
+
+/*
+ * Legacy structure
+ */
 struct tipc_group_req {
        __u32 type;      /* group id */
        __u32 instance;  /* member id */
@@ -259,7 +303,7 @@ static inline int tipc_aead_key_size(struct tipc_aead_key 
*key)
 
 #define TIPC_CFG_SRV           0
 #define TIPC_ZONE_SCOPE         1
-
+#define        TIPC_CLUSTER_SCOPE      2
 #define TIPC_ADDR_NAMESEQ      1
 #define TIPC_ADDR_NAME         2
 #define TIPC_ADDR_ID           3
-- 
2.25.4



_______________________________________________
tipc-discussion mailing list
tipc-discussion@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tipc-discussion

Reply via email to