static void send(int argc, char **argv) { if (argc < 2) { puts("Send n bytes to fe80::1\n"); puts("Usage: send <n>"); return; } ipv6_hdr_t ipv6_hdr; netdev_hlist_t ulh = { NULL, NULL, &ipv6_hdr, sizeof(ipv6_hdr_t) }; long long n = atoll(argv[1]); uint8_t bytes[n]; uint16_t dest = 1; if (n < 0 || n >= (1 << 16)) { puts("n must be a 16-bit unsigned integer"); return; } for (int i = 0; i < n; i++) { bytes[i] = data_value; } data_value++; ulh.next = &ulh; ulh.prev = &ulh; ipv6_hdr_set_version(&ipv6_hdr); ipv6_hdr_set_trafficclass(&ipv6_hdr, 0); ipv6_hdr_set_flowlabel(&ipv6_hdr, 0); ipv6_hdr.length = byteorder_htons((uint16_t)n); ipv6_hdr.nextheader = IPV6_PROTO_NUM_NONE; ipv6_hdr.hoplimit = 64; ipv6_hdr.srcaddr.u64[0] = byteorder_htonll(0xfe80000000000000); ipv6_hdr.srcaddr.u32[2] = byteorder_htonl(0x000000ff); ipv6_hdr.srcaddr.u16[6] = byteorder_htons(0xfe00); ipv6_hdr.srcaddr.u16[7] = byteorder_htons(src); ipv6_hdr.destaddr.u64[0] = byteorder_htonll(0xfe80000000000000); ipv6_hdr.destaddr.u32[2] = byteorder_htonl(0x000000ff); ipv6_hdr.destaddr.u16[6] = byteorder_htons(0xfe00); ipv6_hdr.destaddr.u16[7] = byteorder_htons(dest); netapi_send_data2(sixlowpan, &ulh, &dest, sizeof(uint16_t), bytes, n); }
size_t gnrc_sixlowpan_iphc_decode(gnrc_pktsnip_t **dec_hdr, gnrc_pktsnip_t *pkt, size_t datagram_size, size_t offset, size_t *nh_len) { gnrc_pktsnip_t *ipv6; gnrc_netif_hdr_t *netif_hdr = pkt->next->data; ipv6_hdr_t *ipv6_hdr; uint8_t *iphc_hdr = pkt->data; size_t payload_offset = SIXLOWPAN_IPHC_HDR_LEN; gnrc_sixlowpan_ctx_t *ctx = NULL; assert(dec_hdr != NULL); ipv6 = *dec_hdr; assert(ipv6 != NULL); assert(ipv6->size >= sizeof(ipv6_hdr_t)); ipv6_hdr = ipv6->data; iphc_hdr += offset; if (iphc_hdr[IPHC2_IDX] & SIXLOWPAN_IPHC2_CID_EXT) { payload_offset++; } ipv6_hdr_set_version(ipv6_hdr); switch (iphc_hdr[IPHC1_IDX] & SIXLOWPAN_IPHC1_TF) { case IPHC_TF_ECN_DSCP_FL: ipv6_hdr_set_tc(ipv6_hdr, iphc_hdr[payload_offset++]); ipv6_hdr->v_tc_fl.u8[1] |= iphc_hdr[payload_offset++] & 0x0f; ipv6_hdr->v_tc_fl.u8[2] |= iphc_hdr[payload_offset++]; ipv6_hdr->v_tc_fl.u8[3] |= iphc_hdr[payload_offset++]; break; case IPHC_TF_ECN_FL: ipv6_hdr_set_tc_ecn(ipv6_hdr, iphc_hdr[payload_offset] >> 6); ipv6_hdr_set_tc_dscp(ipv6_hdr, 0); ipv6_hdr->v_tc_fl.u8[1] |= iphc_hdr[payload_offset++] & 0x0f; ipv6_hdr->v_tc_fl.u8[2] |= iphc_hdr[payload_offset++]; ipv6_hdr->v_tc_fl.u8[3] |= iphc_hdr[payload_offset++]; break; case IPHC_TF_ECN_DSCP: ipv6_hdr_set_tc(ipv6_hdr, iphc_hdr[payload_offset++]); ipv6_hdr_set_fl(ipv6_hdr, 0); break; case IPHC_TF_ECN_ELIDE: ipv6_hdr_set_tc(ipv6_hdr, 0); ipv6_hdr_set_fl(ipv6_hdr, 0); break; } if (!(iphc_hdr[IPHC1_IDX] & SIXLOWPAN_IPHC1_NH)) { ipv6_hdr->nh = iphc_hdr[payload_offset++]; } switch (iphc_hdr[IPHC1_IDX] & SIXLOWPAN_IPHC1_HL) { case IPHC_HL_INLINE: ipv6_hdr->hl = iphc_hdr[payload_offset++]; break; case IPHC_HL_1: ipv6_hdr->hl = 1; break; case IPHC_HL_64: ipv6_hdr->hl = 64; break; case IPHC_HL_255: ipv6_hdr->hl = 255; break; } if (iphc_hdr[IPHC2_IDX] & SIXLOWPAN_IPHC2_SAC) { uint8_t sci = 0; if (iphc_hdr[IPHC2_IDX] & SIXLOWPAN_IPHC2_CID_EXT) { sci = iphc_hdr[CID_EXT_IDX] >> 4; }