]>
git.proxmox.com Git - mirror_frr.git/blob - ospf6d/ospf6_prefix.c
1542200cadb96cb7f672149142e075479a691ee6
2 * Copyright (C) 1999 Yasuhiro Ohara
4 * This file is part of GNU Zebra.
6 * GNU Zebra is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2, or (at your option) any
11 * GNU Zebra is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with GNU Zebra; see the file COPYING. If not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
31 #include "ospf6_prefix.h"
40 ospf6_prefix_create (u_int8_t options
, u_int16_t metric
, struct prefix_ipv6
*p
)
42 struct prefix_ipv6 prefix
;
43 struct ospf6_prefix
*o6p
;
46 /* copy prefix and apply mask */
47 prefix_copy ((struct prefix
*) &prefix
, (struct prefix
*) p
);
48 apply_mask_ipv6 (&prefix
);
50 size
= OSPF6_PREFIX_SPACE (prefix
.prefixlen
) + sizeof (struct ospf6_prefix
);
51 o6p
= (struct ospf6_prefix
*) XMALLOC (MTYPE_OSPF6_PREFIX
, size
);
53 zlog_warn ("Can't allocate memory for ospf6 prefix: size: %d", size
);
55 memset (o6p
, 0, size
);
57 o6p
->prefix_length
= prefix
.prefixlen
;
58 o6p
->prefix_options
= options
;
59 o6p
->prefix_metric
= htons (metric
);
60 memcpy (o6p
+ 1, &prefix
.prefix
, OSPF6_PREFIX_SPACE (prefix
.prefixlen
));
66 ospf6_prefix_delete (struct ospf6_prefix
*p
)
68 XFREE (MTYPE_OSPF6_PREFIX
, p
);
72 ospf6_prefix_issame (struct ospf6_prefix
*p1
, struct ospf6_prefix
*p2
)
74 if (p1
->prefix_length
!= p2
->prefix_length
)
76 if (memcmp (&p1
->u
, &p2
->u
, sizeof (p1
->u
)))
78 if (memcmp (p1
+ 1, p2
+ 1, OSPF6_PREFIX_SPACE (p1
->prefix_length
)))
84 ospf6_prefix_lookup (list l
, struct ospf6_prefix
*p1
)
87 struct ospf6_prefix
*p2
;
88 for (node
= listhead (l
); node
; nextnode (node
))
90 p2
= (struct ospf6_prefix
*) getdata (node
);
91 if (ospf6_prefix_issame (p1
, p2
))
97 /* add a copy of given prefix to the list */
99 ospf6_prefix_add (list l
, struct ospf6_prefix
*p
)
101 struct ospf6_prefix
*add
;
102 add
= (struct ospf6_prefix
*) XMALLOC (MTYPE_OSPF6_PREFIX
,
103 OSPF6_PREFIX_SIZE (p
));
106 zlog_warn ("Can't allocate memory for ospf6 prefix");
110 memcpy (add
, p
, OSPF6_PREFIX_SIZE (p
));
112 if (ospf6_prefix_lookup (l
, add
))
114 ospf6_prefix_delete (add
);
117 listnode_add (l
, add
);
121 ospf6_prefix_remove (list l
, struct ospf6_prefix
*p
)
123 struct ospf6_prefix
*rem
;
124 rem
= ospf6_prefix_lookup (l
, p
);
127 listnode_delete (l
, rem
);
128 ospf6_prefix_delete (rem
);
133 ospf6_prefix_in6_addr (struct ospf6_prefix
*o6p
, struct in6_addr
*in6
)
135 memset (in6
, 0, sizeof (struct in6_addr
));
136 memcpy (in6
, o6p
+ 1, OSPF6_PREFIX_SPACE (o6p
->prefix_length
));
141 ospf6_prefix_options_str (u_int8_t opt
, char *buf
, size_t bufsize
)
143 char *p
, *mc
, *la
, *nu
;
145 p
= (CHECK_FLAG (opt
, OSPF6_PREFIX_OPTION_P
) ? "P" : "-");
146 mc
= (CHECK_FLAG (opt
, OSPF6_PREFIX_OPTION_MC
) ? "MC" : "--");
147 la
= (CHECK_FLAG (opt
, OSPF6_PREFIX_OPTION_LA
) ? "LA" : "--");
148 nu
= (CHECK_FLAG (opt
, OSPF6_PREFIX_OPTION_NU
) ? "NU" : "--");
150 snprintf (buf
, bufsize
, "%s|%s|%s|%s", p
, mc
, la
, nu
);
155 ospf6_prefix_string (struct ospf6_prefix
*prefix
, char *buf
, size_t size
)
160 memset (&in6
, 0, sizeof (in6
));
161 memcpy (&in6
, prefix
+ 1, OSPF6_PREFIX_SPACE (prefix
->prefix_length
));
162 inet_ntop (AF_INET6
, &in6
, s
, sizeof (s
));
164 snprintf (buf
, size
, "%s/%d", s
, prefix
->prefix_length
);
169 ospf6_prefix_copy (struct ospf6_prefix
*dst
, struct ospf6_prefix
*src
,
174 memset (dst
, 0, dstsize
);
176 srcsize
= OSPF6_PREFIX_SIZE (src
);
177 if (dstsize
< srcsize
)
178 memcpy (dst
, src
, dstsize
);
180 memcpy (dst
, src
, srcsize
);
186 ospf6_prefix_apply_mask (struct ospf6_prefix
*o6p
)
193 ospf6_prefix_in6_addr (o6p
, &in6
);
194 inet_ntop (AF_INET6
, &in6
, buf
, sizeof (buf
));
196 pnt
= (u_char
*)(o6p
+ 1);
197 index
= o6p
->prefix_length
/ 8;
198 offset
= o6p
->prefix_length
% 8;
199 mask
= 0xff << (8 - offset
);
207 while (index
< OSPF6_PREFIX_SPACE (o6p
->prefix_length
))
210 ospf6_prefix_in6_addr (o6p
, &in6
);
211 inet_ntop (AF_INET6
, &in6
, buf
, sizeof (buf
));