err_t snmp_pbuf_stream_writeto(struct snmp_pbuf_stream* pbuf_stream, struct snmp_pbuf_stream* target_pbuf_stream, u16_t len) { if ((pbuf_stream == NULL) || (target_pbuf_stream == NULL)) { return ERR_ARG; } if ((len > pbuf_stream->length) || (len > target_pbuf_stream->length)) { return ERR_ARG; } if (len == 0) { len = LWIP_MIN(pbuf_stream->length, target_pbuf_stream->length); } while (len > 0) { u16_t chunk_len; err_t err; if (pbuf_stream->pbuf_len == 0) { /* we are at the end of current pbuf, skip to next */ pbuf_stream->pbuffer = pbuf_stream->pbuffer->next; if ((pbuf_stream->pbuffer == NULL) || (pbuf_stream->pbuffer->len == 0)) { return ERR_BUF; } pbuf_stream->pbuf_len = pbuf_stream->pbuffer->len; pbuf_stream->pData = (u8_t*)(pbuf_stream->pbuffer->payload); } chunk_len = LWIP_MIN(len, pbuf_stream->pbuf_len); err = snmp_pbuf_stream_writebuf(target_pbuf_stream, pbuf_stream->pData, chunk_len); if (err != ERR_OK) { return err; } pbuf_stream->pData += chunk_len; pbuf_stream->pbuf_len -= chunk_len; pbuf_stream->offset += chunk_len; pbuf_stream->length -= chunk_len; len -= chunk_len; } return ERR_OK; }
err_t snmp_pbuf_stream_writeto(struct snmp_pbuf_stream *pbuf_stream, struct snmp_pbuf_stream *target_pbuf_stream, u16_t len) { if ((pbuf_stream == NULL) || (target_pbuf_stream == NULL)) { return ERR_ARG; } if ((len > pbuf_stream->length) || (len > target_pbuf_stream->length)) { return ERR_ARG; } if (len == 0) { len = LWIP_MIN(pbuf_stream->length, target_pbuf_stream->length); } while (len > 0) { u16_t chunk_len; err_t err; u16_t target_offset; struct pbuf *pbuf = pbuf_skip(pbuf_stream->pbuf, pbuf_stream->offset, &target_offset); if ((pbuf == NULL) || (pbuf->len == 0)) { return ERR_BUF; } chunk_len = LWIP_MIN(len, pbuf->len); err = snmp_pbuf_stream_writebuf(target_pbuf_stream, &((u8_t *)pbuf->payload)[target_offset], chunk_len); if (err != ERR_OK) { return err; } pbuf_stream->offset += chunk_len; pbuf_stream->length -= chunk_len; len -= chunk_len; } return ERR_OK; }
err_t snmp_pbuf_stream_write(struct snmp_pbuf_stream *pbuf_stream, u8_t data) { return snmp_pbuf_stream_writebuf(pbuf_stream, &data, 1); }