From c3c84fa6b3d6ec63bd9384793305a1cab79e79a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Denis-Courmont?= Date: Wed, 15 Sep 2010 12:19:53 +0000 Subject: [PATCH] --- yaml --- r: 214545 b: refs/heads/master c: 6482f554e2b9cbe733d63124765104f29cf0c9ad h: refs/heads/master i: 214543: bda5a2737a97337577b0531b5cf527d78c5b9cc5 v: v3 --- [refs] | 2 +- trunk/include/net/phonet/pep.h | 5 +++++ trunk/net/phonet/pep.c | 27 ++++++++++++++++++++++++++- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index ec77f662941e..b851da65a95a 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 7fedd7e5dfeb0f6bd69ee120b5c44a5e49892e47 +refs/heads/master: 6482f554e2b9cbe733d63124765104f29cf0c9ad diff --git a/trunk/include/net/phonet/pep.h b/trunk/include/net/phonet/pep.h index 35672b1cf44a..37f23dc05de8 100644 --- a/trunk/include/net/phonet/pep.h +++ b/trunk/include/net/phonet/pep.h @@ -77,6 +77,11 @@ static inline struct pnpipehdr *pnp_hdr(struct sk_buff *skb) #define MAX_PNPIPE_HEADER (MAX_PHONET_HEADER + 4) enum { + PNS_PIPE_CREATE_REQ = 0x00, + PNS_PIPE_CREATE_RESP, + PNS_PIPE_REMOVE_REQ, + PNS_PIPE_REMOVE_RESP, + PNS_PIPE_DATA = 0x20, PNS_PIPE_ALIGNED_DATA, diff --git a/trunk/net/phonet/pep.c b/trunk/net/phonet/pep.c index 04e34196c9de..d0e7eb24c8b9 100644 --- a/trunk/net/phonet/pep.c +++ b/trunk/net/phonet/pep.c @@ -620,6 +620,28 @@ static int pep_do_rcv(struct sock *sk, struct sk_buff *skb) return err; } +static int pipe_do_remove(struct sock *sk) +{ + struct pep_sock *pn = pep_sk(sk); + struct pnpipehdr *ph; + struct sk_buff *skb; + + skb = alloc_skb(MAX_PNPIPE_HEADER, GFP_KERNEL); + if (!skb) + return -ENOMEM; + + skb_reserve(skb, MAX_PNPIPE_HEADER); + __skb_push(skb, sizeof(*ph)); + skb_reset_transport_header(skb); + ph = pnp_hdr(skb); + ph->utid = 0; + ph->message_id = PNS_PIPE_REMOVE_REQ; + ph->pipe_handle = pn->pipe_handle; + ph->data[0] = PAD; + + return pn_skb_send(sk, skb, &pipe_srv); +} + /* associated socket ceases to exist */ static void pep_sock_close(struct sock *sk, long timeout) { @@ -638,7 +660,10 @@ static void pep_sock_close(struct sock *sk, long timeout) sk_for_each_safe(sknode, p, n, &pn->ackq) sk_del_node_init(sknode); sk->sk_state = TCP_CLOSE; - } + } else if ((1 << sk->sk_state) & (TCPF_SYN_RECV|TCPF_ESTABLISHED)) + /* Forcefully remove dangling Phonet pipe */ + pipe_do_remove(sk); + ifindex = pn->ifindex; pn->ifindex = 0; release_sock(sk);