1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright(c) 2010-2014 Intel Corporation. 4 */ 5 6 /* 7 * This code is inspired from the book "Linux Device Drivers" by 8 * Alessandro Rubini and Jonathan Corbet, published by O'Reilly & Associates 9 */ 10 11 #include <linux/device.h> 12 #include <linux/module.h> 13 #include <linux/version.h> 14 #include <linux/netdevice.h> 15 #include <linux/etherdevice.h> /* eth_type_trans */ 16 #include <linux/skbuff.h> 17 #include <linux/kthread.h> 18 #include <linux/delay.h> 19 20 #include <exec-env/rte_kni_common.h> 21 #include <kni_fifo.h> 22 23 #include "compat.h" 24 #include "kni_dev.h" 25 26 #define WD_TIMEOUT 5 /*jiffies */ 27 28 #define KNI_WAIT_RESPONSE_TIMEOUT 300 /* 3 seconds */ 29 30 /* typedef for rx function */ 31 typedef void (*kni_net_rx_t)(struct kni_dev *kni); 32 33 static void kni_net_rx_normal(struct kni_dev *kni); 34 35 /* kni rx function pointer, with default to normal rx */ 36 static kni_net_rx_t kni_net_rx_func = kni_net_rx_normal; 37 38 /* physical address to kernel virtual address */ 39 static void * 40 pa2kva(void *pa) 41 { 42 return phys_to_virt((unsigned long)pa); 43 } 44 45 /* physical address to virtual address */ 46 static void * 47 pa2va(void *pa, struct rte_kni_mbuf *m) 48 { 49 void *va; 50 51 va = (void *)((unsigned long)pa + 52 (unsigned long)m->buf_addr - 53 (unsigned long)m->buf_physaddr); 54 return va; 55 } 56 57 /* mbuf data kernel virtual address from mbuf kernel virtual address */ 58 static void * 59 kva2data_kva(struct rte_kni_mbuf *m) 60 { 61 return phys_to_virt(m->buf_physaddr + m->data_off); 62 } 63 64 /* virtual address to physical address */ 65 static void * 66 va2pa(void *va, struct rte_kni_mbuf *m) 67 { 68 void *pa; 69 70 pa = (void *)((unsigned long)va - 71 ((unsigned long)m->buf_addr - 72 (unsigned long)m->buf_physaddr)); 73 return pa; 74 } 75 76 /* 77 * It can be called to process the request. 78 */ 79 static int 80 kni_net_process_request(struct kni_dev *kni, struct rte_kni_request *req) 81 { 82 int ret = -1; 83 void *resp_va; 84 uint32_t num; 85 int ret_val; 86 87 if (!kni || !req) { 88 pr_err("No kni instance or request\n"); 89 return -EINVAL; 90 } 91 92 mutex_lock(&kni->sync_lock); 93 94 /* Construct data */ 95 memcpy(kni->sync_kva, req, sizeof(struct rte_kni_request)); 96 num = kni_fifo_put(kni->req_q, &kni->sync_va, 1); 97 if (num < 1) { 98 pr_err("Cannot send to req_q\n"); 99 ret = -EBUSY; 100 goto fail; 101 } 102 103 ret_val = wait_event_interruptible_timeout(kni->wq, 104 kni_fifo_count(kni->resp_q), 3 * HZ); 105 if (signal_pending(current) || ret_val <= 0) { 106 ret = -ETIME; 107 goto fail; 108 } 109 num = kni_fifo_get(kni->resp_q, (void **)&resp_va, 1); 110 if (num != 1 || resp_va != kni->sync_va) { 111 /* This should never happen */ 112 pr_err("No data in resp_q\n"); 113 ret = -ENODATA; 114 goto fail; 115 } 116 117 memcpy(req, kni->sync_kva, sizeof(struct rte_kni_request)); 118 ret = 0; 119 120 fail: 121 mutex_unlock(&kni->sync_lock); 122 return ret; 123 } 124 125 /* 126 * Open and close 127 */ 128 static int 129 kni_net_open(struct net_device *dev) 130 { 131 int ret; 132 struct rte_kni_request req; 133 struct kni_dev *kni = netdev_priv(dev); 134 135 netif_start_queue(dev); 136 137 memset(&req, 0, sizeof(req)); 138 req.req_id = RTE_KNI_REQ_CFG_NETWORK_IF; 139 140 /* Setting if_up to non-zero means up */ 141 req.if_up = 1; 142 ret = kni_net_process_request(kni, &req); 143 144 return (ret == 0) ? req.result : ret; 145 } 146 147 static int 148 kni_net_release(struct net_device *dev) 149 { 150 int ret; 151 struct rte_kni_request req; 152 struct kni_dev *kni = netdev_priv(dev); 153 154 netif_stop_queue(dev); /* can't transmit any more */ 155 156 memset(&req, 0, sizeof(req)); 157 req.req_id = RTE_KNI_REQ_CFG_NETWORK_IF; 158 159 /* Setting if_up to 0 means down */ 160 req.if_up = 0; 161 ret = kni_net_process_request(kni, &req); 162 163 return (ret == 0) ? req.result : ret; 164 } 165 166 /* 167 * Configuration changes (passed on by ifconfig) 168 */ 169 static int 170 kni_net_config(struct net_device *dev, struct ifmap *map) 171 { 172 if (dev->flags & IFF_UP) /* can't act on a running interface */ 173 return -EBUSY; 174 175 /* ignore other fields */ 176 return 0; 177 } 178 179 /* 180 * Transmit a packet (called by the kernel) 181 */ 182 static int 183 kni_net_tx(struct sk_buff *skb, struct net_device *dev) 184 { 185 int len = 0; 186 uint32_t ret; 187 struct kni_dev *kni = netdev_priv(dev); 188 struct rte_kni_mbuf *pkt_kva = NULL; 189 void *pkt_pa = NULL; 190 void *pkt_va = NULL; 191 192 /* save the timestamp */ 193 #ifdef HAVE_TRANS_START_HELPER 194 netif_trans_update(dev); 195 #else 196 dev->trans_start = jiffies; 197 #endif 198 199 /* Check if the length of skb is less than mbuf size */ 200 if (skb->len > kni->mbuf_size) 201 goto drop; 202 203 /** 204 * Check if it has at least one free entry in tx_q and 205 * one entry in alloc_q. 206 */ 207 if (kni_fifo_free_count(kni->tx_q) == 0 || 208 kni_fifo_count(kni->alloc_q) == 0) { 209 /** 210 * If no free entry in tx_q or no entry in alloc_q, 211 * drops skb and goes out. 212 */ 213 goto drop; 214 } 215 216 /* dequeue a mbuf from alloc_q */ 217 ret = kni_fifo_get(kni->alloc_q, &pkt_pa, 1); 218 if (likely(ret == 1)) { 219 void *data_kva; 220 221 pkt_kva = pa2kva(pkt_pa); 222 data_kva = kva2data_kva(pkt_kva); 223 pkt_va = pa2va(pkt_pa, pkt_kva); 224 225 len = skb->len; 226 memcpy(data_kva, skb->data, len); 227 if (unlikely(len < ETH_ZLEN)) { 228 memset(data_kva + len, 0, ETH_ZLEN - len); 229 len = ETH_ZLEN; 230 } 231 pkt_kva->pkt_len = len; 232 pkt_kva->data_len = len; 233 234 /* enqueue mbuf into tx_q */ 235 ret = kni_fifo_put(kni->tx_q, &pkt_va, 1); 236 if (unlikely(ret != 1)) { 237 /* Failing should not happen */ 238 pr_err("Fail to enqueue mbuf into tx_q\n"); 239 goto drop; 240 } 241 } else { 242 /* Failing should not happen */ 243 pr_err("Fail to dequeue mbuf from alloc_q\n"); 244 goto drop; 245 } 246 247 /* Free skb and update statistics */ 248 dev_kfree_skb(skb); 249 kni->stats.tx_bytes += len; 250 kni->stats.tx_packets++; 251 252 return NETDEV_TX_OK; 253 254 drop: 255 /* Free skb and update statistics */ 256 dev_kfree_skb(skb); 257 kni->stats.tx_dropped++; 258 259 return NETDEV_TX_OK; 260 } 261 262 /* 263 * RX: normal working mode 264 */ 265 static void 266 kni_net_rx_normal(struct kni_dev *kni) 267 { 268 uint32_t ret; 269 uint32_t len; 270 uint32_t i, num_rx, num_fq; 271 struct rte_kni_mbuf *kva; 272 void *data_kva; 273 struct sk_buff *skb; 274 struct net_device *dev = kni->net_dev; 275 276 /* Get the number of free entries in free_q */ 277 num_fq = kni_fifo_free_count(kni->free_q); 278 if (num_fq == 0) { 279 /* No room on the free_q, bail out */ 280 return; 281 } 282 283 /* Calculate the number of entries to dequeue from rx_q */ 284 num_rx = min_t(uint32_t, num_fq, MBUF_BURST_SZ); 285 286 /* Burst dequeue from rx_q */ 287 num_rx = kni_fifo_get(kni->rx_q, kni->pa, num_rx); 288 if (num_rx == 0) 289 return; 290 291 /* Transfer received packets to netif */ 292 for (i = 0; i < num_rx; i++) { 293 kva = pa2kva(kni->pa[i]); 294 len = kva->pkt_len; 295 data_kva = kva2data_kva(kva); 296 kni->va[i] = pa2va(kni->pa[i], kva); 297 298 skb = dev_alloc_skb(len + 2); 299 if (!skb) { 300 /* Update statistics */ 301 kni->stats.rx_dropped++; 302 continue; 303 } 304 305 /* Align IP on 16B boundary */ 306 skb_reserve(skb, 2); 307 308 if (kva->nb_segs == 1) { 309 memcpy(skb_put(skb, len), data_kva, len); 310 } else { 311 int nb_segs; 312 int kva_nb_segs = kva->nb_segs; 313 314 for (nb_segs = 0; nb_segs < kva_nb_segs; nb_segs++) { 315 memcpy(skb_put(skb, kva->data_len), 316 data_kva, kva->data_len); 317 318 if (!kva->next) 319 break; 320 321 kva = pa2kva(va2pa(kva->next, kva)); 322 data_kva = kva2data_kva(kva); 323 } 324 } 325 326 skb->dev = dev; 327 skb->protocol = eth_type_trans(skb, dev); 328 skb->ip_summed = CHECKSUM_UNNECESSARY; 329 330 /* Call netif interface */ 331 netif_rx_ni(skb); 332 333 /* Update statistics */ 334 kni->stats.rx_bytes += len; 335 kni->stats.rx_packets++; 336 } 337 338 /* Burst enqueue mbufs into free_q */ 339 ret = kni_fifo_put(kni->free_q, kni->va, num_rx); 340 if (ret != num_rx) 341 /* Failing should not happen */ 342 pr_err("Fail to enqueue entries into free_q\n"); 343 } 344 345 /* 346 * RX: loopback with enqueue/dequeue fifos. 347 */ 348 static void 349 kni_net_rx_lo_fifo(struct kni_dev *kni) 350 { 351 uint32_t ret; 352 uint32_t len; 353 uint32_t i, num, num_rq, num_tq, num_aq, num_fq; 354 struct rte_kni_mbuf *kva; 355 void *data_kva; 356 struct rte_kni_mbuf *alloc_kva; 357 void *alloc_data_kva; 358 359 /* Get the number of entries in rx_q */ 360 num_rq = kni_fifo_count(kni->rx_q); 361 362 /* Get the number of free entrie in tx_q */ 363 num_tq = kni_fifo_free_count(kni->tx_q); 364 365 /* Get the number of entries in alloc_q */ 366 num_aq = kni_fifo_count(kni->alloc_q); 367 368 /* Get the number of free entries in free_q */ 369 num_fq = kni_fifo_free_count(kni->free_q); 370 371 /* Calculate the number of entries to be dequeued from rx_q */ 372 num = min(num_rq, num_tq); 373 num = min(num, num_aq); 374 num = min(num, num_fq); 375 num = min_t(uint32_t, num, MBUF_BURST_SZ); 376 377 /* Return if no entry to dequeue from rx_q */ 378 if (num == 0) 379 return; 380 381 /* Burst dequeue from rx_q */ 382 ret = kni_fifo_get(kni->rx_q, kni->pa, num); 383 if (ret == 0) 384 return; /* Failing should not happen */ 385 386 /* Dequeue entries from alloc_q */ 387 ret = kni_fifo_get(kni->alloc_q, kni->alloc_pa, num); 388 if (ret) { 389 num = ret; 390 /* Copy mbufs */ 391 for (i = 0; i < num; i++) { 392 kva = pa2kva(kni->pa[i]); 393 len = kva->pkt_len; 394 data_kva = kva2data_kva(kva); 395 kni->va[i] = pa2va(kni->pa[i], kva); 396 397 alloc_kva = pa2kva(kni->alloc_pa[i]); 398 alloc_data_kva = kva2data_kva(alloc_kva); 399 kni->alloc_va[i] = pa2va(kni->alloc_pa[i], alloc_kva); 400 401 memcpy(alloc_data_kva, data_kva, len); 402 alloc_kva->pkt_len = len; 403 alloc_kva->data_len = len; 404 405 kni->stats.tx_bytes += len; 406 kni->stats.rx_bytes += len; 407 } 408 409 /* Burst enqueue mbufs into tx_q */ 410 ret = kni_fifo_put(kni->tx_q, kni->alloc_va, num); 411 if (ret != num) 412 /* Failing should not happen */ 413 pr_err("Fail to enqueue mbufs into tx_q\n"); 414 } 415 416 /* Burst enqueue mbufs into free_q */ 417 ret = kni_fifo_put(kni->free_q, kni->va, num); 418 if (ret != num) 419 /* Failing should not happen */ 420 pr_err("Fail to enqueue mbufs into free_q\n"); 421 422 /** 423 * Update statistic, and enqueue/dequeue failure is impossible, 424 * as all queues are checked at first. 425 */ 426 kni->stats.tx_packets += num; 427 kni->stats.rx_packets += num; 428 } 429 430 /* 431 * RX: loopback with enqueue/dequeue fifos and sk buffer copies. 432 */ 433 static void 434 kni_net_rx_lo_fifo_skb(struct kni_dev *kni) 435 { 436 uint32_t ret; 437 uint32_t len; 438 uint32_t i, num_rq, num_fq, num; 439 struct rte_kni_mbuf *kva; 440 void *data_kva; 441 struct sk_buff *skb; 442 struct net_device *dev = kni->net_dev; 443 444 /* Get the number of entries in rx_q */ 445 num_rq = kni_fifo_count(kni->rx_q); 446 447 /* Get the number of free entries in free_q */ 448 num_fq = kni_fifo_free_count(kni->free_q); 449 450 /* Calculate the number of entries to dequeue from rx_q */ 451 num = min(num_rq, num_fq); 452 num = min_t(uint32_t, num, MBUF_BURST_SZ); 453 454 /* Return if no entry to dequeue from rx_q */ 455 if (num == 0) 456 return; 457 458 /* Burst dequeue mbufs from rx_q */ 459 ret = kni_fifo_get(kni->rx_q, kni->pa, num); 460 if (ret == 0) 461 return; 462 463 /* Copy mbufs to sk buffer and then call tx interface */ 464 for (i = 0; i < num; i++) { 465 kva = pa2kva(kni->pa[i]); 466 len = kva->pkt_len; 467 data_kva = kva2data_kva(kva); 468 kni->va[i] = pa2va(kni->pa[i], kva); 469 470 skb = dev_alloc_skb(len + 2); 471 if (skb) { 472 /* Align IP on 16B boundary */ 473 skb_reserve(skb, 2); 474 memcpy(skb_put(skb, len), data_kva, len); 475 skb->dev = dev; 476 skb->ip_summed = CHECKSUM_UNNECESSARY; 477 dev_kfree_skb(skb); 478 } 479 480 /* Simulate real usage, allocate/copy skb twice */ 481 skb = dev_alloc_skb(len + 2); 482 if (skb == NULL) { 483 kni->stats.rx_dropped++; 484 continue; 485 } 486 487 /* Align IP on 16B boundary */ 488 skb_reserve(skb, 2); 489 490 if (kva->nb_segs == 1) { 491 memcpy(skb_put(skb, len), data_kva, len); 492 } else { 493 int nb_segs; 494 int kva_nb_segs = kva->nb_segs; 495 496 for (nb_segs = 0; nb_segs < kva_nb_segs; nb_segs++) { 497 memcpy(skb_put(skb, kva->data_len), 498 data_kva, kva->data_len); 499 500 if (!kva->next) 501 break; 502 503 kva = pa2kva(va2pa(kva->next, kva)); 504 data_kva = kva2data_kva(kva); 505 } 506 } 507 508 skb->dev = dev; 509 skb->ip_summed = CHECKSUM_UNNECESSARY; 510 511 kni->stats.rx_bytes += len; 512 kni->stats.rx_packets++; 513 514 /* call tx interface */ 515 kni_net_tx(skb, dev); 516 } 517 518 /* enqueue all the mbufs from rx_q into free_q */ 519 ret = kni_fifo_put(kni->free_q, kni->va, num); 520 if (ret != num) 521 /* Failing should not happen */ 522 pr_err("Fail to enqueue mbufs into free_q\n"); 523 } 524 525 /* rx interface */ 526 void 527 kni_net_rx(struct kni_dev *kni) 528 { 529 /** 530 * It doesn't need to check if it is NULL pointer, 531 * as it has a default value 532 */ 533 (*kni_net_rx_func)(kni); 534 } 535 536 /* 537 * Deal with a transmit timeout. 538 */ 539 static void 540 kni_net_tx_timeout(struct net_device *dev) 541 { 542 struct kni_dev *kni = netdev_priv(dev); 543 544 pr_debug("Transmit timeout at %ld, latency %ld\n", jiffies, 545 jiffies - dev_trans_start(dev)); 546 547 kni->stats.tx_errors++; 548 netif_wake_queue(dev); 549 } 550 551 /* 552 * Ioctl commands 553 */ 554 static int 555 kni_net_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) 556 { 557 pr_debug("kni_net_ioctl group:%d cmd:%d\n", 558 ((struct kni_dev *)netdev_priv(dev))->group_id, cmd); 559 560 return 0; 561 } 562 563 static void 564 kni_net_set_rx_mode(struct net_device *dev) 565 { 566 } 567 568 static int 569 kni_net_change_mtu(struct net_device *dev, int new_mtu) 570 { 571 int ret; 572 struct rte_kni_request req; 573 struct kni_dev *kni = netdev_priv(dev); 574 575 pr_debug("kni_net_change_mtu new mtu %d to be set\n", new_mtu); 576 577 memset(&req, 0, sizeof(req)); 578 req.req_id = RTE_KNI_REQ_CHANGE_MTU; 579 req.new_mtu = new_mtu; 580 ret = kni_net_process_request(kni, &req); 581 if (ret == 0 && req.result == 0) 582 dev->mtu = new_mtu; 583 584 return (ret == 0) ? req.result : ret; 585 } 586 587 static void 588 kni_net_set_promiscusity(struct net_device *netdev, int flags) 589 { 590 struct rte_kni_request req; 591 struct kni_dev *kni = netdev_priv(netdev); 592 593 memset(&req, 0, sizeof(req)); 594 req.req_id = RTE_KNI_REQ_CHANGE_PROMISC; 595 596 if (netdev->flags & IFF_PROMISC) 597 req.promiscusity = 1; 598 else 599 req.promiscusity = 0; 600 kni_net_process_request(kni, &req); 601 } 602 603 /* 604 * Checks if the user space application provided the resp message 605 */ 606 void 607 kni_net_poll_resp(struct kni_dev *kni) 608 { 609 if (kni_fifo_count(kni->resp_q)) 610 wake_up_interruptible(&kni->wq); 611 } 612 613 /* 614 * Return statistics to the caller 615 */ 616 static struct net_device_stats * 617 kni_net_stats(struct net_device *dev) 618 { 619 struct kni_dev *kni = netdev_priv(dev); 620 621 return &kni->stats; 622 } 623 624 /* 625 * Fill the eth header 626 */ 627 static int 628 kni_net_header(struct sk_buff *skb, struct net_device *dev, 629 unsigned short type, const void *daddr, 630 const void *saddr, uint32_t len) 631 { 632 struct ethhdr *eth = (struct ethhdr *) skb_push(skb, ETH_HLEN); 633 634 memcpy(eth->h_source, saddr ? saddr : dev->dev_addr, dev->addr_len); 635 memcpy(eth->h_dest, daddr ? daddr : dev->dev_addr, dev->addr_len); 636 eth->h_proto = htons(type); 637 638 return dev->hard_header_len; 639 } 640 641 /* 642 * Re-fill the eth header 643 */ 644 #ifdef HAVE_REBUILD_HEADER 645 static int 646 kni_net_rebuild_header(struct sk_buff *skb) 647 { 648 struct net_device *dev = skb->dev; 649 struct ethhdr *eth = (struct ethhdr *) skb->data; 650 651 memcpy(eth->h_source, dev->dev_addr, dev->addr_len); 652 memcpy(eth->h_dest, dev->dev_addr, dev->addr_len); 653 654 return 0; 655 } 656 #endif /* < 4.1.0 */ 657 658 /** 659 * kni_net_set_mac - Change the Ethernet Address of the KNI NIC 660 * @netdev: network interface device structure 661 * @p: pointer to an address structure 662 * 663 * Returns 0 on success, negative on failure 664 **/ 665 static int 666 kni_net_set_mac(struct net_device *netdev, void *p) 667 { 668 int ret; 669 struct rte_kni_request req; 670 struct kni_dev *kni; 671 struct sockaddr *addr = p; 672 673 memset(&req, 0, sizeof(req)); 674 req.req_id = RTE_KNI_REQ_CHANGE_MAC_ADDR; 675 676 if (!is_valid_ether_addr((unsigned char *)(addr->sa_data))) 677 return -EADDRNOTAVAIL; 678 679 memcpy(req.mac_addr, addr->sa_data, netdev->addr_len); 680 memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); 681 682 kni = netdev_priv(netdev); 683 ret = kni_net_process_request(kni, &req); 684 685 return (ret == 0 ? req.result : ret); 686 } 687 688 #ifdef HAVE_CHANGE_CARRIER_CB 689 static int 690 kni_net_change_carrier(struct net_device *dev, bool new_carrier) 691 { 692 if (new_carrier) 693 netif_carrier_on(dev); 694 else 695 netif_carrier_off(dev); 696 return 0; 697 } 698 #endif 699 700 static const struct header_ops kni_net_header_ops = { 701 .create = kni_net_header, 702 #ifdef HAVE_REBUILD_HEADER 703 .rebuild = kni_net_rebuild_header, 704 #endif /* < 4.1.0 */ 705 .cache = NULL, /* disable caching */ 706 }; 707 708 static const struct net_device_ops kni_net_netdev_ops = { 709 .ndo_open = kni_net_open, 710 .ndo_stop = kni_net_release, 711 .ndo_set_config = kni_net_config, 712 .ndo_change_rx_flags = kni_net_set_promiscusity, 713 .ndo_start_xmit = kni_net_tx, 714 .ndo_change_mtu = kni_net_change_mtu, 715 .ndo_do_ioctl = kni_net_ioctl, 716 .ndo_set_rx_mode = kni_net_set_rx_mode, 717 .ndo_get_stats = kni_net_stats, 718 .ndo_tx_timeout = kni_net_tx_timeout, 719 .ndo_set_mac_address = kni_net_set_mac, 720 #ifdef HAVE_CHANGE_CARRIER_CB 721 .ndo_change_carrier = kni_net_change_carrier, 722 #endif 723 }; 724 725 void 726 kni_net_init(struct net_device *dev) 727 { 728 struct kni_dev *kni = netdev_priv(dev); 729 730 init_waitqueue_head(&kni->wq); 731 mutex_init(&kni->sync_lock); 732 733 ether_setup(dev); /* assign some of the fields */ 734 dev->netdev_ops = &kni_net_netdev_ops; 735 dev->header_ops = &kni_net_header_ops; 736 dev->watchdog_timeo = WD_TIMEOUT; 737 } 738 739 void 740 kni_net_config_lo_mode(char *lo_str) 741 { 742 if (!lo_str) { 743 pr_debug("loopback disabled"); 744 return; 745 } 746 747 if (!strcmp(lo_str, "lo_mode_none")) 748 pr_debug("loopback disabled"); 749 else if (!strcmp(lo_str, "lo_mode_fifo")) { 750 pr_debug("loopback mode=lo_mode_fifo enabled"); 751 kni_net_rx_func = kni_net_rx_lo_fifo; 752 } else if (!strcmp(lo_str, "lo_mode_fifo_skb")) { 753 pr_debug("loopback mode=lo_mode_fifo_skb enabled"); 754 kni_net_rx_func = kni_net_rx_lo_fifo_skb; 755 } else 756 pr_debug("Incognizant parameter, loopback disabled"); 757 } 758