Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 28 additions & 1 deletion bp_socket/af_bp.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ struct proto_ops bp_proto_ops = { .family = AF_BP,
.mmap = sock_no_mmap,
.accept = sock_no_accept,
.getname = sock_no_getname,
// .poll = bp_poll,
.poll = bp_poll,
.ioctl = sock_no_ioctl,
.listen = sock_no_listen,
.shutdown = sock_no_shutdown,
Expand Down Expand Up @@ -318,6 +318,33 @@ int bp_sendmsg(struct socket* sock, struct msghdr* msg, size_t size)
return ret;
}

__poll_t bp_poll(
struct file* file, struct socket* sock, struct poll_table_struct* wait)
{
struct sock* sk = sock->sk;
struct bp_sock* bp = bp_sk(sk);
__poll_t mask = 0;

sock_poll_wait(file, sock, wait);

if (sk->sk_err)
mask |= POLLERR;

if (sk->sk_shutdown & RCV_SHUTDOWN)
mask |= POLLRDHUP | POLLIN | POLLRDNORM;

if (sk->sk_shutdown == SHUTDOWN_MASK)
mask |= POLLHUP;

if (!skb_queue_empty(&bp->rx_queue))
mask |= POLLIN | POLLRDNORM;

if (sock_writeable(sk))
mask |= POLLOUT | POLLWRNORM;

return mask;
}

int bp_recvmsg(struct socket* sock, struct msghdr* msg, size_t size, int flags)
{
struct sock* sk;
Expand Down
2 changes: 2 additions & 0 deletions bp_socket/af_bp.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,5 +38,7 @@ int bp_setsockopt(struct socket* sock, int level, int optname, sockptr_t optval,
unsigned int optlen);
int bp_getsockopt(struct socket* sock, int level, int optname,
char __user* optval, int __user* optlen);
__poll_t bp_poll(
struct file* file, struct socket* sock, struct poll_table_struct* wait);

#endif