ng_pktsnip_t *ng_icmpv6_echo_build(uint8_t type, uint16_t id, uint16_t seq, uint8_t *data, size_t data_len) { ng_pktsnip_t *pkt; ng_icmpv6_echo_t *echo; if ((pkt = ng_icmpv6_build(NULL, type, 0, data_len + sizeof(ng_icmpv6_echo_t))) == NULL) { return NULL; } DEBUG("icmpv6_echo: Building echo message with type=%" PRIu8 "id=%" PRIu16 ", seq=%" PRIu16, type, id, seq); echo = (ng_icmpv6_echo_t *)pkt->data; echo->id = byteorder_htons(id); echo->seq = byteorder_htons(seq); if (data != NULL) { memcpy(echo + 1, data, data_len); #if defined(MODULE_OD) && ENABLE_DEBUG DEBUG(", payload:\n"); od_hex_dump(data, data_len, OD_WIDTH_DEFAULT); #endif DEBUG("\n"); } #if ENABLE_DEBUG else { DEBUG("\n"); } #endif return pkt; }
ng_pktsnip_t *ng_ndp_nbr_adv_build(uint8_t flags, ng_ipv6_addr_t *tgt, ng_pktsnip_t *options) { ng_pktsnip_t *pkt; ng_ndp_nbr_adv_t *nbr_adv; DEBUG("ndp: building neighbor advertisement message\n"); if (ng_ipv6_addr_is_multicast(tgt)) { DEBUG("ndp: tgt must not be multicast\n"); return NULL; } pkt = ng_icmpv6_build(options, NG_ICMPV6_NBR_ADV, 0, sizeof(ng_ndp_nbr_adv_t)); if (pkt == NULL) { return NULL; } nbr_adv = pkt->data; nbr_adv->flags = (flags & NG_NDP_NBR_ADV_FLAGS_MASK); nbr_adv->resv[0] = nbr_adv->resv[1] = nbr_adv->resv[2] = 0; memcpy(&nbr_adv->tgt, tgt, sizeof(ng_ipv6_addr_t)); return pkt; }
ng_pktsnip_t *ng_ndp_nbr_sol_build(ng_ipv6_addr_t *tgt, ng_pktsnip_t *options) { ng_pktsnip_t *pkt; DEBUG("ndp: building neighbor solicitation message\n"); if (ng_ipv6_addr_is_multicast(tgt)) { DEBUG("ndp: tgt must not be multicast\n"); return NULL; } pkt = ng_icmpv6_build(options, NG_ICMPV6_NBR_SOL, 0, sizeof(ng_ndp_nbr_sol_t)); if (pkt != NULL) { ng_ndp_nbr_sol_t *nbr_sol = pkt->data; nbr_sol->resv.u32 = 0; nbr_sol->tgt.u64[0].u64 = tgt->u64[0].u64; nbr_sol->tgt.u64[1].u64 = tgt->u64[1].u64; } return pkt; }