Lines Matching refs:q
54 static inline bool macvtap_legacy_is_little_endian(struct macvtap_queue *q) in macvtap_legacy_is_little_endian() argument
56 return q->flags & MACVTAP_VNET_BE ? false : in macvtap_legacy_is_little_endian()
60 static long macvtap_get_vnet_be(struct macvtap_queue *q, int __user *sp) in macvtap_get_vnet_be() argument
62 int s = !!(q->flags & MACVTAP_VNET_BE); in macvtap_get_vnet_be()
70 static long macvtap_set_vnet_be(struct macvtap_queue *q, int __user *sp) in macvtap_set_vnet_be() argument
78 q->flags |= MACVTAP_VNET_BE; in macvtap_set_vnet_be()
80 q->flags &= ~MACVTAP_VNET_BE; in macvtap_set_vnet_be()
85 static inline bool macvtap_legacy_is_little_endian(struct macvtap_queue *q) in macvtap_legacy_is_little_endian() argument
90 static long macvtap_get_vnet_be(struct macvtap_queue *q, int __user *argp) in macvtap_get_vnet_be() argument
95 static long macvtap_set_vnet_be(struct macvtap_queue *q, int __user *argp) in macvtap_set_vnet_be() argument
101 static inline bool macvtap_is_little_endian(struct macvtap_queue *q) in macvtap_is_little_endian() argument
103 return q->flags & MACVTAP_VNET_LE || in macvtap_is_little_endian()
104 macvtap_legacy_is_little_endian(q); in macvtap_is_little_endian()
107 static inline u16 macvtap16_to_cpu(struct macvtap_queue *q, __virtio16 val) in macvtap16_to_cpu() argument
109 return __virtio16_to_cpu(macvtap_is_little_endian(q), val); in macvtap16_to_cpu()
112 static inline __virtio16 cpu_to_macvtap16(struct macvtap_queue *q, u16 val) in cpu_to_macvtap16() argument
114 return __cpu_to_virtio16(macvtap_is_little_endian(q), val); in cpu_to_macvtap16()
165 struct macvtap_queue *q) in macvtap_enable_queue() argument
172 if (q->enabled) in macvtap_enable_queue()
176 rcu_assign_pointer(vlan->taps[vlan->numvtaps], q); in macvtap_enable_queue()
177 q->queue_index = vlan->numvtaps; in macvtap_enable_queue()
178 q->enabled = true; in macvtap_enable_queue()
187 struct macvtap_queue *q) in macvtap_set_queue() argument
194 rcu_assign_pointer(q->vlan, vlan); in macvtap_set_queue()
195 rcu_assign_pointer(vlan->taps[vlan->numvtaps], q); in macvtap_set_queue()
196 sock_hold(&q->sk); in macvtap_set_queue()
198 q->file = file; in macvtap_set_queue()
199 q->queue_index = vlan->numvtaps; in macvtap_set_queue()
200 q->enabled = true; in macvtap_set_queue()
201 file->private_data = q; in macvtap_set_queue()
202 list_add_tail(&q->next, &vlan->queue_list); in macvtap_set_queue()
210 static int macvtap_disable_queue(struct macvtap_queue *q) in macvtap_disable_queue() argument
216 if (!q->enabled) in macvtap_disable_queue()
219 vlan = rtnl_dereference(q->vlan); in macvtap_disable_queue()
222 int index = q->queue_index; in macvtap_disable_queue()
229 q->enabled = false; in macvtap_disable_queue()
245 static void macvtap_put_queue(struct macvtap_queue *q) in macvtap_put_queue() argument
250 vlan = rtnl_dereference(q->vlan); in macvtap_put_queue()
253 if (q->enabled) in macvtap_put_queue()
254 BUG_ON(macvtap_disable_queue(q)); in macvtap_put_queue()
257 RCU_INIT_POINTER(q->vlan, NULL); in macvtap_put_queue()
258 sock_put(&q->sk); in macvtap_put_queue()
259 list_del_init(&q->next); in macvtap_put_queue()
265 sock_put(&q->sk); in macvtap_put_queue()
321 struct macvtap_queue *q, *tmp; in macvtap_del_queues() local
324 list_for_each_entry_safe(q, tmp, &vlan->queue_list, next) { in macvtap_del_queues()
325 list_del_init(&q->next); in macvtap_del_queues()
326 RCU_INIT_POINTER(q->vlan, NULL); in macvtap_del_queues()
327 if (q->enabled) in macvtap_del_queues()
330 sock_put(&q->sk); in macvtap_del_queues()
343 struct macvtap_queue *q; in macvtap_handle_frame() local
350 q = macvtap_get_queue(dev, skb); in macvtap_handle_frame()
351 if (!q) in macvtap_handle_frame()
354 if (skb_queue_len(&q->sk.sk_receive_queue) >= dev->tx_queue_len) in macvtap_handle_frame()
363 if (q->flags & IFF_VNET_HDR) in macvtap_handle_frame()
372 skb_queue_tail(&q->sk.sk_receive_queue, skb); in macvtap_handle_frame()
381 skb_queue_tail(&q->sk.sk_receive_queue, segs); in macvtap_handle_frame()
394 skb_queue_tail(&q->sk.sk_receive_queue, skb); in macvtap_handle_frame()
398 wake_up_interruptible_poll(sk_sleep(&q->sk), POLLIN | POLLRDNORM | POLLRDBAND); in macvtap_handle_frame()
518 struct macvtap_queue *q; in macvtap_open() local
527 q = (struct macvtap_queue *)sk_alloc(net, AF_UNSPEC, GFP_KERNEL, in macvtap_open()
529 if (!q) in macvtap_open()
532 RCU_INIT_POINTER(q->sock.wq, &q->wq); in macvtap_open()
533 init_waitqueue_head(&q->wq.wait); in macvtap_open()
534 q->sock.type = SOCK_RAW; in macvtap_open()
535 q->sock.state = SS_CONNECTED; in macvtap_open()
536 q->sock.file = file; in macvtap_open()
537 q->sock.ops = &macvtap_socket_ops; in macvtap_open()
538 sock_init_data(&q->sock, &q->sk); in macvtap_open()
539 q->sk.sk_write_space = macvtap_sock_write_space; in macvtap_open()
540 q->sk.sk_destruct = macvtap_sock_destruct; in macvtap_open()
541 q->flags = IFF_VNET_HDR | IFF_NO_PI | IFF_TAP; in macvtap_open()
542 q->vnet_hdr_sz = sizeof(struct virtio_net_hdr); in macvtap_open()
552 sock_set_flag(&q->sk, SOCK_ZEROCOPY); in macvtap_open()
554 err = macvtap_set_queue(dev, file, q); in macvtap_open()
556 sock_put(&q->sk); in macvtap_open()
568 struct macvtap_queue *q = file->private_data; in macvtap_release() local
569 macvtap_put_queue(q); in macvtap_release()
575 struct macvtap_queue *q = file->private_data; in macvtap_poll() local
578 if (!q) in macvtap_poll()
582 poll_wait(file, &q->wq.wait, wait); in macvtap_poll()
584 if (!skb_queue_empty(&q->sk.sk_receive_queue)) in macvtap_poll()
587 if (sock_writeable(&q->sk) || in macvtap_poll()
588 (!test_and_set_bit(SOCKWQ_ASYNC_NOSPACE, &q->sock.flags) && in macvtap_poll()
589 sock_writeable(&q->sk))) in macvtap_poll()
623 static int macvtap_skb_from_vnet_hdr(struct macvtap_queue *q, in macvtap_skb_from_vnet_hdr() argument
651 if (!skb_partial_csum_set(skb, macvtap16_to_cpu(q, vnet_hdr->csum_start), in macvtap_skb_from_vnet_hdr()
652 macvtap16_to_cpu(q, vnet_hdr->csum_offset))) in macvtap_skb_from_vnet_hdr()
657 skb_shinfo(skb)->gso_size = macvtap16_to_cpu(q, vnet_hdr->gso_size); in macvtap_skb_from_vnet_hdr()
667 static void macvtap_skb_to_vnet_hdr(struct macvtap_queue *q, in macvtap_skb_to_vnet_hdr() argument
677 vnet_hdr->hdr_len = cpu_to_macvtap16(q, skb_headlen(skb)); in macvtap_skb_to_vnet_hdr()
678 vnet_hdr->gso_size = cpu_to_macvtap16(q, sinfo->gso_size); in macvtap_skb_to_vnet_hdr()
695 vnet_hdr->csum_start = cpu_to_macvtap16(q, in macvtap_skb_to_vnet_hdr()
698 vnet_hdr->csum_start = cpu_to_macvtap16(q, in macvtap_skb_to_vnet_hdr()
700 vnet_hdr->csum_offset = cpu_to_macvtap16(q, skb->csum_offset); in macvtap_skb_to_vnet_hdr()
710 static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m, in macvtap_get_user() argument
727 if (q->flags & IFF_VNET_HDR) { in macvtap_get_user()
728 vnet_hdr_len = q->vnet_hdr_sz; in macvtap_get_user()
741 macvtap16_to_cpu(q, vnet_hdr.csum_start) + in macvtap_get_user()
742 macvtap16_to_cpu(q, vnet_hdr.csum_offset) + 2 > in macvtap_get_user()
743 macvtap16_to_cpu(q, vnet_hdr.hdr_len)) in macvtap_get_user()
744 vnet_hdr.hdr_len = cpu_to_macvtap16(q, in macvtap_get_user()
745 macvtap16_to_cpu(q, vnet_hdr.csum_start) + in macvtap_get_user()
746 macvtap16_to_cpu(q, vnet_hdr.csum_offset) + 2); in macvtap_get_user()
748 if (macvtap16_to_cpu(q, vnet_hdr.hdr_len) > len) in macvtap_get_user()
756 if (m && m->msg_control && sock_flag(&q->sk, SOCK_ZEROCOPY)) { in macvtap_get_user()
760 macvtap16_to_cpu(q, vnet_hdr.hdr_len) : GOODCOPY_LEN; in macvtap_get_user()
774 linear = macvtap16_to_cpu(q, vnet_hdr.hdr_len); in macvtap_get_user()
781 skb = macvtap_alloc_skb(&q->sk, MACVTAP_RESERVE, copylen, in macvtap_get_user()
804 err = macvtap_skb_from_vnet_hdr(q, skb, &vnet_hdr); in macvtap_get_user()
818 vlan = rcu_dereference(q->vlan); in macvtap_get_user()
840 vlan = rcu_dereference(q->vlan); in macvtap_get_user()
851 struct macvtap_queue *q = file->private_data; in macvtap_write_iter() local
853 return macvtap_get_user(q, NULL, from, file->f_flags & O_NONBLOCK); in macvtap_write_iter()
857 static ssize_t macvtap_put_user(struct macvtap_queue *q, in macvtap_put_user() argument
866 if (q->flags & IFF_VNET_HDR) { in macvtap_put_user()
868 vnet_hdr_len = q->vnet_hdr_sz; in macvtap_put_user()
872 macvtap_skb_to_vnet_hdr(q, skb, &vnet_hdr); in macvtap_put_user()
910 static ssize_t macvtap_do_read(struct macvtap_queue *q, in macvtap_do_read() argument
923 prepare_to_wait(sk_sleep(&q->sk), &wait, in macvtap_do_read()
927 skb = skb_dequeue(&q->sk.sk_receive_queue); in macvtap_do_read()
942 finish_wait(sk_sleep(&q->sk), &wait); in macvtap_do_read()
945 ret = macvtap_put_user(q, skb, to); in macvtap_do_read()
957 struct macvtap_queue *q = file->private_data; in macvtap_read_iter() local
960 ret = macvtap_do_read(q, to, file->f_flags & O_NONBLOCK); in macvtap_read_iter()
967 static struct macvlan_dev *macvtap_get_vlan(struct macvtap_queue *q) in macvtap_get_vlan() argument
972 vlan = rtnl_dereference(q->vlan); in macvtap_get_vlan()
986 struct macvtap_queue *q = file->private_data; in macvtap_ioctl_set_queue() local
990 vlan = macvtap_get_vlan(q); in macvtap_ioctl_set_queue()
995 ret = macvtap_enable_queue(vlan->dev, file, q); in macvtap_ioctl_set_queue()
997 ret = macvtap_disable_queue(q); in macvtap_ioctl_set_queue()
1005 static int set_offload(struct macvtap_queue *q, unsigned long arg) in set_offload() argument
1011 vlan = rtnl_dereference(q->vlan); in set_offload()
1062 struct macvtap_queue *q = file->private_data; in macvtap_ioctl() local
1083 q->flags = (q->flags & ~MACVTAP_FEATURES) | u; in macvtap_ioctl()
1089 vlan = macvtap_get_vlan(q); in macvtap_ioctl()
1096 u = q->flags; in macvtap_ioctl()
1121 q->sk.sk_sndbuf = s; in macvtap_ioctl()
1125 s = q->vnet_hdr_sz; in macvtap_ioctl()
1136 q->vnet_hdr_sz = s; in macvtap_ioctl()
1140 s = !!(q->flags & MACVTAP_VNET_LE); in macvtap_ioctl()
1149 q->flags |= MACVTAP_VNET_LE; in macvtap_ioctl()
1151 q->flags &= ~MACVTAP_VNET_LE; in macvtap_ioctl()
1155 return macvtap_get_vnet_be(q, sp); in macvtap_ioctl()
1158 return macvtap_set_vnet_be(q, sp); in macvtap_ioctl()
1167 ret = set_offload(q, arg); in macvtap_ioctl()
1173 vlan = macvtap_get_vlan(q); in macvtap_ioctl()
1192 vlan = macvtap_get_vlan(q); in macvtap_ioctl()
1232 struct macvtap_queue *q = container_of(sock, struct macvtap_queue, sock); in macvtap_sendmsg() local
1233 return macvtap_get_user(q, m, &m->msg_iter, m->msg_flags & MSG_DONTWAIT); in macvtap_sendmsg()
1239 struct macvtap_queue *q = container_of(sock, struct macvtap_queue, sock); in macvtap_recvmsg() local
1243 ret = macvtap_do_read(q, &m->msg_iter, flags & MSG_DONTWAIT); in macvtap_recvmsg()
1263 struct macvtap_queue *q; in macvtap_get_socket() local
1266 q = file->private_data; in macvtap_get_socket()
1267 if (!q) in macvtap_get_socket()
1269 return &q->sock; in macvtap_get_socket()