/**************************************************************************** * net/inet/ipv6_build_header.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. The * ASF licenses this file to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. * ****************************************************************************/ /**************************************************************************** * Included Files ****************************************************************************/ #include #include #include #include #include "inet.h" #ifdef CONFIG_NET_IPv6 /**************************************************************************** * Public Functions ****************************************************************************/ /**************************************************************************** * Name: ipv6_build_header * * Description: * build IPv6 header * * Input Parameters: * ipv6 Pointer to IPv6 header's buffer * payload_len Length of the IPv6 payload(without IPv6 header length) * prot Type of header immediately following the IPv6 header * src_ip Source IPv6 address * dst_ip Destination IPv6 address * ttl Time to live(IPv4) hop limit(IPv6) * tclass traffic class(IPv6) * * Returned Value: * length of IPv6 header * ****************************************************************************/ uint16_t ipv6_build_header(FAR struct ipv6_hdr_s *ipv6, uint16_t payload_len, uint16_t prot, const net_ipv6addr_t src_ip, const net_ipv6addr_t dst_ip, uint8_t ttl, uint8_t tclass) { /* Set up the IPv6 header */ ipv6->vtc = 0x60; /* Version/traffic class (MS) */ ipv6->tcf = tclass; /* Traffic class(LS)/Flow label(MS) */ ipv6->flow = 0; /* Flow label (LS) */ ipv6->len[0] = (payload_len >> 8); /* Length excludes the IPv6 header */ ipv6->len[1] = (payload_len & 0xff); ipv6->proto = prot; /* Next header */ ipv6->ttl = ttl; /* It's possible to use srcip to initialize destip */ net_ipv6addr_hdrcopy(ipv6->destipaddr, dst_ip); net_ipv6addr_hdrcopy(ipv6->srcipaddr, src_ip); ninfo("IPv6 Payload length: %d\n", payload_len); return IPv6_HDRLEN; } #endif /* CONFIG_NET_IPv6 */