aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2013-12-10 22:10:21 -0500
committerDavid S. Miller <davem@davemloft.net>2013-12-10 22:10:21 -0500
commitbbd37626e6be9500e74aa244a3be1a69b6645ea0 (patch)
treee1979b61467a70f0c58e47d3a3f14d99602db526
parent730054da3868c35809fd31a4018044ab10b0e215 (diff)
net: Revert macvtap/tun truncation signalling changes.
Jason Wang and Michael S. Tsirkin are still discussing how to properly fix this. Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/macvtap.c27
-rw-r--r--drivers/net/tun.c23
2 files changed, 24 insertions, 26 deletions
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c
index 7544a0c686b4..957cc5c3653d 100644
--- a/drivers/net/macvtap.c
+++ b/drivers/net/macvtap.c
@@ -767,14 +767,10 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,
767 const struct sk_buff *skb, 767 const struct sk_buff *skb,
768 const struct iovec *iv, int len) 768 const struct iovec *iv, int len)
769{ 769{
770 int ret, off; 770 int ret;
771 int vnet_hdr_len = 0; 771 int vnet_hdr_len = 0;
772 int vlan_offset = 0; 772 int vlan_offset = 0;
773 int copied; 773 int copied;
774 struct {
775 __be16 h_vlan_proto;
776 __be16 h_vlan_TCI;
777 } veth;
778 774
779 if (q->flags & IFF_VNET_HDR) { 775 if (q->flags & IFF_VNET_HDR) {
780 struct virtio_net_hdr vnet_hdr; 776 struct virtio_net_hdr vnet_hdr;
@@ -789,13 +785,16 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,
789 if (memcpy_toiovecend(iv, (void *)&vnet_hdr, 0, sizeof(vnet_hdr))) 785 if (memcpy_toiovecend(iv, (void *)&vnet_hdr, 0, sizeof(vnet_hdr)))
790 return -EFAULT; 786 return -EFAULT;
791 } 787 }
792 off = copied = vnet_hdr_len; 788 copied = vnet_hdr_len;
793 789
794 if (!vlan_tx_tag_present(skb)) 790 if (!vlan_tx_tag_present(skb))
795 len = min_t(int, skb->len, len); 791 len = min_t(int, skb->len, len);
796 else { 792 else {
797 int copy; 793 int copy;
798 794 struct {
795 __be16 h_vlan_proto;
796 __be16 h_vlan_TCI;
797 } veth;
799 veth.h_vlan_proto = skb->vlan_proto; 798 veth.h_vlan_proto = skb->vlan_proto;
800 veth.h_vlan_TCI = htons(vlan_tx_tag_get(skb)); 799 veth.h_vlan_TCI = htons(vlan_tx_tag_get(skb));
801 800
@@ -803,22 +802,22 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,
803 len = min_t(int, skb->len + VLAN_HLEN, len); 802 len = min_t(int, skb->len + VLAN_HLEN, len);
804 803
805 copy = min_t(int, vlan_offset, len); 804 copy = min_t(int, vlan_offset, len);
806 ret = skb_copy_datagram_const_iovec(skb, 0, iv, off, copy); 805 ret = skb_copy_datagram_const_iovec(skb, 0, iv, copied, copy);
807 len -= copy; 806 len -= copy;
808 off += copy; 807 copied += copy;
809 if (ret || !len) 808 if (ret || !len)
810 goto done; 809 goto done;
811 810
812 copy = min_t(int, sizeof(veth), len); 811 copy = min_t(int, sizeof(veth), len);
813 ret = memcpy_toiovecend(iv, (void *)&veth, off, copy); 812 ret = memcpy_toiovecend(iv, (void *)&veth, copied, copy);
814 len -= copy; 813 len -= copy;
815 off += copy; 814 copied += copy;
816 if (ret || !len) 815 if (ret || !len)
817 goto done; 816 goto done;
818 } 817 }
819 818
820 ret = skb_copy_datagram_const_iovec(skb, vlan_offset, iv, off, len); 819 ret = skb_copy_datagram_const_iovec(skb, vlan_offset, iv, copied, len);
821 copied += skb->len + (vlan_offset ? sizeof(veth) : 0); 820 copied += len;
822 821
823done: 822done:
824 return ret ? ret : copied; 823 return ret ? ret : copied;
@@ -876,7 +875,7 @@ static ssize_t macvtap_aio_read(struct kiocb *iocb, const struct iovec *iv,
876 } 875 }
877 876
878 ret = macvtap_do_read(q, iocb, iv, len, file->f_flags & O_NONBLOCK); 877 ret = macvtap_do_read(q, iocb, iv, len, file->f_flags & O_NONBLOCK);
879 ret = min_t(ssize_t, ret, len); 878 ret = min_t(ssize_t, ret, len); /* XXX copied from tun.c. Why? */
880 if (ret > 0) 879 if (ret > 0)
881 iocb->ki_pos = ret; 880 iocb->ki_pos = ret;
882out: 881out:
diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index dd1bd7aedc3c..e26cbea1ce68 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -1183,11 +1183,7 @@ static ssize_t tun_put_user(struct tun_struct *tun,
1183 const struct iovec *iv, int len) 1183 const struct iovec *iv, int len)
1184{ 1184{
1185 struct tun_pi pi = { 0, skb->protocol }; 1185 struct tun_pi pi = { 0, skb->protocol };
1186 struct { 1186 ssize_t total = 0;
1187 __be16 h_vlan_proto;
1188 __be16 h_vlan_TCI;
1189 } veth;
1190 ssize_t total = 0, off = 0;
1191 int vlan_offset = 0; 1187 int vlan_offset = 0;
1192 1188
1193 if (!(tun->flags & TUN_NO_PI)) { 1189 if (!(tun->flags & TUN_NO_PI)) {
@@ -1252,11 +1248,14 @@ static ssize_t tun_put_user(struct tun_struct *tun,
1252 total += tun->vnet_hdr_sz; 1248 total += tun->vnet_hdr_sz;
1253 } 1249 }
1254 1250
1255 off = total;
1256 if (!vlan_tx_tag_present(skb)) { 1251 if (!vlan_tx_tag_present(skb)) {
1257 len = min_t(int, skb->len, len); 1252 len = min_t(int, skb->len, len);
1258 } else { 1253 } else {
1259 int copy, ret; 1254 int copy, ret;
1255 struct {
1256 __be16 h_vlan_proto;
1257 __be16 h_vlan_TCI;
1258 } veth;
1260 1259
1261 veth.h_vlan_proto = skb->vlan_proto; 1260 veth.h_vlan_proto = skb->vlan_proto;
1262 veth.h_vlan_TCI = htons(vlan_tx_tag_get(skb)); 1261 veth.h_vlan_TCI = htons(vlan_tx_tag_get(skb));
@@ -1265,22 +1264,22 @@ static ssize_t tun_put_user(struct tun_struct *tun,
1265 len = min_t(int, skb->len + VLAN_HLEN, len); 1264 len = min_t(int, skb->len + VLAN_HLEN, len);
1266 1265
1267 copy = min_t(int, vlan_offset, len); 1266 copy = min_t(int, vlan_offset, len);
1268 ret = skb_copy_datagram_const_iovec(skb, 0, iv, off, copy); 1267 ret = skb_copy_datagram_const_iovec(skb, 0, iv, total, copy);
1269 len -= copy; 1268 len -= copy;
1270 off += copy; 1269 total += copy;
1271 if (ret || !len) 1270 if (ret || !len)
1272 goto done; 1271 goto done;
1273 1272
1274 copy = min_t(int, sizeof(veth), len); 1273 copy = min_t(int, sizeof(veth), len);
1275 ret = memcpy_toiovecend(iv, (void *)&veth, off, copy); 1274 ret = memcpy_toiovecend(iv, (void *)&veth, total, copy);
1276 len -= copy; 1275 len -= copy;
1277 off += copy; 1276 total += copy;
1278 if (ret || !len) 1277 if (ret || !len)
1279 goto done; 1278 goto done;
1280 } 1279 }
1281 1280
1282 skb_copy_datagram_const_iovec(skb, vlan_offset, iv, off, len); 1281 skb_copy_datagram_const_iovec(skb, vlan_offset, iv, total, len);
1283 total += skb->len + (vlan_offset ? sizeof(veth) : 0); 1282 total += len;
1284 1283
1285done: 1284done:
1286 tun->dev->stats.tx_packets++; 1285 tun->dev->stats.tx_packets++;