* Write (spread) data from buffer to mbuf data * * @param mbuf * Destination mbuf * @param offset * Start offset in mbuf * @param len * Number of bytes to copy * @param buffer * Continuous source buffer */
| 114 | * Continuous source buffer |
| 115 | */ |
| 116 | static inline void |
| 117 | pktmbuf_write(struct rte_mbuf *mbuf, int offset, int len, const uint8_t *buffer) |
| 118 | { |
| 119 | int n = len; |
| 120 | int l; |
| 121 | struct rte_mbuf *m; |
| 122 | char *dst; |
| 123 | |
| 124 | for (m = mbuf; (m != NULL) && (offset > m->data_len); m = m->next) |
| 125 | offset -= m->data_len; |
| 126 | |
| 127 | l = m->data_len - offset; |
| 128 | |
| 129 | /* copy data from first segment */ |
| 130 | dst = rte_pktmbuf_mtod_offset(m, char *, offset); |
| 131 | if (len <= l) { |
| 132 | rte_memcpy(dst, buffer, len); |
| 133 | return; |
| 134 | } |
| 135 | |
| 136 | rte_memcpy(dst, buffer, l); |
| 137 | buffer += l; |
| 138 | n -= l; |
| 139 | |
| 140 | for (m = m->next; (m != NULL) && (n > 0); m = m->next) { |
| 141 | dst = rte_pktmbuf_mtod(m, char *); |
| 142 | l = m->data_len; |
| 143 | if (n < l) { |
| 144 | rte_memcpy(dst, buffer, n); |
| 145 | return; |
| 146 | } |
| 147 | rte_memcpy(dst, buffer, l); |
| 148 | buffer += l; |
| 149 | n -= l; |
| 150 | } |
| 151 | } |
| 152 | |
| 153 | static inline uint8_t * |
| 154 | pktmbuf_mtod_offset(struct rte_mbuf *mbuf, int offset) { |
no test coverage detected