blackhole_dev_kunit.c 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * This tests the blackhole_dev that is created during the
  4. * net subsystem initialization. The test this module performs is
  5. * by injecting an skb into the stack with skb->dev as the
  6. * blackhole_dev and expects kernel to behave in a sane manner
  7. * (in other words, *not crash*)!
  8. *
  9. * Copyright (c) 2018, Mahesh Bandewar <maheshb@google.com>
  10. */
  11. #include <kunit/test.h>
  12. #include <linux/module.h>
  13. #include <linux/skbuff.h>
  14. #include <linux/netdevice.h>
  15. #include <linux/udp.h>
  16. #include <linux/ipv6.h>
  17. #include <net/dst.h>
  18. #define SKB_SIZE 256
  19. #define HEAD_SIZE (14+40+8) /* Ether + IPv6 + UDP */
  20. #define TAIL_SIZE 32 /* random tail-room */
  21. #define UDP_PORT 1234
  22. static void test_blackholedev(struct kunit *test)
  23. {
  24. struct ipv6hdr *ip6h;
  25. struct sk_buff *skb;
  26. struct udphdr *uh;
  27. int data_len;
  28. skb = alloc_skb(SKB_SIZE, GFP_KERNEL);
  29. KUNIT_ASSERT_NOT_NULL(test, skb);
  30. /* Reserve head-room for the headers */
  31. skb_reserve(skb, HEAD_SIZE);
  32. /* Add data to the skb */
  33. data_len = SKB_SIZE - (HEAD_SIZE + TAIL_SIZE);
  34. memset(__skb_put(skb, data_len), 0xf, data_len);
  35. /* Add protocol data */
  36. /* (Transport) UDP */
  37. uh = (struct udphdr *)skb_push(skb, sizeof(struct udphdr));
  38. skb_set_transport_header(skb, 0);
  39. uh->source = uh->dest = htons(UDP_PORT);
  40. uh->len = htons(data_len);
  41. uh->check = 0;
  42. /* (Network) IPv6 */
  43. ip6h = (struct ipv6hdr *)skb_push(skb, sizeof(struct ipv6hdr));
  44. skb_set_network_header(skb, 0);
  45. ip6h->hop_limit = 32;
  46. ip6h->payload_len = htons(data_len + sizeof(struct udphdr));
  47. ip6h->nexthdr = IPPROTO_UDP;
  48. ip6h->saddr = in6addr_loopback;
  49. ip6h->daddr = in6addr_loopback;
  50. /* Ether */
  51. skb_push(skb, sizeof(struct ethhdr));
  52. skb_set_mac_header(skb, 0);
  53. skb->protocol = htons(ETH_P_IPV6);
  54. skb->pkt_type = PACKET_HOST;
  55. skb->dev = blackhole_netdev;
  56. /* Now attempt to send the packet */
  57. KUNIT_EXPECT_EQ(test, dev_queue_xmit(skb), NET_XMIT_SUCCESS);
  58. }
  59. static struct kunit_case blackholedev_cases[] = {
  60. KUNIT_CASE(test_blackholedev),
  61. {},
  62. };
  63. static struct kunit_suite blackholedev_suite = {
  64. .name = "blackholedev",
  65. .test_cases = blackholedev_cases,
  66. };
  67. kunit_test_suite(blackholedev_suite);
  68. MODULE_AUTHOR("Mahesh Bandewar <maheshb@google.com>");
  69. MODULE_DESCRIPTION("module test of the blackhole_dev");
  70. MODULE_LICENSE("GPL");