libiscsi_tcp.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * iSCSI over TCP/IP Data-Path lib
  4. *
  5. * Copyright (C) 2008 Mike Christie
  6. * Copyright (C) 2008 Red Hat, Inc. All rights reserved.
  7. * maintained by open-iscsi@googlegroups.com
  8. */
  9. #ifndef LIBISCSI_TCP_H
  10. #define LIBISCSI_TCP_H
  11. #include <scsi/libiscsi.h>
  12. struct iscsi_tcp_conn;
  13. struct iscsi_segment;
  14. struct sk_buff;
  15. typedef int iscsi_segment_done_fn_t(struct iscsi_tcp_conn *,
  16. struct iscsi_segment *);
  17. struct iscsi_segment {
  18. unsigned char *data;
  19. unsigned int size;
  20. unsigned int copied;
  21. unsigned int total_size;
  22. unsigned int total_copied;
  23. u32 *crcp;
  24. unsigned char padbuf[ISCSI_PAD_LEN];
  25. unsigned char recv_digest[ISCSI_DIGEST_SIZE];
  26. unsigned char digest[ISCSI_DIGEST_SIZE];
  27. unsigned int digest_len;
  28. struct scatterlist *sg;
  29. void *sg_mapped;
  30. unsigned int sg_offset;
  31. bool atomic_mapped;
  32. iscsi_segment_done_fn_t *done;
  33. };
  34. /* Socket connection receive helper */
  35. struct iscsi_tcp_recv {
  36. struct iscsi_hdr *hdr;
  37. struct iscsi_segment segment;
  38. /* Allocate buffer for BHS + AHS */
  39. uint32_t hdr_buf[64];
  40. /* copied and flipped values */
  41. int datalen;
  42. };
  43. struct iscsi_tcp_conn {
  44. struct iscsi_conn *iscsi_conn;
  45. void *dd_data;
  46. int stop_stage; /* conn_stop() flag: *
  47. * stop to recover, *
  48. * stop to terminate */
  49. /* control data */
  50. struct iscsi_tcp_recv in; /* TCP receive context */
  51. /* CRC32C (Rx) LLD should set this if they do not offload */
  52. u32 *rx_crcp;
  53. };
  54. struct iscsi_tcp_task {
  55. uint32_t exp_datasn; /* expected target's R2TSN/DataSN */
  56. int data_offset;
  57. struct iscsi_r2t_info *r2t; /* in progress solict R2T */
  58. struct iscsi_pool r2tpool;
  59. struct kfifo r2tqueue;
  60. void *dd_data;
  61. spinlock_t pool2queue;
  62. spinlock_t queue2pool;
  63. };
  64. enum {
  65. ISCSI_TCP_SEGMENT_DONE, /* curr seg has been processed */
  66. ISCSI_TCP_SKB_DONE, /* skb is out of data */
  67. ISCSI_TCP_CONN_ERR, /* iscsi layer has fired a conn err */
  68. ISCSI_TCP_SUSPENDED, /* conn is suspended */
  69. };
  70. extern void iscsi_tcp_hdr_recv_prep(struct iscsi_tcp_conn *tcp_conn);
  71. extern int iscsi_tcp_recv_skb(struct iscsi_conn *conn, struct sk_buff *skb,
  72. unsigned int offset, bool offloaded, int *status);
  73. extern void iscsi_tcp_cleanup_task(struct iscsi_task *task);
  74. extern int iscsi_tcp_task_init(struct iscsi_task *task);
  75. extern int iscsi_tcp_task_xmit(struct iscsi_task *task);
  76. /* segment helpers */
  77. extern int iscsi_tcp_recv_segment_is_hdr(struct iscsi_tcp_conn *tcp_conn);
  78. extern int iscsi_tcp_segment_done(struct iscsi_tcp_conn *tcp_conn,
  79. struct iscsi_segment *segment, int recv,
  80. unsigned copied);
  81. extern void iscsi_tcp_segment_unmap(struct iscsi_segment *segment);
  82. extern void iscsi_segment_init_linear(struct iscsi_segment *segment,
  83. void *data, size_t size,
  84. iscsi_segment_done_fn_t *done, u32 *crcp);
  85. extern int
  86. iscsi_segment_seek_sg(struct iscsi_segment *segment,
  87. struct scatterlist *sg_list, unsigned int sg_count,
  88. unsigned int offset, size_t size,
  89. iscsi_segment_done_fn_t *done, u32 *crcp);
  90. /* digest helpers */
  91. extern void iscsi_tcp_dgst_header(const void *hdr, size_t hdrlen,
  92. unsigned char digest[ISCSI_DIGEST_SIZE]);
  93. extern struct iscsi_cls_conn *
  94. iscsi_tcp_conn_setup(struct iscsi_cls_session *cls_session, int dd_data_size,
  95. uint32_t conn_idx);
  96. extern void iscsi_tcp_conn_teardown(struct iscsi_cls_conn *cls_conn);
  97. /* misc helpers */
  98. extern int iscsi_tcp_r2tpool_alloc(struct iscsi_session *session);
  99. extern void iscsi_tcp_r2tpool_free(struct iscsi_session *session);
  100. extern int iscsi_tcp_set_max_r2t(struct iscsi_conn *conn, char *buf);
  101. extern void iscsi_tcp_conn_get_stats(struct iscsi_cls_conn *cls_conn,
  102. struct iscsi_stats *stats);
  103. #endif /* LIBISCSI_TCP_H */