|
@@ -177,6 +177,11 @@ static const struct nla_policy tipc_nl_sock_policy[TIPC_NLA_SOCK_MAX + 1] = {
|
|
|
* - port reference
|
|
|
*/
|
|
|
|
|
|
+static u32 tsk_own_node(struct tipc_sock *tsk)
|
|
|
+{
|
|
|
+ return msg_prevnode(&tsk->phdr);
|
|
|
+}
|
|
|
+
|
|
|
static u32 tsk_peer_node(struct tipc_sock *tsk)
|
|
|
{
|
|
|
return msg_destnode(&tsk->phdr);
|
|
@@ -249,11 +254,11 @@ static void tsk_rej_rx_queue(struct sock *sk)
|
|
|
{
|
|
|
struct sk_buff *skb;
|
|
|
u32 dnode;
|
|
|
- struct net *net = sock_net(sk);
|
|
|
+ u32 own_node = tsk_own_node(tipc_sk(sk));
|
|
|
|
|
|
while ((skb = __skb_dequeue(&sk->sk_receive_queue))) {
|
|
|
- if (tipc_msg_reverse(net, skb, &dnode, TIPC_ERR_NO_PORT))
|
|
|
- tipc_link_xmit_skb(net, skb, dnode, 0);
|
|
|
+ if (tipc_msg_reverse(own_node, skb, &dnode, TIPC_ERR_NO_PORT))
|
|
|
+ tipc_link_xmit_skb(sock_net(sk), skb, dnode, 0);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -305,6 +310,7 @@ static bool tsk_peer_msg(struct tipc_sock *tsk, struct tipc_msg *msg)
|
|
|
static int tipc_sk_create(struct net *net, struct socket *sock,
|
|
|
int protocol, int kern)
|
|
|
{
|
|
|
+ struct tipc_net *tn;
|
|
|
const struct proto_ops *ops;
|
|
|
socket_state state;
|
|
|
struct sock *sk;
|
|
@@ -346,7 +352,8 @@ static int tipc_sk_create(struct net *net, struct socket *sock,
|
|
|
tsk->max_pkt = MAX_PKT_DEFAULT;
|
|
|
INIT_LIST_HEAD(&tsk->publications);
|
|
|
msg = &tsk->phdr;
|
|
|
- tipc_msg_init(net, msg, TIPC_LOW_IMPORTANCE, TIPC_NAMED_MSG,
|
|
|
+ tn = net_generic(sock_net(sk), tipc_net_id);
|
|
|
+ tipc_msg_init(tn->own_addr, msg, TIPC_LOW_IMPORTANCE, TIPC_NAMED_MSG,
|
|
|
NAMED_H_SIZE, 0);
|
|
|
|
|
|
/* Finish initializing socket data structures */
|
|
@@ -471,7 +478,6 @@ static int tipc_release(struct socket *sock)
|
|
|
{
|
|
|
struct sock *sk = sock->sk;
|
|
|
struct net *net;
|
|
|
- struct tipc_net *tn;
|
|
|
struct tipc_sock *tsk;
|
|
|
struct sk_buff *skb;
|
|
|
u32 dnode, probing_state;
|
|
@@ -484,8 +490,6 @@ static int tipc_release(struct socket *sock)
|
|
|
return 0;
|
|
|
|
|
|
net = sock_net(sk);
|
|
|
- tn = net_generic(net, tipc_net_id);
|
|
|
-
|
|
|
tsk = tipc_sk(sk);
|
|
|
lock_sock(sk);
|
|
|
|
|
@@ -507,7 +511,7 @@ static int tipc_release(struct socket *sock)
|
|
|
tsk->connected = 0;
|
|
|
tipc_node_remove_conn(net, dnode, tsk->portid);
|
|
|
}
|
|
|
- if (tipc_msg_reverse(net, skb, &dnode,
|
|
|
+ if (tipc_msg_reverse(tsk_own_node(tsk), skb, &dnode,
|
|
|
TIPC_ERR_NO_PORT))
|
|
|
tipc_link_xmit_skb(net, skb, dnode, 0);
|
|
|
}
|
|
@@ -520,9 +524,9 @@ static int tipc_release(struct socket *sock)
|
|
|
sock_put(sk);
|
|
|
tipc_sk_remove(tsk);
|
|
|
if (tsk->connected) {
|
|
|
- skb = tipc_msg_create(net, TIPC_CRITICAL_IMPORTANCE,
|
|
|
+ skb = tipc_msg_create(TIPC_CRITICAL_IMPORTANCE,
|
|
|
TIPC_CONN_MSG, SHORT_H_SIZE, 0, dnode,
|
|
|
- tn->own_addr, tsk_peer_port(tsk),
|
|
|
+ tsk_own_node(tsk), tsk_peer_port(tsk),
|
|
|
tsk->portid, TIPC_ERR_NO_PORT);
|
|
|
if (skb)
|
|
|
tipc_link_xmit_skb(net, skb, dnode, tsk->portid);
|
|
@@ -730,8 +734,9 @@ static int tipc_sendmcast(struct socket *sock, struct tipc_name_seq *seq,
|
|
|
struct msghdr *msg, size_t dsz, long timeo)
|
|
|
{
|
|
|
struct sock *sk = sock->sk;
|
|
|
+ struct tipc_sock *tsk = tipc_sk(sk);
|
|
|
struct net *net = sock_net(sk);
|
|
|
- struct tipc_msg *mhdr = &tipc_sk(sk)->phdr;
|
|
|
+ struct tipc_msg *mhdr = &tsk->phdr;
|
|
|
struct sk_buff_head head;
|
|
|
struct iov_iter save = msg->msg_iter;
|
|
|
uint mtu;
|
|
@@ -749,7 +754,7 @@ static int tipc_sendmcast(struct socket *sock, struct tipc_name_seq *seq,
|
|
|
new_mtu:
|
|
|
mtu = tipc_bclink_get_mtu();
|
|
|
__skb_queue_head_init(&head);
|
|
|
- rc = tipc_msg_build(net, mhdr, msg, 0, dsz, mtu, &head);
|
|
|
+ rc = tipc_msg_build(mhdr, msg, 0, dsz, mtu, &head);
|
|
|
if (unlikely(rc < 0))
|
|
|
return rc;
|
|
|
|
|
@@ -836,7 +841,7 @@ static int tipc_sk_proto_rcv(struct tipc_sock *tsk, u32 *dnode,
|
|
|
if (conn_cong)
|
|
|
tsk->sk.sk_write_space(&tsk->sk);
|
|
|
} else if (msg_type(msg) == CONN_PROBE) {
|
|
|
- if (!tipc_msg_reverse(sock_net(&tsk->sk), buf, dnode, TIPC_OK))
|
|
|
+ if (!tipc_msg_reverse(tsk_own_node(tsk), buf, dnode, TIPC_OK))
|
|
|
return TIPC_OK;
|
|
|
msg_set_type(msg, CONN_PROBE_REPLY);
|
|
|
return TIPC_FWD_MSG;
|
|
@@ -971,7 +976,7 @@ static int tipc_sendmsg(struct kiocb *iocb, struct socket *sock,
|
|
|
new_mtu:
|
|
|
mtu = tipc_node_get_mtu(net, dnode, tsk->portid);
|
|
|
__skb_queue_head_init(&head);
|
|
|
- rc = tipc_msg_build(net, mhdr, m, 0, dsz, mtu, &head);
|
|
|
+ rc = tipc_msg_build(mhdr, m, 0, dsz, mtu, &head);
|
|
|
if (rc < 0)
|
|
|
goto exit;
|
|
|
|
|
@@ -1090,7 +1095,7 @@ next:
|
|
|
mtu = tsk->max_pkt;
|
|
|
send = min_t(uint, dsz - sent, TIPC_MAX_USER_MSG_SIZE);
|
|
|
__skb_queue_head_init(&head);
|
|
|
- rc = tipc_msg_build(net, mhdr, m, sent, send, mtu, &head);
|
|
|
+ rc = tipc_msg_build(mhdr, m, sent, send, mtu, &head);
|
|
|
if (unlikely(rc < 0))
|
|
|
goto exit;
|
|
|
do {
|
|
@@ -1263,7 +1268,6 @@ static int tipc_sk_anc_data_recv(struct msghdr *m, struct tipc_msg *msg,
|
|
|
static void tipc_sk_send_ack(struct tipc_sock *tsk, uint ack)
|
|
|
{
|
|
|
struct net *net = sock_net(&tsk->sk);
|
|
|
- struct tipc_net *tn = net_generic(net, tipc_net_id);
|
|
|
struct sk_buff *skb = NULL;
|
|
|
struct tipc_msg *msg;
|
|
|
u32 peer_port = tsk_peer_port(tsk);
|
|
@@ -1271,9 +1275,9 @@ static void tipc_sk_send_ack(struct tipc_sock *tsk, uint ack)
|
|
|
|
|
|
if (!tsk->connected)
|
|
|
return;
|
|
|
- skb = tipc_msg_create(net, CONN_MANAGER, CONN_ACK, INT_H_SIZE, 0,
|
|
|
- dnode, tn->own_addr, peer_port, tsk->portid,
|
|
|
- TIPC_OK);
|
|
|
+ skb = tipc_msg_create(CONN_MANAGER, CONN_ACK, INT_H_SIZE, 0,
|
|
|
+ dnode, tsk_own_node(tsk), peer_port,
|
|
|
+ tsk->portid, TIPC_OK);
|
|
|
if (!skb)
|
|
|
return;
|
|
|
msg = buf_msg(skb);
|
|
@@ -1756,7 +1760,7 @@ static int tipc_backlog_rcv(struct sock *sk, struct sk_buff *skb)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- if ((rc < 0) && !tipc_msg_reverse(net, skb, &onode, -rc))
|
|
|
+ if ((rc < 0) && !tipc_msg_reverse(tsk_own_node(tsk), skb, &onode, -rc))
|
|
|
return 0;
|
|
|
|
|
|
tipc_link_xmit_skb(net, skb, onode, 0);
|
|
@@ -1773,6 +1777,7 @@ static int tipc_backlog_rcv(struct sock *sk, struct sk_buff *skb)
|
|
|
int tipc_sk_rcv(struct net *net, struct sk_buff *skb)
|
|
|
{
|
|
|
struct tipc_sock *tsk;
|
|
|
+ struct tipc_net *tn;
|
|
|
struct sock *sk;
|
|
|
u32 dport = msg_destport(buf_msg(skb));
|
|
|
int rc = TIPC_OK;
|
|
@@ -1804,7 +1809,8 @@ int tipc_sk_rcv(struct net *net, struct sk_buff *skb)
|
|
|
if (likely(!rc))
|
|
|
return 0;
|
|
|
exit:
|
|
|
- if ((rc < 0) && !tipc_msg_reverse(net, skb, &dnode, -rc))
|
|
|
+ tn = net_generic(net, tipc_net_id);
|
|
|
+ if ((rc < 0) && !tipc_msg_reverse(tn->own_addr, skb, &dnode, -rc))
|
|
|
return -EHOSTUNREACH;
|
|
|
|
|
|
tipc_link_xmit_skb(net, skb, dnode, 0);
|
|
@@ -2065,7 +2071,6 @@ static int tipc_shutdown(struct socket *sock, int how)
|
|
|
{
|
|
|
struct sock *sk = sock->sk;
|
|
|
struct net *net = sock_net(sk);
|
|
|
- struct tipc_net *tn = net_generic(net, tipc_net_id);
|
|
|
struct tipc_sock *tsk = tipc_sk(sk);
|
|
|
struct sk_buff *skb;
|
|
|
u32 dnode;
|
|
@@ -2088,16 +2093,17 @@ restart:
|
|
|
kfree_skb(skb);
|
|
|
goto restart;
|
|
|
}
|
|
|
- if (tipc_msg_reverse(net, skb, &dnode,
|
|
|
+ if (tipc_msg_reverse(tsk_own_node(tsk), skb, &dnode,
|
|
|
TIPC_CONN_SHUTDOWN))
|
|
|
tipc_link_xmit_skb(net, skb, dnode,
|
|
|
tsk->portid);
|
|
|
tipc_node_remove_conn(net, dnode, tsk->portid);
|
|
|
} else {
|
|
|
dnode = tsk_peer_node(tsk);
|
|
|
- skb = tipc_msg_create(net, TIPC_CRITICAL_IMPORTANCE,
|
|
|
+
|
|
|
+ skb = tipc_msg_create(TIPC_CRITICAL_IMPORTANCE,
|
|
|
TIPC_CONN_MSG, SHORT_H_SIZE,
|
|
|
- 0, dnode, tn->own_addr,
|
|
|
+ 0, dnode, tsk_own_node(tsk),
|
|
|
tsk_peer_port(tsk),
|
|
|
tsk->portid, TIPC_CONN_SHUTDOWN);
|
|
|
tipc_link_xmit_skb(net, skb, dnode, tsk->portid);
|
|
@@ -2129,10 +2135,9 @@ static void tipc_sk_timeout(unsigned long data)
|
|
|
{
|
|
|
struct tipc_sock *tsk = (struct tipc_sock *)data;
|
|
|
struct sock *sk = &tsk->sk;
|
|
|
- struct net *net = sock_net(sk);
|
|
|
- struct tipc_net *tn = net_generic(net, tipc_net_id);
|
|
|
struct sk_buff *skb = NULL;
|
|
|
u32 peer_port, peer_node;
|
|
|
+ u32 own_node = tsk_own_node(tsk);
|
|
|
|
|
|
bh_lock_sock(sk);
|
|
|
if (!tsk->connected) {
|
|
@@ -2144,13 +2149,13 @@ static void tipc_sk_timeout(unsigned long data)
|
|
|
|
|
|
if (tsk->probing_state == TIPC_CONN_PROBING) {
|
|
|
/* Previous probe not answered -> self abort */
|
|
|
- skb = tipc_msg_create(net, TIPC_CRITICAL_IMPORTANCE,
|
|
|
+ skb = tipc_msg_create(TIPC_CRITICAL_IMPORTANCE,
|
|
|
TIPC_CONN_MSG, SHORT_H_SIZE, 0,
|
|
|
- tn->own_addr, peer_node, tsk->portid,
|
|
|
+ own_node, peer_node, tsk->portid,
|
|
|
peer_port, TIPC_ERR_NO_PORT);
|
|
|
} else {
|
|
|
- skb = tipc_msg_create(net, CONN_MANAGER, CONN_PROBE, INT_H_SIZE,
|
|
|
- 0, peer_node, tn->own_addr,
|
|
|
+ skb = tipc_msg_create(CONN_MANAGER, CONN_PROBE,
|
|
|
+ INT_H_SIZE, 0, peer_node, own_node,
|
|
|
peer_port, tsk->portid, TIPC_OK);
|
|
|
tsk->probing_state = TIPC_CONN_PROBING;
|
|
|
sk_reset_timer(sk, &sk->sk_timer, jiffies + tsk->probing_intv);
|