strparser.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Stream Parser
  4. *
  5. * Copyright (c) 2016 Tom Herbert <[email protected]>
  6. */
  7. #ifndef __NET_STRPARSER_H_
  8. #define __NET_STRPARSER_H_
  9. #include <linux/skbuff.h>
  10. #include <net/sock.h>
  11. #define STRP_STATS_ADD(stat, count) ((stat) += (count))
  12. #define STRP_STATS_INCR(stat) ((stat)++)
  13. struct strp_stats {
  14. unsigned long long msgs;
  15. unsigned long long bytes;
  16. unsigned int mem_fail;
  17. unsigned int need_more_hdr;
  18. unsigned int msg_too_big;
  19. unsigned int msg_timeouts;
  20. unsigned int bad_hdr_len;
  21. };
  22. struct strp_aggr_stats {
  23. unsigned long long msgs;
  24. unsigned long long bytes;
  25. unsigned int mem_fail;
  26. unsigned int need_more_hdr;
  27. unsigned int msg_too_big;
  28. unsigned int msg_timeouts;
  29. unsigned int bad_hdr_len;
  30. unsigned int aborts;
  31. unsigned int interrupted;
  32. unsigned int unrecov_intr;
  33. };
  34. struct strparser;
  35. /* Callbacks are called with lock held for the attached socket */
  36. struct strp_callbacks {
  37. int (*parse_msg)(struct strparser *strp, struct sk_buff *skb);
  38. void (*rcv_msg)(struct strparser *strp, struct sk_buff *skb);
  39. int (*read_sock_done)(struct strparser *strp, int err);
  40. void (*abort_parser)(struct strparser *strp, int err);
  41. void (*lock)(struct strparser *strp);
  42. void (*unlock)(struct strparser *strp);
  43. };
  44. struct strp_msg {
  45. int full_len;
  46. int offset;
  47. };
  48. struct _strp_msg {
  49. /* Internal cb structure. struct strp_msg must be first for passing
  50. * to upper layer.
  51. */
  52. struct strp_msg strp;
  53. int accum_len;
  54. };
  55. struct sk_skb_cb {
  56. #define SK_SKB_CB_PRIV_LEN 20
  57. unsigned char data[SK_SKB_CB_PRIV_LEN];
  58. /* align strp on cache line boundary within skb->cb[] */
  59. unsigned char pad[4];
  60. struct _strp_msg strp;
  61. /* strp users' data follows */
  62. struct tls_msg {
  63. u8 control;
  64. } tls;
  65. /* temp_reg is a temporary register used for bpf_convert_data_end_access
  66. * when dst_reg == src_reg.
  67. */
  68. u64 temp_reg;
  69. };
  70. static inline struct strp_msg *strp_msg(struct sk_buff *skb)
  71. {
  72. return (struct strp_msg *)((void *)skb->cb +
  73. offsetof(struct sk_skb_cb, strp));
  74. }
  75. /* Structure for an attached lower socket */
  76. struct strparser {
  77. struct sock *sk;
  78. u32 stopped : 1;
  79. u32 paused : 1;
  80. u32 aborted : 1;
  81. u32 interrupted : 1;
  82. u32 unrecov_intr : 1;
  83. struct sk_buff **skb_nextp;
  84. struct sk_buff *skb_head;
  85. unsigned int need_bytes;
  86. struct delayed_work msg_timer_work;
  87. struct work_struct work;
  88. struct strp_stats stats;
  89. struct strp_callbacks cb;
  90. };
  91. /* Must be called with lock held for attached socket */
  92. static inline void strp_pause(struct strparser *strp)
  93. {
  94. strp->paused = 1;
  95. }
  96. /* May be called without holding lock for attached socket */
  97. void strp_unpause(struct strparser *strp);
  98. /* Must be called with process lock held (lock_sock) */
  99. void __strp_unpause(struct strparser *strp);
  100. static inline void save_strp_stats(struct strparser *strp,
  101. struct strp_aggr_stats *agg_stats)
  102. {
  103. /* Save psock statistics in the mux when psock is being unattached. */
  104. #define SAVE_PSOCK_STATS(_stat) (agg_stats->_stat += \
  105. strp->stats._stat)
  106. SAVE_PSOCK_STATS(msgs);
  107. SAVE_PSOCK_STATS(bytes);
  108. SAVE_PSOCK_STATS(mem_fail);
  109. SAVE_PSOCK_STATS(need_more_hdr);
  110. SAVE_PSOCK_STATS(msg_too_big);
  111. SAVE_PSOCK_STATS(msg_timeouts);
  112. SAVE_PSOCK_STATS(bad_hdr_len);
  113. #undef SAVE_PSOCK_STATS
  114. if (strp->aborted)
  115. agg_stats->aborts++;
  116. if (strp->interrupted)
  117. agg_stats->interrupted++;
  118. if (strp->unrecov_intr)
  119. agg_stats->unrecov_intr++;
  120. }
  121. static inline void aggregate_strp_stats(struct strp_aggr_stats *stats,
  122. struct strp_aggr_stats *agg_stats)
  123. {
  124. #define SAVE_PSOCK_STATS(_stat) (agg_stats->_stat += stats->_stat)
  125. SAVE_PSOCK_STATS(msgs);
  126. SAVE_PSOCK_STATS(bytes);
  127. SAVE_PSOCK_STATS(mem_fail);
  128. SAVE_PSOCK_STATS(need_more_hdr);
  129. SAVE_PSOCK_STATS(msg_too_big);
  130. SAVE_PSOCK_STATS(msg_timeouts);
  131. SAVE_PSOCK_STATS(bad_hdr_len);
  132. SAVE_PSOCK_STATS(aborts);
  133. SAVE_PSOCK_STATS(interrupted);
  134. SAVE_PSOCK_STATS(unrecov_intr);
  135. #undef SAVE_PSOCK_STATS
  136. }
  137. void strp_done(struct strparser *strp);
  138. void strp_stop(struct strparser *strp);
  139. void strp_check_rcv(struct strparser *strp);
  140. int strp_init(struct strparser *strp, struct sock *sk,
  141. const struct strp_callbacks *cb);
  142. void strp_data_ready(struct strparser *strp);
  143. int strp_process(struct strparser *strp, struct sk_buff *orig_skb,
  144. unsigned int orig_offset, size_t orig_len,
  145. size_t max_msg_size, long timeo);
  146. #endif /* __NET_STRPARSER_H_ */