1488570ebSJim Harris /* SPDX-License-Identifier: BSD-3-Clause
2*a6dbe372Spaul luse * Copyright (C) 2021 Intel Corporation.
3ee8f6dd1SZiye Yang * All rights reserved.
4ee8f6dd1SZiye Yang */
5ee8f6dd1SZiye Yang
6ee8f6dd1SZiye Yang #ifndef __SGL_INTERNAL_H__
7ee8f6dd1SZiye Yang #define __SGL_INTERNAL_H__
8ee8f6dd1SZiye Yang
9ee8f6dd1SZiye Yang #include "spdk/stdinc.h"
10ee8f6dd1SZiye Yang
11ee8f6dd1SZiye Yang #ifdef __cplusplus
12ee8f6dd1SZiye Yang extern "C" {
13ee8f6dd1SZiye Yang #endif
14ee8f6dd1SZiye Yang
15ee8f6dd1SZiye Yang struct spdk_iov_sgl {
16ee8f6dd1SZiye Yang struct iovec *iov;
17ee8f6dd1SZiye Yang int iovcnt;
18ee8f6dd1SZiye Yang uint32_t iov_offset;
19ee8f6dd1SZiye Yang uint32_t total_size;
20ee8f6dd1SZiye Yang };
21ee8f6dd1SZiye Yang
22ee8f6dd1SZiye Yang /**
23ee8f6dd1SZiye Yang * Initialize struct spdk_iov_sgl with iov, iovcnt and iov_offset.
24ee8f6dd1SZiye Yang *
25ee8f6dd1SZiye Yang * \param s the spdk_iov_sgl to be filled.
26ee8f6dd1SZiye Yang * \param iov the io vector to fill the s
27ee8f6dd1SZiye Yang * \param iovcnt the size the iov
28ee8f6dd1SZiye Yang * \param iov_offset the current filled iov_offset for s.
29ee8f6dd1SZiye Yang */
30ee8f6dd1SZiye Yang
31ee8f6dd1SZiye Yang static inline void
spdk_iov_sgl_init(struct spdk_iov_sgl * s,struct iovec * iov,int iovcnt,uint32_t iov_offset)32ee8f6dd1SZiye Yang spdk_iov_sgl_init(struct spdk_iov_sgl *s, struct iovec *iov, int iovcnt,
33ee8f6dd1SZiye Yang uint32_t iov_offset)
34ee8f6dd1SZiye Yang {
35ee8f6dd1SZiye Yang s->iov = iov;
36ee8f6dd1SZiye Yang s->iovcnt = iovcnt;
37ee8f6dd1SZiye Yang s->iov_offset = iov_offset;
38ee8f6dd1SZiye Yang s->total_size = 0;
39ee8f6dd1SZiye Yang }
40ee8f6dd1SZiye Yang
41ee8f6dd1SZiye Yang /**
42ee8f6dd1SZiye Yang * Consume the iovs in spdk_iov_sgl with passed bytes
43ee8f6dd1SZiye Yang *
44ee8f6dd1SZiye Yang * \param s the spdk_iov_sgl which contains the iov
45ee8f6dd1SZiye Yang * \param step the bytes_size consumed.
46ee8f6dd1SZiye Yang */
47ee8f6dd1SZiye Yang
48ee8f6dd1SZiye Yang static inline void
spdk_iov_sgl_advance(struct spdk_iov_sgl * s,uint32_t step)49ee8f6dd1SZiye Yang spdk_iov_sgl_advance(struct spdk_iov_sgl *s, uint32_t step)
50ee8f6dd1SZiye Yang {
51ee8f6dd1SZiye Yang s->iov_offset += step;
52ee8f6dd1SZiye Yang while (s->iovcnt > 0) {
53ee8f6dd1SZiye Yang assert(s->iov != NULL);
54ee8f6dd1SZiye Yang if (s->iov_offset < s->iov->iov_len) {
55ee8f6dd1SZiye Yang break;
56ee8f6dd1SZiye Yang }
57ee8f6dd1SZiye Yang
58ee8f6dd1SZiye Yang s->iov_offset -= s->iov->iov_len;
59ee8f6dd1SZiye Yang s->iov++;
60ee8f6dd1SZiye Yang s->iovcnt--;
61ee8f6dd1SZiye Yang }
62ee8f6dd1SZiye Yang }
63ee8f6dd1SZiye Yang
64ee8f6dd1SZiye Yang /**
65ee8f6dd1SZiye Yang * Append the data to the struct spdk_iov_sgl pointed by s
66ee8f6dd1SZiye Yang *
67ee8f6dd1SZiye Yang * \param s the address of the struct spdk_iov_sgl
68ee8f6dd1SZiye Yang * \param data the data buffer to be appended
69ee8f6dd1SZiye Yang * \param data_len the length of the data.
70ee8f6dd1SZiye Yang *
71ee8f6dd1SZiye Yang * \return true if all the data is appended.
72ee8f6dd1SZiye Yang */
73ee8f6dd1SZiye Yang
74ee8f6dd1SZiye Yang static inline bool
spdk_iov_sgl_append(struct spdk_iov_sgl * s,uint8_t * data,uint32_t data_len)75ee8f6dd1SZiye Yang spdk_iov_sgl_append(struct spdk_iov_sgl *s, uint8_t *data, uint32_t data_len)
76ee8f6dd1SZiye Yang {
77ee8f6dd1SZiye Yang if (s->iov_offset >= data_len) {
78ee8f6dd1SZiye Yang s->iov_offset -= data_len;
79ee8f6dd1SZiye Yang } else {
80ee8f6dd1SZiye Yang assert(s->iovcnt > 0);
81ee8f6dd1SZiye Yang s->iov->iov_base = data + s->iov_offset;
82ee8f6dd1SZiye Yang s->iov->iov_len = data_len - s->iov_offset;
83ee8f6dd1SZiye Yang s->total_size += data_len - s->iov_offset;
84ee8f6dd1SZiye Yang s->iov_offset = 0;
85ee8f6dd1SZiye Yang s->iov++;
86ee8f6dd1SZiye Yang s->iovcnt--;
87ee8f6dd1SZiye Yang if (s->iovcnt == 0) {
88ee8f6dd1SZiye Yang return false;
89ee8f6dd1SZiye Yang }
90ee8f6dd1SZiye Yang }
91ee8f6dd1SZiye Yang
92ee8f6dd1SZiye Yang return true;
93ee8f6dd1SZiye Yang }
94ee8f6dd1SZiye Yang
95ee8f6dd1SZiye Yang #ifdef __cplusplus
96ee8f6dd1SZiye Yang }
97ee8f6dd1SZiye Yang #endif
98ee8f6dd1SZiye Yang
99ee8f6dd1SZiye Yang #endif /* __SGL_INTERNAL_H__ */
100