netvsc_drv.c revision 4d447c9a6ebc0142d320f075c5bac6d202a79fd4
1/* 2 * Copyright (c) 2009, Microsoft Corporation. 3 * 4 * This program is free software; you can redistribute it and/or modify it 5 * under the terms and conditions of the GNU General Public License, 6 * version 2, as published by the Free Software Foundation. 7 * 8 * This program is distributed in the hope it will be useful, but WITHOUT 9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * more details. 12 * 13 * You should have received a copy of the GNU General Public License along with 14 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple 15 * Place - Suite 330, Boston, MA 02111-1307 USA. 16 * 17 * Authors: 18 * Haiyang Zhang <haiyangz@microsoft.com> 19 * Hank Janssen <hjanssen@microsoft.com> 20 */ 21#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 22 23#include <linux/init.h> 24#include <linux/atomic.h> 25#include <linux/module.h> 26#include <linux/highmem.h> 27#include <linux/device.h> 28#include <linux/io.h> 29#include <linux/delay.h> 30#include <linux/netdevice.h> 31#include <linux/inetdevice.h> 32#include <linux/etherdevice.h> 33#include <linux/skbuff.h> 34#include <linux/in.h> 35#include <linux/slab.h> 36#include <net/arp.h> 37#include <net/route.h> 38#include <net/sock.h> 39#include <net/pkt_sched.h> 40 41#include "hyperv_net.h" 42 43struct net_device_context { 44 /* point back to our device context */ 45 struct hv_device *device_ctx; 46 struct delayed_work dwork; 47}; 48 49 50static int ring_size = 128; 51module_param(ring_size, int, S_IRUGO); 52MODULE_PARM_DESC(ring_size, "Ring buffer size (# of pages)"); 53 54struct set_multicast_work { 55 struct work_struct work; 56 struct net_device *net; 57}; 58 59static void do_set_multicast(struct work_struct *w) 60{ 61 struct set_multicast_work *swk = 62 container_of(w, struct set_multicast_work, work); 63 struct net_device *net = swk->net; 64 65 struct net_device_context *ndevctx = netdev_priv(net); 66 struct netvsc_device *nvdev; 67 struct rndis_device *rdev; 68 69 nvdev = hv_get_drvdata(ndevctx->device_ctx); 70 if (nvdev == NULL) 71 return; 72 73 rdev = nvdev->extension; 74 if (rdev == NULL) 75 return; 76 77 if (net->flags & IFF_PROMISC) 78 rndis_filter_set_packet_filter(rdev, 79 NDIS_PACKET_TYPE_PROMISCUOUS); 80 else 81 rndis_filter_set_packet_filter(rdev, 82 NDIS_PACKET_TYPE_BROADCAST | 83 NDIS_PACKET_TYPE_ALL_MULTICAST | 84 NDIS_PACKET_TYPE_DIRECTED); 85 86 kfree(w); 87} 88 89static void netvsc_set_multicast_list(struct net_device *net) 90{ 91 struct set_multicast_work *swk = 92 kmalloc(sizeof(struct set_multicast_work), GFP_ATOMIC); 93 if (swk == NULL) 94 return; 95 96 swk->net = net; 97 INIT_WORK(&swk->work, do_set_multicast); 98 schedule_work(&swk->work); 99} 100 101static int netvsc_open(struct net_device *net) 102{ 103 struct net_device_context *net_device_ctx = netdev_priv(net); 104 struct hv_device *device_obj = net_device_ctx->device_ctx; 105 int ret = 0; 106 107 /* Open up the device */ 108 ret = rndis_filter_open(device_obj); 109 if (ret != 0) { 110 netdev_err(net, "unable to open device (ret %d).\n", ret); 111 return ret; 112 } 113 114 netif_start_queue(net); 115 116 return ret; 117} 118 119static int netvsc_close(struct net_device *net) 120{ 121 struct net_device_context *net_device_ctx = netdev_priv(net); 122 struct hv_device *device_obj = net_device_ctx->device_ctx; 123 int ret; 124 125 netif_stop_queue(net); 126 127 ret = rndis_filter_close(device_obj); 128 if (ret != 0) 129 netdev_err(net, "unable to close device (ret %d).\n", ret); 130 131 return ret; 132} 133 134static void netvsc_xmit_completion(void *context) 135{ 136 struct hv_netvsc_packet *packet = (struct hv_netvsc_packet *)context; 137 struct sk_buff *skb = (struct sk_buff *) 138 (unsigned long)packet->completion.send.send_completion_tid; 139 140 kfree(packet); 141 142 if (skb) 143 dev_kfree_skb_any(skb); 144} 145 146static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net) 147{ 148 struct net_device_context *net_device_ctx = netdev_priv(net); 149 struct hv_netvsc_packet *packet; 150 int ret; 151 unsigned int i, num_pages, npg_data; 152 153 /* Add multipage for skb->data and additional one for RNDIS */ 154 npg_data = (((unsigned long)skb->data + skb_headlen(skb) - 1) 155 >> PAGE_SHIFT) - ((unsigned long)skb->data >> PAGE_SHIFT) + 1; 156 num_pages = skb_shinfo(skb)->nr_frags + npg_data + 1; 157 158 /* Allocate a netvsc packet based on # of frags. */ 159 packet = kzalloc(sizeof(struct hv_netvsc_packet) + 160 (num_pages * sizeof(struct hv_page_buffer)) + 161 sizeof(struct rndis_filter_packet), GFP_ATOMIC); 162 if (!packet) { 163 /* out of memory, drop packet */ 164 netdev_err(net, "unable to allocate hv_netvsc_packet\n"); 165 166 dev_kfree_skb(skb); 167 net->stats.tx_dropped++; 168 return NETDEV_TX_BUSY; 169 } 170 171 packet->extension = (void *)(unsigned long)packet + 172 sizeof(struct hv_netvsc_packet) + 173 (num_pages * sizeof(struct hv_page_buffer)); 174 175 /* Setup the rndis header */ 176 packet->page_buf_cnt = num_pages; 177 178 /* Initialize it from the skb */ 179 packet->total_data_buflen = skb->len; 180 181 /* Start filling in the page buffers starting after RNDIS buffer. */ 182 packet->page_buf[1].pfn = virt_to_phys(skb->data) >> PAGE_SHIFT; 183 packet->page_buf[1].offset 184 = (unsigned long)skb->data & (PAGE_SIZE - 1); 185 if (npg_data == 1) 186 packet->page_buf[1].len = skb_headlen(skb); 187 else 188 packet->page_buf[1].len = PAGE_SIZE 189 - packet->page_buf[1].offset; 190 191 for (i = 2; i <= npg_data; i++) { 192 packet->page_buf[i].pfn = virt_to_phys(skb->data 193 + PAGE_SIZE * (i-1)) >> PAGE_SHIFT; 194 packet->page_buf[i].offset = 0; 195 packet->page_buf[i].len = PAGE_SIZE; 196 } 197 if (npg_data > 1) 198 packet->page_buf[npg_data].len = (((unsigned long)skb->data 199 + skb_headlen(skb) - 1) & (PAGE_SIZE - 1)) + 1; 200 201 /* Additional fragments are after SKB data */ 202 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { 203 const skb_frag_t *f = &skb_shinfo(skb)->frags[i]; 204 205 packet->page_buf[i+npg_data+1].pfn = 206 page_to_pfn(skb_frag_page(f)); 207 packet->page_buf[i+npg_data+1].offset = f->page_offset; 208 packet->page_buf[i+npg_data+1].len = skb_frag_size(f); 209 } 210 211 /* Set the completion routine */ 212 packet->completion.send.send_completion = netvsc_xmit_completion; 213 packet->completion.send.send_completion_ctx = packet; 214 packet->completion.send.send_completion_tid = (unsigned long)skb; 215 216 ret = rndis_filter_send(net_device_ctx->device_ctx, 217 packet); 218 if (ret == 0) { 219 net->stats.tx_bytes += skb->len; 220 net->stats.tx_packets++; 221 } else { 222 /* we are shutting down or bus overloaded, just drop packet */ 223 net->stats.tx_dropped++; 224 kfree(packet); 225 dev_kfree_skb_any(skb); 226 } 227 228 return ret ? NETDEV_TX_BUSY : NETDEV_TX_OK; 229} 230 231/* 232 * netvsc_linkstatus_callback - Link up/down notification 233 */ 234void netvsc_linkstatus_callback(struct hv_device *device_obj, 235 unsigned int status) 236{ 237 struct net_device *net; 238 struct net_device_context *ndev_ctx; 239 struct netvsc_device *net_device; 240 241 net_device = hv_get_drvdata(device_obj); 242 net = net_device->ndev; 243 244 if (!net) { 245 netdev_err(net, "got link status but net device " 246 "not initialized yet\n"); 247 return; 248 } 249 250 if (status == 1) { 251 netif_carrier_on(net); 252 netif_wake_queue(net); 253 ndev_ctx = netdev_priv(net); 254 schedule_delayed_work(&ndev_ctx->dwork, 0); 255 schedule_delayed_work(&ndev_ctx->dwork, msecs_to_jiffies(20)); 256 } else { 257 netif_carrier_off(net); 258 netif_stop_queue(net); 259 } 260} 261 262/* 263 * netvsc_recv_callback - Callback when we receive a packet from the 264 * "wire" on the specified device. 265 */ 266int netvsc_recv_callback(struct hv_device *device_obj, 267 struct hv_netvsc_packet *packet) 268{ 269 struct net_device *net = dev_get_drvdata(&device_obj->device); 270 struct sk_buff *skb; 271 struct netvsc_device *net_device; 272 273 net_device = hv_get_drvdata(device_obj); 274 net = net_device->ndev; 275 276 if (!net) { 277 netdev_err(net, "got receive callback but net device" 278 " not initialized yet\n"); 279 return 0; 280 } 281 282 /* Allocate a skb - TODO direct I/O to pages? */ 283 skb = netdev_alloc_skb_ip_align(net, packet->total_data_buflen); 284 if (unlikely(!skb)) { 285 ++net->stats.rx_dropped; 286 return 0; 287 } 288 289 /* 290 * Copy to skb. This copy is needed here since the memory pointed by 291 * hv_netvsc_packet cannot be deallocated 292 */ 293 memcpy(skb_put(skb, packet->total_data_buflen), packet->data, 294 packet->total_data_buflen); 295 296 skb->protocol = eth_type_trans(skb, net); 297 skb->ip_summed = CHECKSUM_NONE; 298 299 net->stats.rx_packets++; 300 net->stats.rx_bytes += skb->len; 301 302 /* 303 * Pass the skb back up. Network stack will deallocate the skb when it 304 * is done. 305 * TODO - use NAPI? 306 */ 307 netif_rx(skb); 308 309 return 0; 310} 311 312static void netvsc_get_drvinfo(struct net_device *net, 313 struct ethtool_drvinfo *info) 314{ 315 strcpy(info->driver, "hv_netvsc"); 316 strcpy(info->version, HV_DRV_VERSION); 317 strcpy(info->fw_version, "N/A"); 318} 319 320static int netvsc_change_mtu(struct net_device *ndev, int mtu) 321{ 322 struct net_device_context *ndevctx = netdev_priv(ndev); 323 struct hv_device *hdev = ndevctx->device_ctx; 324 struct netvsc_device *nvdev = hv_get_drvdata(hdev); 325 struct netvsc_device_info device_info; 326 int limit = ETH_DATA_LEN; 327 328 if (nvdev == NULL || nvdev->destroy) 329 return -ENODEV; 330 331 if (nvdev->nvsp_version == NVSP_PROTOCOL_VERSION_2) 332 limit = NETVSC_MTU; 333 334 if (mtu < 68 || mtu > limit) 335 return -EINVAL; 336 337 nvdev->start_remove = true; 338 cancel_delayed_work_sync(&ndevctx->dwork); 339 netif_stop_queue(ndev); 340 rndis_filter_device_remove(hdev); 341 342 ndev->mtu = mtu; 343 344 ndevctx->device_ctx = hdev; 345 hv_set_drvdata(hdev, ndev); 346 device_info.ring_size = ring_size; 347 rndis_filter_device_add(hdev, &device_info); 348 netif_wake_queue(ndev); 349 350 return 0; 351} 352 353static const struct ethtool_ops ethtool_ops = { 354 .get_drvinfo = netvsc_get_drvinfo, 355 .get_link = ethtool_op_get_link, 356}; 357 358static const struct net_device_ops device_ops = { 359 .ndo_open = netvsc_open, 360 .ndo_stop = netvsc_close, 361 .ndo_start_xmit = netvsc_start_xmit, 362 .ndo_set_rx_mode = netvsc_set_multicast_list, 363 .ndo_change_mtu = netvsc_change_mtu, 364 .ndo_validate_addr = eth_validate_addr, 365 .ndo_set_mac_address = eth_mac_addr, 366}; 367 368/* 369 * Send GARP packet to network peers after migrations. 370 * After Quick Migration, the network is not immediately operational in the 371 * current context when receiving RNDIS_STATUS_MEDIA_CONNECT event. So, add 372 * another netif_notify_peers() into a delayed work, otherwise GARP packet 373 * will not be sent after quick migration, and cause network disconnection. 374 */ 375static void netvsc_send_garp(struct work_struct *w) 376{ 377 struct net_device_context *ndev_ctx; 378 struct net_device *net; 379 struct netvsc_device *net_device; 380 381 ndev_ctx = container_of(w, struct net_device_context, dwork.work); 382 net_device = hv_get_drvdata(ndev_ctx->device_ctx); 383 net = net_device->ndev; 384 netif_notify_peers(net); 385} 386 387 388static int netvsc_probe(struct hv_device *dev, 389 const struct hv_vmbus_device_id *dev_id) 390{ 391 struct net_device *net = NULL; 392 struct net_device_context *net_device_ctx; 393 struct netvsc_device_info device_info; 394 int ret; 395 396 net = alloc_etherdev(sizeof(struct net_device_context)); 397 if (!net) 398 return -ENOMEM; 399 400 /* Set initial state */ 401 netif_carrier_off(net); 402 403 net_device_ctx = netdev_priv(net); 404 net_device_ctx->device_ctx = dev; 405 hv_set_drvdata(dev, net); 406 INIT_DELAYED_WORK(&net_device_ctx->dwork, netvsc_send_garp); 407 408 net->netdev_ops = &device_ops; 409 410 /* TODO: Add GSO and Checksum offload */ 411 net->hw_features = NETIF_F_SG; 412 net->features = NETIF_F_SG; 413 414 SET_ETHTOOL_OPS(net, ðtool_ops); 415 SET_NETDEV_DEV(net, &dev->device); 416 417 ret = register_netdev(net); 418 if (ret != 0) { 419 pr_err("Unable to register netdev.\n"); 420 free_netdev(net); 421 goto out; 422 } 423 424 /* Notify the netvsc driver of the new device */ 425 device_info.ring_size = ring_size; 426 ret = rndis_filter_device_add(dev, &device_info); 427 if (ret != 0) { 428 netdev_err(net, "unable to add netvsc device (ret %d)\n", ret); 429 unregister_netdev(net); 430 free_netdev(net); 431 hv_set_drvdata(dev, NULL); 432 return ret; 433 } 434 memcpy(net->dev_addr, device_info.mac_adr, ETH_ALEN); 435 436 netif_carrier_on(net); 437 438out: 439 return ret; 440} 441 442static int netvsc_remove(struct hv_device *dev) 443{ 444 struct net_device *net; 445 struct net_device_context *ndev_ctx; 446 struct netvsc_device *net_device; 447 448 net_device = hv_get_drvdata(dev); 449 net = net_device->ndev; 450 451 if (net == NULL) { 452 dev_err(&dev->device, "No net device to remove\n"); 453 return 0; 454 } 455 456 net_device->start_remove = true; 457 458 ndev_ctx = netdev_priv(net); 459 cancel_delayed_work_sync(&ndev_ctx->dwork); 460 461 /* Stop outbound asap */ 462 netif_stop_queue(net); 463 464 unregister_netdev(net); 465 466 /* 467 * Call to the vsc driver to let it know that the device is being 468 * removed 469 */ 470 rndis_filter_device_remove(dev); 471 472 free_netdev(net); 473 return 0; 474} 475 476static const struct hv_vmbus_device_id id_table[] = { 477 /* Network guid */ 478 { VMBUS_DEVICE(0x63, 0x51, 0x61, 0xF8, 0x3E, 0xDF, 0xc5, 0x46, 479 0x91, 0x3F, 0xF2, 0xD2, 0xF9, 0x65, 0xED, 0x0E) }, 480 { }, 481}; 482 483MODULE_DEVICE_TABLE(vmbus, id_table); 484 485/* The one and only one */ 486static struct hv_driver netvsc_drv = { 487 .name = "netvsc", 488 .id_table = id_table, 489 .probe = netvsc_probe, 490 .remove = netvsc_remove, 491}; 492 493static void __exit netvsc_drv_exit(void) 494{ 495 vmbus_driver_unregister(&netvsc_drv); 496} 497 498static int __init netvsc_drv_init(void) 499{ 500 return vmbus_driver_register(&netvsc_drv); 501} 502 503MODULE_LICENSE("GPL"); 504MODULE_VERSION(HV_DRV_VERSION); 505MODULE_DESCRIPTION("Microsoft Hyper-V network driver"); 506 507module_init(netvsc_drv_init); 508module_exit(netvsc_drv_exit); 509