udp.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * INET An implementation of the TCP/IP protocol suite for the LINUX
  4. * operating system. INET is implemented using the BSD Socket
  5. * interface as the means of communication with the user level.
  6. *
  7. * Definitions for the UDP protocol.
  8. *
  9. * Version: @(#)udp.h 1.0.2 04/28/93
  10. *
  11. * Author: Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
  12. */
  13. #ifndef _LINUX_UDP_H
  14. #define _LINUX_UDP_H
  15. #include <net/inet_sock.h>
  16. #include <linux/skbuff.h>
  17. #include <net/netns/hash.h>
  18. #include <uapi/linux/udp.h>
  19. static inline struct udphdr *udp_hdr(const struct sk_buff *skb)
  20. {
  21. return (struct udphdr *)skb_transport_header(skb);
  22. }
  23. static inline struct udphdr *inner_udp_hdr(const struct sk_buff *skb)
  24. {
  25. return (struct udphdr *)skb_inner_transport_header(skb);
  26. }
  27. #define UDP_HTABLE_SIZE_MIN (CONFIG_BASE_SMALL ? 128 : 256)
  28. static inline u32 udp_hashfn(const struct net *net, u32 num, u32 mask)
  29. {
  30. return (num + net_hash_mix(net)) & mask;
  31. }
  32. struct udp_sock {
  33. /* inet_sock has to be the first member */
  34. struct inet_sock inet;
  35. #define udp_port_hash inet.sk.__sk_common.skc_u16hashes[0]
  36. #define udp_portaddr_hash inet.sk.__sk_common.skc_u16hashes[1]
  37. #define udp_portaddr_node inet.sk.__sk_common.skc_portaddr_node
  38. int pending; /* Any pending frames ? */
  39. unsigned int corkflag; /* Cork is required */
  40. __u8 encap_type; /* Is this an Encapsulation socket? */
  41. unsigned char no_check6_tx:1,/* Send zero UDP6 checksums on TX? */
  42. no_check6_rx:1,/* Allow zero UDP6 checksums on RX? */
  43. encap_enabled:1, /* This socket enabled encap
  44. * processing; UDP tunnels and
  45. * different encapsulation layer set
  46. * this
  47. */
  48. gro_enabled:1, /* Request GRO aggregation */
  49. accept_udp_l4:1,
  50. accept_udp_fraglist:1;
  51. /*
  52. * Following member retains the information to create a UDP header
  53. * when the socket is uncorked.
  54. */
  55. __u16 len; /* total length of pending frames */
  56. __u16 gso_size;
  57. /*
  58. * Fields specific to UDP-Lite.
  59. */
  60. __u16 pcslen;
  61. __u16 pcrlen;
  62. /* indicator bits used by pcflag: */
  63. #define UDPLITE_BIT 0x1 /* set by udplite proto init function */
  64. #define UDPLITE_SEND_CC 0x2 /* set via udplite setsockopt */
  65. #define UDPLITE_RECV_CC 0x4 /* set via udplite setsocktopt */
  66. __u8 pcflag; /* marks socket as UDP-Lite if > 0 */
  67. __u8 unused[3];
  68. /*
  69. * For encapsulation sockets.
  70. */
  71. int (*encap_rcv)(struct sock *sk, struct sk_buff *skb);
  72. int (*encap_err_lookup)(struct sock *sk, struct sk_buff *skb);
  73. void (*encap_destroy)(struct sock *sk);
  74. /* GRO functions for UDP socket */
  75. struct sk_buff * (*gro_receive)(struct sock *sk,
  76. struct list_head *head,
  77. struct sk_buff *skb);
  78. int (*gro_complete)(struct sock *sk,
  79. struct sk_buff *skb,
  80. int nhoff);
  81. /* udp_recvmsg try to use this before splicing sk_receive_queue */
  82. struct sk_buff_head reader_queue ____cacheline_aligned_in_smp;
  83. /* This field is dirtied by udp_recvmsg() */
  84. int forward_deficit;
  85. };
  86. #define UDP_MAX_SEGMENTS (1 << 6UL)
  87. static inline struct udp_sock *udp_sk(const struct sock *sk)
  88. {
  89. return (struct udp_sock *)sk;
  90. }
  91. static inline void udp_set_no_check6_tx(struct sock *sk, bool val)
  92. {
  93. udp_sk(sk)->no_check6_tx = val;
  94. }
  95. static inline void udp_set_no_check6_rx(struct sock *sk, bool val)
  96. {
  97. udp_sk(sk)->no_check6_rx = val;
  98. }
  99. static inline bool udp_get_no_check6_tx(struct sock *sk)
  100. {
  101. return udp_sk(sk)->no_check6_tx;
  102. }
  103. static inline bool udp_get_no_check6_rx(struct sock *sk)
  104. {
  105. return udp_sk(sk)->no_check6_rx;
  106. }
  107. static inline void udp_cmsg_recv(struct msghdr *msg, struct sock *sk,
  108. struct sk_buff *skb)
  109. {
  110. int gso_size;
  111. if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4) {
  112. gso_size = skb_shinfo(skb)->gso_size;
  113. put_cmsg(msg, SOL_UDP, UDP_GRO, sizeof(gso_size), &gso_size);
  114. }
  115. }
  116. static inline bool udp_unexpected_gso(struct sock *sk, struct sk_buff *skb)
  117. {
  118. if (!skb_is_gso(skb))
  119. return false;
  120. if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4 && !udp_sk(sk)->accept_udp_l4)
  121. return true;
  122. if (skb_shinfo(skb)->gso_type & SKB_GSO_FRAGLIST && !udp_sk(sk)->accept_udp_fraglist)
  123. return true;
  124. return false;
  125. }
  126. #define udp_portaddr_for_each_entry(__sk, list) \
  127. hlist_for_each_entry(__sk, list, __sk_common.skc_portaddr_node)
  128. #define udp_portaddr_for_each_entry_rcu(__sk, list) \
  129. hlist_for_each_entry_rcu(__sk, list, __sk_common.skc_portaddr_node)
  130. #define IS_UDPLITE(__sk) (__sk->sk_protocol == IPPROTO_UDPLITE)
  131. #endif /* _LINUX_UDP_H */