| /**************************************************************************** |
| * apps/netutils/netlib/netlib_prefix2ipv6netmask.c |
| * |
| * Copyright (C) 2015 Gregory Nutt. All rights reserved. |
| * Author: Gregory Nutt <gnutt@nuttx.org> |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in |
| * the documentation and/or other materials provided with the |
| * distribution. |
| * 3. Neither the name NuttX nor the names of its contributors may be |
| * used to endorse or promote products derived from this software |
| * without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS |
| * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE |
| * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
| * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
| * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS |
| * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED |
| * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
| * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN |
| * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| * POSSIBILITY OF SUCH DAMAGE. |
| * |
| ****************************************************************************/ |
| |
| /**************************************************************************** |
| * Included Files |
| ****************************************************************************/ |
| |
| #include <nuttx/config.h> |
| |
| #include <stdint.h> |
| #include <netinet/ip.h> |
| |
| #include "netutils/netlib.h" |
| |
| #ifdef CONFIG_NET_IPv6 |
| |
| /**************************************************************************** |
| * Public Functions |
| ****************************************************************************/ |
| |
| /**************************************************************************** |
| * Function: netlib_prefix2ipv6netmask |
| * |
| * Description: |
| * Convert a IPv6 prefix length to a network mask. The prefix length |
| * specifies the number of MS bits under mask (0-128) |
| * |
| * Parameters: |
| * preflen - Determines the width of the netmask (in bits). Range 0-128 |
| * netmask - The location to return the netmask. |
| * |
| * Returned Value: |
| * None |
| * |
| ****************************************************************************/ |
| |
| void netlib_prefix2ipv6netmask(uint8_t preflen, FAR struct in6_addr *netmask) |
| { |
| FAR uint16_t *mask = netmask->s6_addr16; |
| unsigned int bit; |
| unsigned int i; |
| |
| /* Set the network mask. preflen is the number of MS bits under the mask. |
| * |
| * Eg. preflen = 38 |
| * NETMASK: ffff ffff fc00 0000 0000 0000 0000 0000 |
| * bit: 1 1..1 |
| * 1 1..3 3..4 4..6 6..7 8..9 9..1 1..2 |
| * 0..5 6..1 2..7 8..3 4..9 0..5 6..1 2..7 |
| * preflen: 1 1..1 |
| * 1 1..3 3..4 4..6 6..8 8..9 9..1 1..2 |
| * 1..6 7..2 3..8 9..4 5..0 1..6 7..2 3..8 |
| */ |
| |
| for (i = 0; i < 7; i++) |
| { |
| /* bit = {0, 16, 32, 48, 64, 80, 96, 112} */ |
| |
| bit = i << 4; |
| |
| if (preflen > bit) |
| { |
| /* Eg. preflen = 38, bit = {0, 16, 32} */ |
| |
| if (preflen > (bit + 16)) |
| { |
| /* Eg. preflen = 38, bit = {0, 16} */ |
| |
| mask[i] = 0xffff; |
| } |
| else |
| { |
| /* Eg. preflen = 38, bit = {32} |
| * bit - preflen = 6 |
| * make = 0xffff << (16-6) |
| * = 0xfc00 |
| */ |
| |
| mask[i] = 0xffff << (16 - (bit - preflen)); |
| } |
| } |
| else |
| { |
| /* Eg. preflen=38, bit= {48, 64, 80, 112} */ |
| |
| mask[i] = 0x0000; |
| } |
| } |
| } |
| |
| #endif /* CONFIG_NET_IPv6 */ |