Skip to content

Commit 29df44f

Browse files
Cong WangAlexei Starovoitov
authored andcommitted
af_unix: Implement ->read_sock() for sockmap
Implement ->read_sock() for AF_UNIX datagram socket, it is pretty much similar to udp_read_sock(). Signed-off-by: Cong Wang <cong.wang@bytedance.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Link: https://lore.kernel.org/bpf/20210704190252.11866-4-xiyou.wangcong@gmail.com
1 parent 0c48eef commit 29df44f

File tree

1 file changed

+37
-0
lines changed

1 file changed

+37
-0
lines changed

net/unix/af_unix.c

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,8 @@ static ssize_t unix_stream_splice_read(struct socket *, loff_t *ppos,
669669
unsigned int flags);
670670
static int unix_dgram_sendmsg(struct socket *, struct msghdr *, size_t);
671671
static int unix_dgram_recvmsg(struct socket *, struct msghdr *, size_t, int);
672+
static int unix_read_sock(struct sock *sk, read_descriptor_t *desc,
673+
sk_read_actor_t recv_actor);
672674
static int unix_dgram_connect(struct socket *, struct sockaddr *,
673675
int, int);
674676
static int unix_seqpacket_sendmsg(struct socket *, struct msghdr *, size_t);
@@ -746,6 +748,7 @@ static const struct proto_ops unix_dgram_ops = {
746748
.listen = sock_no_listen,
747749
.shutdown = unix_shutdown,
748750
.sendmsg = unix_dgram_sendmsg,
751+
.read_sock = unix_read_sock,
749752
.recvmsg = unix_dgram_recvmsg,
750753
.mmap = sock_no_mmap,
751754
.sendpage = sock_no_sendpage,
@@ -2188,6 +2191,40 @@ static int unix_dgram_recvmsg(struct socket *sock, struct msghdr *msg,
21882191
return err;
21892192
}
21902193

2194+
static int unix_read_sock(struct sock *sk, read_descriptor_t *desc,
2195+
sk_read_actor_t recv_actor)
2196+
{
2197+
int copied = 0;
2198+
2199+
while (1) {
2200+
struct unix_sock *u = unix_sk(sk);
2201+
struct sk_buff *skb;
2202+
int used, err;
2203+
2204+
mutex_lock(&u->iolock);
2205+
skb = skb_recv_datagram(sk, 0, 1, &err);
2206+
mutex_unlock(&u->iolock);
2207+
if (!skb)
2208+
return err;
2209+
2210+
used = recv_actor(desc, skb, 0, skb->len);
2211+
if (used <= 0) {
2212+
if (!copied)
2213+
copied = used;
2214+
kfree_skb(skb);
2215+
break;
2216+
} else if (used <= skb->len) {
2217+
copied += used;
2218+
}
2219+
2220+
kfree_skb(skb);
2221+
if (!desc->count)
2222+
break;
2223+
}
2224+
2225+
return copied;
2226+
}
2227+
21912228
/*
21922229
* Sleep until more data has arrived. But check for races..
21932230
*/

0 commit comments

Comments
 (0)