END_TEST /* Test for bug that writing with pbuf_take_at() did nothing * and returned ERR_OK when writing at beginning of a pbuf * in the chain. */ START_TEST(test_pbuf_take_at_edge) { err_t res; u8_t *out; int i; u8_t testdata[] = { 0x01, 0x08, 0x82, 0x02 }; struct pbuf *p = pbuf_alloc(PBUF_RAW, 1024, PBUF_POOL); struct pbuf *q = p->next; LWIP_UNUSED_ARG(_i); /* alloc big enough to get a chain of pbufs */ fail_if(p->tot_len == p->len); memset(p->payload, 0, p->len); memset(q->payload, 0, q->len); /* copy data to the beginning of first pbuf */ res = pbuf_take_at(p, &testdata, sizeof(testdata), 0); fail_unless(res == ERR_OK); out = (u8_t*)p->payload; for (i = 0; i < (int)sizeof(testdata); i++) { fail_unless(out[i] == testdata[i], "Bad data at pos %d, was %02X, expected %02X", i, out[i], testdata[i]); } /* copy data to the just before end of first pbuf */ res = pbuf_take_at(p, &testdata, sizeof(testdata), p->len - 1); fail_unless(res == ERR_OK); out = (u8_t*)p->payload; fail_unless(out[p->len - 1] == testdata[0], "Bad data at pos %d, was %02X, expected %02X", p->len - 1, out[p->len - 1], testdata[0]); out = (u8_t*)q->payload; for (i = 1; i < (int)sizeof(testdata); i++) { fail_unless(out[i-1] == testdata[i], "Bad data at pos %d, was %02X, expected %02X", p->len - 1 + i, out[i-1], testdata[i]); } /* copy data to the beginning of second pbuf */ res = pbuf_take_at(p, &testdata, sizeof(testdata), p->len); fail_unless(res == ERR_OK); out = (u8_t*)p->payload; for (i = 0; i < (int)sizeof(testdata); i++) { fail_unless(out[i] == testdata[i], "Bad data at pos %d, was %02X, expected %02X", p->len+i, out[i], testdata[i]); } }
/* Send 6LoWPAN TX packets as UDP broadcast */ static err_t zepif_linkoutput(struct netif *netif, struct pbuf *p) { err_t err; struct pbuf *q; struct zep_hdr *zep; struct zepif_state *state; LWIP_ASSERT("invalid netif", netif != NULL); LWIP_ASSERT("invalid pbuf", p != NULL); if (p->tot_len > ZEP_MAX_DATA_LEN) { return ERR_VAL; } LWIP_ASSERT("TODO: support chained pbufs", p->next == NULL); state = (struct zepif_state *)netif->state; LWIP_ASSERT("state->pcb != NULL", state->pcb != NULL); q = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct zep_hdr) + p->tot_len, PBUF_RAM); if (q == NULL) { return ERR_MEM; } zep = (struct zep_hdr *)q->payload; memset(zep, 0, sizeof(struct zep_hdr)); zep->prot_id[0] = 'E'; zep->prot_id[1] = 'X'; zep->prot_version = 2; zep->type = 1; /* Data */ zep->channel_id = 0; /* whatever */ zep->device_id = lwip_htons(1); /* whatever */ zep->crc_mode = 1; zep->unknown_1 = 0xff; zep->seq_num = lwip_htonl(state->seqno); state->seqno++; zep->len = (u8_t)p->tot_len; err = pbuf_take_at(q, p->payload, p->tot_len, sizeof(struct zep_hdr)); if (err == ERR_OK) { #if ZEPIF_LOOPBACK zepif_udp_recv(netif, state->pcb, pbuf_clone(PBUF_RAW, PBUF_RAM, q), NULL, 0); #endif err = udp_sendto(state->pcb, q, state->init.zep_dst_ip_addr, state->init.zep_dst_udp_port); } pbuf_free(q); return err; }
err_t snmp_pbuf_stream_writebuf(struct snmp_pbuf_stream *pbuf_stream, const void *buf, u16_t buf_len) { if (pbuf_stream->length < buf_len) { return ERR_BUF; } if (pbuf_take_at(pbuf_stream->pbuf, buf, buf_len, pbuf_stream->offset) != ERR_OK) { return ERR_BUF; } pbuf_stream->offset += buf_len; pbuf_stream->length -= buf_len; return ERR_OK; }