/* Device driver will call this function which returns immediately. * Incoming packet will be processed later on in the dev loop. */ int32_t pico_stack_recv(struct pico_device *dev, uint8_t *buffer, uint32_t len) { struct pico_frame *f; int32_t ret; if (len == 0) return -1; f = pico_frame_alloc(len); if (!f) { dbg("Cannot alloc incoming frame!\n"); return -1; } /* Association to the device that just received the frame. */ f->dev = dev; /* Setup the start pointer, length. */ f->start = f->buffer; f->len = f->buffer_len; if (f->len > 8) { uint32_t rand, mid_frame = (f->buffer_len >> 2) << 1; mid_frame -= (mid_frame % 4); memcpy(&rand, f->buffer + mid_frame, sizeof(uint32_t)); pico_rand_feed(rand); }
/* Device driver will call this function which returns immediately. * Incoming packet will be processed later on in the dev loop. */ int pico_stack_recv(struct pico_device *dev, uint8_t *buffer, int len) { struct pico_frame *f; int ret; if (len <= 0) return -1; f = pico_frame_alloc(len); if (!f) return -1; /* Association to the device that just received the frame. */ f->dev = dev; /* Setup the start pointer, lenght. */ f->start = f->buffer; f->len = f->buffer_len; if (f->len > 8) { int mid_frame = (f->buffer_len >> 2)<<1; mid_frame -= (mid_frame % 4); pico_rand_feed(*(uint32_t*)(f->buffer + mid_frame)); }
uint32_t pico_rand(void) { pico_rand_feed((uint32_t)pico_tick); return _rand_seed; }