1/* 2 * Prefix related functions. 3 * Copyright (C) 1997, 98, 99 Kunihiro Ishiguro 4 * 5 * This file is part of GNU Zebra. 6 * 7 * GNU Zebra is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU General Public License as published by the 9 * Free Software Foundation; either version 2, or (at your option) any 10 * later version. 11 * 12 * GNU Zebra is distributed in the hope that it will be useful, but 13 * WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with GNU Zebra; see the file COPYING. If not, write to the Free 19 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 20 * 02111-1307, USA. 21 */ 22 23#include <zebra.h> 24 25#include "prefix.h" 26#include "vty.h" 27#include "sockunion.h" 28#include "memory.h" 29#include "log.h" 30 31/* Maskbit. */ 32static const u_char maskbit[] = {0x00, 0x80, 0xc0, 0xe0, 0xf0, 33 0xf8, 0xfc, 0xfe, 0xff}; 34 35static const struct in6_addr maskbytes6[] = 36{ 37 /* /0 */ { { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 38 /* /1 */ { { { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 39 /* /2 */ { { { 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 40 /* /3 */ { { { 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 41 /* /4 */ { { { 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 42 /* /5 */ { { { 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 43 /* /6 */ { { { 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 44 /* /7 */ { { { 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 45 /* /8 */ { { { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 46 /* /9 */ { { { 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 47 /* /10 */ { { { 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 48 /* /11 */ { { { 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 49 /* /12 */ { { { 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 50 /* /13 */ { { { 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 51 /* /14 */ { { { 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 52 /* /15 */ { { { 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 53 /* /16 */ { { { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 54 /* /17 */ { { { 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 55 /* /18 */ { { { 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 56 /* /19 */ { { { 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 57 /* /20 */ { { { 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 58 /* /21 */ { { { 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 59 /* /22 */ { { { 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 60 /* /23 */ { { { 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 61 /* /24 */ { { { 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 62 /* /25 */ { { { 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 63 /* /26 */ { { { 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 64 /* /27 */ { { { 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 65 /* /28 */ { { { 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 66 /* /29 */ { { { 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 67 /* /30 */ { { { 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 68 /* /31 */ { { { 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 69 /* /32 */ { { { 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 70 /* /33 */ { { { 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 71 /* /34 */ { { { 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 72 /* /35 */ { { { 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 73 /* /36 */ { { { 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 74 /* /37 */ { { { 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 75 /* /38 */ { { { 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 76 /* /39 */ { { { 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 77 /* /40 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 78 /* /41 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 79 /* /42 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 80 /* /43 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 81 /* /44 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 82 /* /45 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 83 /* /46 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 84 /* /47 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 85 /* /48 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 86 /* /49 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 87 /* /50 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 88 /* /51 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 89 /* /52 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 90 /* /53 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 91 /* /54 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 92 /* /55 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 93 /* /56 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 94 /* /57 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 95 /* /58 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 96 /* /59 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 97 /* /60 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 98 /* /61 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 99 /* /62 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 100 /* /63 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 101 /* /64 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 102 /* /65 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 103 /* /66 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 104 /* /67 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 105 /* /68 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 106 /* /69 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 107 /* /70 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 108 /* /71 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 109 /* /72 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 110 /* /73 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 111 /* /74 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 112 /* /75 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 113 /* /76 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 114 /* /77 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 115 /* /78 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 116 /* /79 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 117 /* /80 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 118 /* /81 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 119 /* /82 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 120 /* /83 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 121 /* /84 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 122 /* /85 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 123 /* /86 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 124 /* /87 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 125 /* /88 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 126 /* /89 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00 } } }, 127 /* /90 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00 } } }, 128 /* /91 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00 } } }, 129 /* /92 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00 } } }, 130 /* /93 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00 } } }, 131 /* /94 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00 } } }, 132 /* /95 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00 } } }, 133 /* /96 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 } } }, 134 /* /97 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00 } } }, 135 /* /98 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00 } } }, 136 /* /99 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00 } } }, 137 /* /100 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00 } } }, 138 /* /101 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00 } } }, 139 /* /102 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00 } } }, 140 /* /103 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00 } } }, 141 /* /104 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00 } } }, 142 /* /105 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00 } } }, 143 /* /106 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00 } } }, 144 /* /107 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00 } } }, 145 /* /108 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00 } } }, 146 /* /109 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00 } } }, 147 /* /110 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00 } } }, 148 /* /111 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00 } } }, 149 /* /112 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00 } } }, 150 /* /113 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00 } } }, 151 /* /114 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00 } } }, 152 /* /115 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00 } } }, 153 /* /116 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00 } } }, 154 /* /117 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00 } } }, 155 /* /118 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00 } } }, 156 /* /119 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00 } } }, 157 /* /120 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00 } } }, 158 /* /121 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80 } } }, 159 /* /122 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0 } } }, 160 /* /123 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0 } } }, 161 /* /124 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0 } } }, 162 /* /125 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8 } } }, 163 /* /126 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc } } }, 164 /* /127 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe } } }, 165 /* /128 */ { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } } } 166}; 167 168/* Number of bits in prefix type. */ 169#ifndef PNBBY 170#define PNBBY 8 171#endif /* PNBBY */ 172 173#define MASKBIT(offset) ((0xff << (PNBBY - (offset))) & 0xff) 174 175unsigned int 176prefix_bit (const u_char *prefix, const u_char prefixlen) 177{ 178 unsigned int offset = prefixlen / 8; 179 unsigned int shift = 7 - (prefixlen % 8); 180 181 return (prefix[offset] >> shift) & 1; 182} 183 184unsigned int 185prefix6_bit (const struct in6_addr *prefix, const u_char prefixlen) 186{ 187 return prefix_bit((const u_char *) &prefix->s6_addr, prefixlen); 188} 189 190/* Address Famiy Identifier to Address Family converter. */ 191int 192afi2family (afi_t afi) 193{ 194 if (afi == AFI_IP) 195 return AF_INET; 196#ifdef HAVE_IPV6 197 else if (afi == AFI_IP6) 198 return AF_INET6; 199#endif /* HAVE_IPV6 */ 200 return 0; 201} 202 203afi_t 204family2afi (int family) 205{ 206 if (family == AF_INET) 207 return AFI_IP; 208#ifdef HAVE_IPV6 209 else if (family == AF_INET6) 210 return AFI_IP6; 211#endif /* HAVE_IPV6 */ 212 return 0; 213} 214 215/* If n includes p prefix then return 1 else return 0. */ 216int 217prefix_match (const struct prefix *n, const struct prefix *p) 218{ 219 int offset; 220 int shift; 221 const u_char *np, *pp; 222 223 /* If n's prefix is longer than p's one return 0. */ 224 if (n->prefixlen > p->prefixlen) 225 return 0; 226 227 /* Set both prefix's head pointer. */ 228 np = (const u_char *)&n->u.prefix; 229 pp = (const u_char *)&p->u.prefix; 230 231 offset = n->prefixlen / PNBBY; 232 shift = n->prefixlen % PNBBY; 233 234 if (shift) 235 if (maskbit[shift] & (np[offset] ^ pp[offset])) 236 return 0; 237 238 while (offset--) 239 if (np[offset] != pp[offset]) 240 return 0; 241 return 1; 242} 243 244/* Copy prefix from src to dest. */ 245void 246prefix_copy (struct prefix *dest, const struct prefix *src) 247{ 248 dest->family = src->family; 249 dest->prefixlen = src->prefixlen; 250 251 if (src->family == AF_INET) 252 dest->u.prefix4 = src->u.prefix4; 253#ifdef HAVE_IPV6 254 else if (src->family == AF_INET6) 255 dest->u.prefix6 = src->u.prefix6; 256#endif /* HAVE_IPV6 */ 257 else if (src->family == AF_UNSPEC) 258 { 259 dest->u.lp.id = src->u.lp.id; 260 dest->u.lp.adv_router = src->u.lp.adv_router; 261 } 262 else 263 { 264 zlog (NULL, LOG_ERR, "prefix_copy(): Unknown address family %d", 265 src->family); 266 assert (0); 267 } 268} 269 270/* 271 * Return 1 if the address/netmask contained in the prefix structure 272 * is the same, and else return 0. For this routine, 'same' requires 273 * that not only the prefix length and the network part be the same, 274 * but also the host part. Thus, 10.0.0.1/8 and 10.0.0.2/8 are not 275 * the same. Note that this routine has the same return value sense 276 * as '==' (which is different from prefix_cmp). 277 */ 278int 279prefix_same (const struct prefix *p1, const struct prefix *p2) 280{ 281 if (p1->family == p2->family && p1->prefixlen == p2->prefixlen) 282 { 283 if (p1->family == AF_INET) 284 if (IPV4_ADDR_SAME (&p1->u.prefix4.s_addr, &p2->u.prefix4.s_addr)) 285 return 1; 286#ifdef HAVE_IPV6 287 if (p1->family == AF_INET6 ) 288 if (IPV6_ADDR_SAME (&p1->u.prefix6.s6_addr, &p2->u.prefix6.s6_addr)) 289 return 1; 290#endif /* HAVE_IPV6 */ 291 } 292 return 0; 293} 294 295/* 296 * Return 0 if the network prefixes represented by the struct prefix 297 * arguments are the same prefix, and 1 otherwise. Network prefixes 298 * are considered the same if the prefix lengths are equal and the 299 * network parts are the same. Host bits (which are considered masked 300 * by the prefix length) are not significant. Thus, 10.0.0.1/8 and 301 * 10.0.0.2/8 are considered equivalent by this routine. Note that 302 * this routine has the same return sense as strcmp (which is different 303 * from prefix_same). 304 */ 305int 306prefix_cmp (const struct prefix *p1, const struct prefix *p2) 307{ 308 int offset; 309 int shift; 310 311 /* Set both prefix's head pointer. */ 312 const u_char *pp1 = (const u_char *)&p1->u.prefix; 313 const u_char *pp2 = (const u_char *)&p2->u.prefix; 314 315 if (p1->family != p2->family || p1->prefixlen != p2->prefixlen) 316 return 1; 317 318 offset = p1->prefixlen / PNBBY; 319 shift = p1->prefixlen % PNBBY; 320 321 if (shift) 322 if (maskbit[shift] & (pp1[offset] ^ pp2[offset])) 323 return 1; 324 325 while (offset--) 326 if (pp1[offset] != pp2[offset]) 327 return 1; 328 329 return 0; 330} 331 332/* 333 * Count the number of common bits in 2 prefixes. The prefix length is 334 * ignored for this function; the whole prefix is compared. If the prefix 335 * address families don't match, return -1; otherwise the return value is 336 * in range 0 ... maximum prefix length for the address family. 337 */ 338int 339prefix_common_bits (const struct prefix *p1, const struct prefix *p2) 340{ 341 int pos, bit; 342 int length = 0; 343 u_char xor; 344 345 /* Set both prefix's head pointer. */ 346 const u_char *pp1 = (const u_char *)&p1->u.prefix; 347 const u_char *pp2 = (const u_char *)&p2->u.prefix; 348 349 if (p1->family == AF_INET) 350 length = IPV4_MAX_BYTELEN; 351#ifdef HAVE_IPV6 352 if (p1->family == AF_INET6) 353 length = IPV6_MAX_BYTELEN; 354#endif 355 if (p1->family != p2->family || !length) 356 return -1; 357 358 for (pos = 0; pos < length; pos++) 359 if (pp1[pos] != pp2[pos]) 360 break; 361 if (pos == length) 362 return pos * 8; 363 364 xor = pp1[pos] ^ pp2[pos]; 365 for (bit = 0; bit < 8; bit++) 366 if (xor & (1 << (7 - bit))) 367 break; 368 369 return pos * 8 + bit; 370} 371 372/* Return prefix family type string. */ 373const char * 374prefix_family_str (const struct prefix *p) 375{ 376 if (p->family == AF_INET) 377 return "inet"; 378#ifdef HAVE_IPV6 379 if (p->family == AF_INET6) 380 return "inet6"; 381#endif /* HAVE_IPV6 */ 382 return "unspec"; 383} 384 385/* Allocate new prefix_ipv4 structure. */ 386struct prefix_ipv4 * 387prefix_ipv4_new () 388{ 389 struct prefix_ipv4 *p; 390 391 /* Call prefix_new to allocate a full-size struct prefix to avoid problems 392 where the struct prefix_ipv4 is cast to struct prefix and unallocated 393 bytes were being referenced (e.g. in structure assignments). */ 394 p = (struct prefix_ipv4 *)prefix_new(); 395 p->family = AF_INET; 396 return p; 397} 398 399/* Free prefix_ipv4 structure. */ 400void 401prefix_ipv4_free (struct prefix_ipv4 *p) 402{ 403 prefix_free((struct prefix *)p); 404} 405 406/* When string format is invalid return 0. */ 407int 408str2prefix_ipv4 (const char *str, struct prefix_ipv4 *p) 409{ 410 int ret; 411 int plen; 412 char *pnt; 413 char *cp; 414 415 /* Find slash inside string. */ 416 pnt = strchr (str, '/'); 417 418 /* String doesn't contail slash. */ 419 if (pnt == NULL) 420 { 421 /* Convert string to prefix. */ 422 ret = inet_aton (str, &p->prefix); 423 if (ret == 0) 424 return 0; 425 426 /* If address doesn't contain slash we assume it host address. */ 427 p->family = AF_INET; 428 p->prefixlen = IPV4_MAX_BITLEN; 429 430 return ret; 431 } 432 else 433 { 434 cp = XMALLOC (MTYPE_TMP, (pnt - str) + 1); 435 strncpy (cp, str, pnt - str); 436 *(cp + (pnt - str)) = '\0'; 437 ret = inet_aton (cp, &p->prefix); 438 XFREE (MTYPE_TMP, cp); 439 440 /* Get prefix length. */ 441 plen = (u_char) atoi (++pnt); 442 if (plen > IPV4_MAX_PREFIXLEN) 443 return 0; 444 445 p->family = AF_INET; 446 p->prefixlen = plen; 447 } 448 449 return ret; 450} 451 452/* Convert masklen into IP address's netmask (network byte order). */ 453void 454masklen2ip (const int masklen, struct in_addr *netmask) 455{ 456 assert (masklen >= 0 && masklen <= IPV4_MAX_BITLEN); 457 458 /* left shift is only defined for less than the size of the type. 459 * we unconditionally use long long in case the target platform 460 * has defined behaviour for << 32 (or has a 64-bit left shift) */ 461 462 if (sizeof(unsigned long long) > 4) 463 netmask->s_addr = htonl(0xffffffffULL << (32 - masklen)); 464 else 465 netmask->s_addr = htonl(masklen ? 0xffffffffU << (32 - masklen) : 0); 466} 467 468/* Convert IP address's netmask into integer. We assume netmask is 469 sequential one. Argument netmask should be network byte order. */ 470u_char 471ip_masklen (struct in_addr netmask) 472{ 473 uint32_t tmp = ~ntohl(netmask.s_addr); 474 if (tmp) 475 /* clz: count leading zeroes. sadly, the behaviour of this builtin 476 * is undefined for a 0 argument, even though most CPUs give 32 */ 477 return __builtin_clz(tmp); 478 else 479 return 32; 480} 481 482/* Apply mask to IPv4 prefix (network byte order). */ 483void 484apply_mask_ipv4 (struct prefix_ipv4 *p) 485{ 486 struct in_addr mask; 487 masklen2ip(p->prefixlen, &mask); 488 p->prefix.s_addr &= mask.s_addr; 489} 490 491/* If prefix is 0.0.0.0/0 then return 1 else return 0. */ 492int 493prefix_ipv4_any (const struct prefix_ipv4 *p) 494{ 495 return (p->prefix.s_addr == 0 && p->prefixlen == 0); 496} 497 498#ifdef HAVE_IPV6 499 500/* Allocate a new ip version 6 route */ 501struct prefix_ipv6 * 502prefix_ipv6_new (void) 503{ 504 struct prefix_ipv6 *p; 505 506 /* Allocate a full-size struct prefix to avoid problems with structure 507 size mismatches. */ 508 p = (struct prefix_ipv6 *)prefix_new(); 509 p->family = AF_INET6; 510 return p; 511} 512 513/* Free prefix for IPv6. */ 514void 515prefix_ipv6_free (struct prefix_ipv6 *p) 516{ 517 prefix_free((struct prefix *)p); 518} 519 520/* If given string is valid return pin6 else return NULL */ 521int 522str2prefix_ipv6 (const char *str, struct prefix_ipv6 *p) 523{ 524 char *pnt; 525 char *cp; 526 int ret; 527 528 pnt = strchr (str, '/'); 529 530 /* If string doesn't contain `/' treat it as host route. */ 531 if (pnt == NULL) 532 { 533 ret = inet_pton (AF_INET6, str, &p->prefix); 534 if (ret == 0) 535 return 0; 536 p->prefixlen = IPV6_MAX_BITLEN; 537 } 538 else 539 { 540 int plen; 541 542 cp = XMALLOC (0, (pnt - str) + 1); 543 strncpy (cp, str, pnt - str); 544 *(cp + (pnt - str)) = '\0'; 545 ret = inet_pton (AF_INET6, cp, &p->prefix); 546 free (cp); 547 if (ret == 0) 548 return 0; 549 plen = (u_char) atoi (++pnt); 550 if (plen > IPV6_MAX_BITLEN) 551 return 0; 552 p->prefixlen = plen; 553 } 554 p->family = AF_INET6; 555 556 return ret; 557} 558 559/* Convert struct in6_addr netmask into integer. 560 * FIXME return u_char as ip_maskleni() does. */ 561int 562ip6_masklen (struct in6_addr netmask) 563{ 564 int len = 0; 565 unsigned char val; 566 unsigned char *pnt; 567 568 pnt = (unsigned char *) & netmask; 569 570 while ((*pnt == 0xff) && len < IPV6_MAX_BITLEN) 571 { 572 len += 8; 573 pnt++; 574 } 575 576 if (len < IPV6_MAX_BITLEN) 577 { 578 val = *pnt; 579 while (val) 580 { 581 len++; 582 val <<= 1; 583 } 584 } 585 return len; 586} 587 588void 589masklen2ip6 (const int masklen, struct in6_addr *netmask) 590{ 591 assert (masklen >= 0 && masklen <= IPV6_MAX_BITLEN); 592 memcpy (netmask, maskbytes6 + masklen, sizeof (struct in6_addr)); 593} 594 595void 596apply_mask_ipv6 (struct prefix_ipv6 *p) 597{ 598 u_char *pnt; 599 int index; 600 int offset; 601 602 index = p->prefixlen / 8; 603 604 if (index < 16) 605 { 606 pnt = (u_char *) &p->prefix; 607 offset = p->prefixlen % 8; 608 609 pnt[index] &= maskbit[offset]; 610 index++; 611 612 while (index < 16) 613 pnt[index++] = 0; 614 } 615} 616 617void 618str2in6_addr (const char *str, struct in6_addr *addr) 619{ 620 int i; 621 unsigned int x; 622 623 /* %x must point to unsinged int */ 624 for (i = 0; i < 16; i++) 625 { 626 sscanf (str + (i * 2), "%02x", &x); 627 addr->s6_addr[i] = x & 0xff; 628 } 629} 630#endif /* HAVE_IPV6 */ 631 632void 633apply_mask (struct prefix *p) 634{ 635 switch (p->family) 636 { 637 case AF_INET: 638 apply_mask_ipv4 ((struct prefix_ipv4 *)p); 639 break; 640#ifdef HAVE_IPV6 641 case AF_INET6: 642 apply_mask_ipv6 ((struct prefix_ipv6 *)p); 643 break; 644#endif /* HAVE_IPV6 */ 645 default: 646 break; 647 } 648 return; 649} 650 651/* Utility function of convert between struct prefix <=> union sockunion. 652 * FIXME This function isn't used anywhere. */ 653struct prefix * 654sockunion2prefix (const union sockunion *dest, 655 const union sockunion *mask) 656{ 657 if (dest->sa.sa_family == AF_INET) 658 { 659 struct prefix_ipv4 *p; 660 661 p = prefix_ipv4_new (); 662 p->family = AF_INET; 663 p->prefix = dest->sin.sin_addr; 664 p->prefixlen = ip_masklen (mask->sin.sin_addr); 665 return (struct prefix *) p; 666 } 667#ifdef HAVE_IPV6 668 if (dest->sa.sa_family == AF_INET6) 669 { 670 struct prefix_ipv6 *p; 671 672 p = prefix_ipv6_new (); 673 p->family = AF_INET6; 674 p->prefixlen = ip6_masklen (mask->sin6.sin6_addr); 675 memcpy (&p->prefix, &dest->sin6.sin6_addr, sizeof (struct in6_addr)); 676 return (struct prefix *) p; 677 } 678#endif /* HAVE_IPV6 */ 679 return NULL; 680} 681 682/* Utility function of convert between struct prefix <=> union sockunion. */ 683struct prefix * 684sockunion2hostprefix (const union sockunion *su) 685{ 686 if (su->sa.sa_family == AF_INET) 687 { 688 struct prefix_ipv4 *p; 689 690 p = prefix_ipv4_new (); 691 p->family = AF_INET; 692 p->prefix = su->sin.sin_addr; 693 p->prefixlen = IPV4_MAX_BITLEN; 694 return (struct prefix *) p; 695 } 696#ifdef HAVE_IPV6 697 if (su->sa.sa_family == AF_INET6) 698 { 699 struct prefix_ipv6 *p; 700 701 p = prefix_ipv6_new (); 702 p->family = AF_INET6; 703 p->prefixlen = IPV6_MAX_BITLEN; 704 memcpy (&p->prefix, &su->sin6.sin6_addr, sizeof (struct in6_addr)); 705 return (struct prefix *) p; 706 } 707#endif /* HAVE_IPV6 */ 708 return NULL; 709} 710 711void 712prefix2sockunion (const struct prefix *p, union sockunion *su) 713{ 714 memset (su, 0, sizeof (*su)); 715 716 su->sa.sa_family = p->family; 717 if (p->family == AF_INET) 718 su->sin.sin_addr = p->u.prefix4; 719#ifdef HAVE_IPV6 720 if (p->family == AF_INET6) 721 memcpy (&su->sin6.sin6_addr, &p->u.prefix6, sizeof (struct in6_addr)); 722#endif /* HAVE_IPV6 */ 723} 724 725int 726prefix_blen (const struct prefix *p) 727{ 728 switch (p->family) 729 { 730 case AF_INET: 731 return IPV4_MAX_BYTELEN; 732 break; 733#ifdef HAVE_IPV6 734 case AF_INET6: 735 return IPV6_MAX_BYTELEN; 736 break; 737#endif /* HAVE_IPV6 */ 738 } 739 return 0; 740} 741 742/* Generic function for conversion string to struct prefix. */ 743int 744str2prefix (const char *str, struct prefix *p) 745{ 746 int ret; 747 748 /* First we try to convert string to struct prefix_ipv4. */ 749 ret = str2prefix_ipv4 (str, (struct prefix_ipv4 *) p); 750 if (ret) 751 return ret; 752 753#ifdef HAVE_IPV6 754 /* Next we try to convert string to struct prefix_ipv6. */ 755 ret = str2prefix_ipv6 (str, (struct prefix_ipv6 *) p); 756 if (ret) 757 return ret; 758#endif /* HAVE_IPV6 */ 759 760 return 0; 761} 762 763int 764prefix2str (const struct prefix *p, char *str, int size) 765{ 766 char buf[BUFSIZ]; 767 768 inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ); 769 snprintf (str, size, "%s/%d", buf, p->prefixlen); 770 return 0; 771} 772 773struct prefix * 774prefix_new () 775{ 776 struct prefix *p; 777 778 p = XCALLOC (MTYPE_PREFIX, sizeof *p); 779 return p; 780} 781 782/* Free prefix structure. */ 783void 784prefix_free (struct prefix *p) 785{ 786 XFREE (MTYPE_PREFIX, p); 787} 788 789/* Utility function. Check the string only contains digit 790 * character. 791 * FIXME str.[c|h] would be better place for this function. */ 792int 793all_digit (const char *str) 794{ 795 for (; *str != '\0'; str++) 796 if (!isdigit ((int) *str)) 797 return 0; 798 return 1; 799} 800 801/* Utility function to convert ipv4 prefixes to Classful prefixes */ 802void apply_classful_mask_ipv4 (struct prefix_ipv4 *p) 803{ 804 805 u_int32_t destination; 806 807 destination = ntohl (p->prefix.s_addr); 808 809 if (p->prefixlen == IPV4_MAX_PREFIXLEN); 810 /* do nothing for host routes */ 811 else if (IN_CLASSC (destination)) 812 { 813 p->prefixlen=24; 814 apply_mask_ipv4(p); 815 } 816 else if (IN_CLASSB(destination)) 817 { 818 p->prefixlen=16; 819 apply_mask_ipv4(p); 820 } 821 else 822 { 823 p->prefixlen=8; 824 apply_mask_ipv4(p); 825 } 826} 827 828in_addr_t 829ipv4_network_addr (in_addr_t hostaddr, int masklen) 830{ 831 struct in_addr mask; 832 833 masklen2ip (masklen, &mask); 834 return hostaddr & mask.s_addr; 835} 836 837in_addr_t 838ipv4_broadcast_addr (in_addr_t hostaddr, int masklen) 839{ 840 struct in_addr mask; 841 842 masklen2ip (masklen, &mask); 843 return (masklen != IPV4_MAX_PREFIXLEN-1) ? 844 /* normal case */ 845 (hostaddr | ~mask.s_addr) : 846 /* special case for /31 */ 847 (hostaddr ^ ~mask.s_addr); 848} 849 850/* Utility function to convert ipv4 netmask to prefixes 851 ex.) "1.1.0.0" "255.255.0.0" => "1.1.0.0/16" 852 ex.) "1.0.0.0" NULL => "1.0.0.0/8" */ 853int 854netmask_str2prefix_str (const char *net_str, const char *mask_str, 855 char *prefix_str) 856{ 857 struct in_addr network; 858 struct in_addr mask; 859 u_char prefixlen; 860 u_int32_t destination; 861 int ret; 862 863 ret = inet_aton (net_str, &network); 864 if (! ret) 865 return 0; 866 867 if (mask_str) 868 { 869 ret = inet_aton (mask_str, &mask); 870 if (! ret) 871 return 0; 872 873 prefixlen = ip_masklen (mask); 874 } 875 else 876 { 877 destination = ntohl (network.s_addr); 878 879 if (network.s_addr == 0) 880 prefixlen = 0; 881 else if (IN_CLASSC (destination)) 882 prefixlen = 24; 883 else if (IN_CLASSB (destination)) 884 prefixlen = 16; 885 else if (IN_CLASSA (destination)) 886 prefixlen = 8; 887 else 888 return 0; 889 } 890 891 sprintf (prefix_str, "%s/%d", net_str, prefixlen); 892 893 return 1; 894} 895 896#ifdef HAVE_IPV6 897/* Utility function for making IPv6 address string. */ 898const char * 899inet6_ntoa (struct in6_addr addr) 900{ 901 static char buf[INET6_ADDRSTRLEN]; 902 903 inet_ntop (AF_INET6, &addr, buf, INET6_ADDRSTRLEN); 904 return buf; 905} 906#endif /* HAVE_IPV6 */ 907