static int pico_dns_client_query_prefix(struct pico_dns_prefix *pre) { uint16_t id = 0; uint8_t retry = 32; do { id = (uint16_t)(pico_rand() & 0xFFFFU); dns_dbg("DNS: generated id %u\n", id); } while (retry-- && pico_dns_client_idcheck(id)); if (!retry) return -1; pre->id = short_be(id); pre->qr = PICO_DNS_QR_QUERY; pre->opcode = PICO_DNS_OPCODE_QUERY; pre->aa = PICO_DNS_AA_NO_AUTHORITY; pre->tc = PICO_DNS_TC_NO_TRUNCATION; pre->rd = PICO_DNS_RD_IS_DESIRED; pre->ra = PICO_DNS_RA_NO_SUPPORT; pre->z = 0; pre->rcode = PICO_DNS_RCODE_NO_ERROR; pre->qdcount = short_be(1); pre->ancount = short_be(0); pre->nscount = short_be(0); pre->arcount = short_be(0); return 0; }
static int pico_vde_send(struct pico_device *dev, void *buf, int len) { struct pico_device_vde *vde = (struct pico_device_vde *) dev; //printf("[%s] send %d bytes.\n", dev->name, len); if ((vde->lost_out == 0) || ((pico_rand() % 100) > vde->lost_out)) return (int)vde_send(vde->conn, buf, (uint32_t)len, 0); else return len; /* Silently discarded "on the wire" */ }
static uint32_t pico_slaacv4_getip(struct pico_device *dev, uint8_t rand) { uint32_t seed = 0; if (dev->eth != NULL) { seed = pico_hash((const uint8_t *)dev->eth->mac.addr, PICO_SIZE_ETH); } if (rand) { seed += pico_rand(); } return SLAACV4_CREATE_IPV4(seed); }
static int pico_vde_poll(struct pico_device *dev, int loop_score) { struct pico_device_vde *vde = (struct pico_device_vde *) dev; struct pollfd pfd; unsigned char buf[VDE_MTU]; int len; pfd.fd = vde_datafd(vde->conn); pfd.events = POLLIN; do { if (poll(&pfd, 1, 0) <= 0) return loop_score; len = vde_recv(vde->conn, buf, VDE_MTU, 0); if (len > 0) { //printf("Received pkt.\n"); if ((vde->lost_in == 0) || ((pico_rand() % 100) > vde->lost_in)) { loop_score--; pico_stack_recv(dev, buf, (uint32_t)len); } } } while(loop_score > 0); return 0; }