| /**************************************************************************** |
| * net/inet/ipv6_build_header.c |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| * |
| * 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 <nuttx/config.h> |
| #include <debug.h> |
| #include <nuttx/net/ip.h> |
| #include <nuttx/net/netconfig.h> |
| |
| #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 */ |