Lines Matching defs:tap

97 	.name = "tap",
144 static int tap_enable_queue(struct tap_dev *tap, struct file *file,
155 rcu_assign_pointer(tap->taps[tap->numvtaps], q);
156 q->queue_index = tap->numvtaps;
159 tap->numvtaps++;
165 static int tap_set_queue(struct tap_dev *tap, struct file *file,
168 if (tap->numqueues == MAX_TAP_QUEUES)
171 rcu_assign_pointer(q->tap, tap);
172 rcu_assign_pointer(tap->taps[tap->numvtaps], q);
176 q->queue_index = tap->numvtaps;
179 list_add_tail(&q->next, &tap->queue_list);
181 tap->numvtaps++;
182 tap->numqueues++;
189 struct tap_dev *tap;
196 tap = rtnl_dereference(q->tap);
198 if (tap) {
200 BUG_ON(index >= tap->numvtaps);
201 nq = rtnl_dereference(tap->taps[tap->numvtaps - 1]);
204 rcu_assign_pointer(tap->taps[index], nq);
205 RCU_INIT_POINTER(tap->taps[tap->numvtaps - 1], NULL);
208 tap->numvtaps--;
224 struct tap_dev *tap;
227 tap = rtnl_dereference(q->tap);
229 if (tap) {
233 tap->numqueues--;
234 RCU_INIT_POINTER(q->tap, NULL);
252 static struct tap_queue *tap_get_queue(struct tap_dev *tap,
261 int numvtaps = READ_ONCE(tap->numvtaps);
273 queue = rcu_dereference(tap->taps[rxq % numvtaps]);
283 queue = rcu_dereference(tap->taps[rxq]);
288 queue = rcu_dereference(tap->taps[0]);
298 void tap_del_queues(struct tap_dev *tap)
303 list_for_each_entry_safe(q, tmp, &tap->queue_list, next) {
305 RCU_INIT_POINTER(q->tap, NULL);
307 tap->numvtaps--;
308 tap->numqueues--;
311 BUG_ON(tap->numvtaps);
312 BUG_ON(tap->numqueues);
314 tap->numvtaps = MAX_TAP_QUEUES;
322 struct tap_dev *tap;
326 tap = tap_dev_get_rcu(dev);
327 if (!tap)
330 q = tap_get_queue(tap, skb);
341 features |= tap->tap_features;
365 /* If we receive a partial checksum and the tap side
384 if (tap->count_rx_dropped)
385 tap->count_rx_dropped(tap);
403 int tap_get_minor(dev_t major, struct tap_dev *tap)
416 retval = idr_alloc(&tap_major->minor_idr, tap, 1, TAP_NUM_DEVS, GFP_ATOMIC);
418 tap->minor = retval;
420 netdev_err(tap->dev, "Too many tap devices\n");
431 void tap_free_minor(dev_t major, struct tap_dev *tap)
442 if (tap->minor) {
443 idr_remove(&tap_major->minor_idr, tap->minor);
444 tap->minor = 0;
456 struct tap_dev *tap;
462 tap = NULL;
467 tap = idr_find(&tap_major->minor_idr, minor);
468 if (tap) {
469 dev = tap->dev;
476 return tap;
502 struct tap_dev *tap;
507 tap = dev_get_by_tap_file(imajor(inode), iminor(inode));
508 if (!tap)
516 if (ptr_ring_init(&q->ring, tap->dev->tx_queue_len, GFP_KERNEL)) {
533 * so far only KVM virtio_net uses tap, enable zero copy between
539 if ((tap->dev->features & NETIF_F_HIGHDMA) && (tap->dev->features & NETIF_F_SG))
542 err = tap_set_queue(tap, file, q);
548 dev_put(tap->dev);
556 if (tap)
557 dev_put(tap->dev);
625 struct tap_dev *tap;
721 tap = rcu_dereference(q->tap);
732 if (tap) {
733 skb->dev = tap->dev;
747 tap = rcu_dereference(q->tap);
748 if (tap && tap->count_tx_dropped)
749 tap->count_tx_dropped(tap);
886 struct tap_dev *tap;
889 tap = rtnl_dereference(q->tap);
890 if (tap)
891 dev_hold(tap->dev);
893 return tap;
896 static void tap_put_tap_dev(struct tap_dev *tap)
898 dev_put(tap->dev);
904 struct tap_dev *tap;
907 tap = tap_get_tap_dev(q);
908 if (!tap)
912 ret = tap_enable_queue(tap, file, q);
918 tap_put_tap_dev(tap);
924 struct tap_dev *tap;
928 tap = rtnl_dereference(q->tap);
929 if (!tap)
932 features = tap->dev->features;
947 /* tun/tap driver inverts the usage for TSO offloads, where
951 * For tap, we have to invert it to mean the same thing.
960 /* tap_features are the same as features on tun/tap and
963 tap->tap_features = feature_mask;
964 if (tap->update_features)
965 tap->update_features(tap, features);
971 * provide compatibility with generic tun/tap interface
977 struct tap_dev *tap;
1003 tap = tap_get_tap_dev(q);
1004 if (!tap) {
1011 if (copy_to_user(&ifr->ifr_name, tap->dev->name, IFNAMSIZ) ||
1014 tap_put_tap_dev(tap);
1089 tap = tap_get_tap_dev(q);
1090 if (!tap) {
1095 dev_get_mac_address(&sa, dev_net(tap->dev), tap->dev->name);
1096 if (copy_to_user(&ifr->ifr_name, tap->dev->name, IFNAMSIZ) ||
1099 tap_put_tap_dev(tap);
1107 tap = tap_get_tap_dev(q);
1108 if (!tap) {
1112 ret = dev_set_mac_address_user(tap->dev, &sa, NULL);
1113 tap_put_tap_dev(tap);
1140 struct tap_dev *tap;
1177 tap = rcu_dereference(q->tap);
1178 if (tap) {
1179 skb->dev = tap->dev;
1193 tap = rcu_dereference(q->tap);
1194 if (tap && tap->count_tx_dropped)
1195 tap->count_tx_dropped(tap);
1282 int tap_queue_resize(struct tap_dev *tap)
1284 struct net_device *dev = tap->dev;
1287 int n = tap->numqueues;
1294 list_for_each_entry(q, &tap->queue_list, next)