summaryrefslogtreecommitdiff
path: root/net/tipc/socket.c
diff options
context:
space:
mode:
authorJon Maloy <jon.maloy@ericsson.com>2017-10-13 11:04:17 +0200
committerDavid S. Miller <davem@davemloft.net>2017-10-13 08:46:00 -0700
commit14c04493cb77bc38404dbcb39d5ccbb667831ad7 (patch)
tree24f418f63c5e134c034579f2c01bc44278425d86 /net/tipc/socket.c
parent2d0d21c12dfa3851620f1fa9fe2d444538f1fad4 (diff)
tipc: add ability to order and receive topology events in driver
As preparation for introducing communication groups, we add the ability to issue topology subscriptions and receive topology events from kernel space. This will make it possible for group member sockets to keep track of other group members. Signed-off-by: Jon Maloy <jon.maloy@ericsson.com> Acked-by: Ying Xue <ying.xue@windriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/socket.c')
-rw-r--r--net/tipc/socket.c32
1 files changed, 20 insertions, 12 deletions
diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index d50edd6e0019..9a7e7b5cf23f 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -896,6 +896,10 @@ exit:
kfree_skb(skb);
}
+static void tipc_sk_top_evt(struct tipc_sock *tsk, struct tipc_event *evt)
+{
+}
+
/**
* tipc_sendmsg - send message in connectionless manner
* @sock: socket structure
@@ -1671,20 +1675,24 @@ static bool filter_rcv(struct sock *sk, struct sk_buff *skb,
struct tipc_msg *hdr = buf_msg(skb);
unsigned int limit = rcvbuf_limit(sk, skb);
int err = TIPC_OK;
- int usr = msg_user(hdr);
- u32 onode;
-
- if (unlikely(msg_user(hdr) == CONN_MANAGER)) {
- tipc_sk_proto_rcv(tsk, skb, xmitq);
- return false;
- }
- if (unlikely(usr == SOCK_WAKEUP)) {
- onode = msg_orignode(hdr);
+ if (unlikely(!msg_isdata(hdr))) {
+ switch (msg_user(hdr)) {
+ case CONN_MANAGER:
+ tipc_sk_proto_rcv(tsk, skb, xmitq);
+ return false;
+ case SOCK_WAKEUP:
+ u32_del(&tsk->cong_links, msg_orignode(hdr));
+ tsk->cong_link_cnt--;
+ sk->sk_write_space(sk);
+ break;
+ case TOP_SRV:
+ tipc_sk_top_evt(tsk, (void *)msg_data(hdr));
+ break;
+ default:
+ break;
+ }
kfree_skb(skb);
- u32_del(&tsk->cong_links, onode);
- tsk->cong_link_cnt--;
- sk->sk_write_space(sk);
return false;
}