diff options
Diffstat (limited to 'lib/prefix.c')
| -rw-r--r-- | lib/prefix.c | 583 | 
1 files changed, 114 insertions, 469 deletions
diff --git a/lib/prefix.c b/lib/prefix.c index 85bbb18f3d..806df0b4c6 100644 --- a/lib/prefix.c +++ b/lib/prefix.c @@ -37,394 +37,6 @@ DEFINE_MTYPE_STATIC(LIB, PREFIX_FLOWSPEC, "Prefix Flowspec")  static const uint8_t maskbit[] = {0x00, 0x80, 0xc0, 0xe0, 0xf0,  				  0xf8, 0xfc, 0xfe, 0xff}; -static const struct in6_addr maskbytes6[] = { -	/* /0   */ {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -		      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /1   */ -	{{{0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /2   */ -	{{{0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /3   */ -	{{{0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /4   */ -	{{{0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /5   */ -	{{{0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /6   */ -	{{{0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /7   */ -	{{{0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /8   */ -	{{{0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /9   */ -	{{{0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /10  */ -	{{{0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /11  */ -	{{{0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /12  */ -	{{{0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /13  */ -	{{{0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /14  */ -	{{{0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /15  */ -	{{{0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /16  */ -	{{{0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /17  */ -	{{{0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /18  */ -	{{{0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /19  */ -	{{{0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /20  */ -	{{{0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /21  */ -	{{{0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /22  */ -	{{{0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /23  */ -	{{{0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /24  */ -	{{{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /25  */ -	{{{0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /26  */ -	{{{0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /27  */ -	{{{0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /28  */ -	{{{0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /29  */ -	{{{0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /30  */ -	{{{0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /31  */ -	{{{0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /32  */ -	{{{0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /33  */ -	{{{0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /34  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /35  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /36  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /37  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /38  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /39  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /40  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /41  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /42  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /43  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /44  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /45  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /46  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /47  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /48  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /49  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /50  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /51  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /52  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /53  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /54  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /55  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /56  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /57  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /58  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /59  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /60  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /61  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /62  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /63  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /64  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /65  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /66  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /67  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /68  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /69  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /70  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /71  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /72  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /73  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /74  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /75  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /76  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /77  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /78  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /79  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /80  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /81  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /82  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /83  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /84  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /85  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /86  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /87  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /88  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0x00, 0x00, 0x00, 0x00, 0x00}}}, -	/* /89  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0x80, 0x00, 0x00, 0x00, 0x00}}}, -	/* /90  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xc0, 0x00, 0x00, 0x00, 0x00}}}, -	/* /91  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xe0, 0x00, 0x00, 0x00, 0x00}}}, -	/* /92  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xf0, 0x00, 0x00, 0x00, 0x00}}}, -	/* /93  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xf8, 0x00, 0x00, 0x00, 0x00}}}, -	/* /94  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xfc, 0x00, 0x00, 0x00, 0x00}}}, -	/* /95  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xfe, 0x00, 0x00, 0x00, 0x00}}}, -	/* /96  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0x00, 0x00, 0x00, 0x00}}}, -	/* /97  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0x80, 0x00, 0x00, 0x00}}}, -	/* /98  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xc0, 0x00, 0x00, 0x00}}}, -	/* /99  */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xe0, 0x00, 0x00, 0x00}}}, -	/* /100 */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xf0, 0x00, 0x00, 0x00}}}, -	/* /101 */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xf8, 0x00, 0x00, 0x00}}}, -	/* /102 */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xfc, 0x00, 0x00, 0x00}}}, -	/* /103 */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xfe, 0x00, 0x00, 0x00}}}, -	/* /104 */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xff, 0x00, 0x00, 0x00}}}, -	/* /105 */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xff, 0x80, 0x00, 0x00}}}, -	/* /106 */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xff, 0xc0, 0x00, 0x00}}}, -	/* /107 */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xff, 0xe0, 0x00, 0x00}}}, -	/* /108 */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xff, 0xf0, 0x00, 0x00}}}, -	/* /109 */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xff, 0xf8, 0x00, 0x00}}}, -	/* /110 */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xff, 0xfc, 0x00, 0x00}}}, -	/* /111 */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xff, 0xfe, 0x00, 0x00}}}, -	/* /112 */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xff, 0xff, 0x00, 0x00}}}, -	/* /113 */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xff, 0xff, 0x80, 0x00}}}, -	/* /114 */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xff, 0xff, 0xc0, 0x00}}}, -	/* /115 */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xff, 0xff, 0xe0, 0x00}}}, -	/* /116 */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xff, 0xff, 0xf0, 0x00}}}, -	/* /117 */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xff, 0xff, 0xf8, 0x00}}}, -	/* /118 */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xff, 0xff, 0xfc, 0x00}}}, -	/* /119 */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xff, 0xff, 0xfe, 0x00}}}, -	/* /120 */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xff, 0xff, 0xff, 0x00}}}, -	/* /121 */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xff, 0xff, 0xff, 0x80}}}, -	/* /122 */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xff, 0xff, 0xff, 0xc0}}}, -	/* /123 */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xff, 0xff, 0xff, 0xe0}}}, -	/* /124 */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xff, 0xff, 0xff, 0xf0}}}, -	/* /125 */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xff, 0xff, 0xff, 0xf8}}}, -	/* /126 */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xff, 0xff, 0xff, 0xfc}}}, -	/* /127 */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xff, 0xff, 0xff, 0xfe}}}, -	/* /128 */ -	{{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -	   0xff, 0xff, 0xff, 0xff, 0xff}}}}; -  /* Number of bits in prefix type. */  #ifndef PNBBY  #define PNBBY 8 @@ -432,16 +44,7 @@ static const struct in6_addr maskbytes6[] = {  #define MASKBIT(offset)  ((0xff << (PNBBY - (offset))) & 0xff) -void prefix_hexdump(const struct prefix *p) -{ -	char buf[PREFIX_STRLEN]; - -	zlog_debug("prefix: %s", -		   prefix2str(p, buf, sizeof(buf))); -	zlog_hexdump(p, sizeof(struct prefix)); -} - -int is_zero_mac(struct ethaddr *mac) +int is_zero_mac(const struct ethaddr *mac)  {  	int i = 0; @@ -461,11 +64,6 @@ unsigned int prefix_bit(const uint8_t *prefix, const uint16_t prefixlen)  	return (prefix[offset] >> shift) & 1;  } -unsigned int prefix6_bit(const struct in6_addr *prefix, const uint16_t prefixlen) -{ -	return prefix_bit((const uint8_t *)&prefix->s6_addr, prefixlen); -} -  int str2family(const char *string)  {  	if (!strcmp("ipv4", string)) @@ -601,6 +199,53 @@ int prefix_match(const struct prefix *n, const struct prefix *p)  		if (np[offset] != pp[offset])  			return 0;  	return 1; + +} + +/* + * n is a type5 evpn prefix. This function tries to see if there is an + * ip-prefix within n which matches prefix p + * If n includes p prefix then return 1 else return 0. + */ +int evpn_type5_prefix_match(const struct prefix *n, const struct prefix *p) +{ +	int offset; +	int shift; +	int prefixlen; +	const uint8_t *np, *pp; +	struct prefix_evpn *evp; + +	if (n->family != AF_EVPN) +		return 0; + +	evp = (struct prefix_evpn *)n; +	pp = p->u.val; + +	if ((evp->prefix.route_type != 5) || +	    (p->family == AF_INET6 && !is_evpn_prefix_ipaddr_v6(evp)) || +	    (p->family == AF_INET && !is_evpn_prefix_ipaddr_v4(evp)) || +	    (is_evpn_prefix_ipaddr_none(evp))) +		return 0; + +	prefixlen = evp->prefix.prefix_addr.ip_prefix_length; +	np = &evp->prefix.prefix_addr.ip.ip.addr; + +	/* If n's prefix is longer than p's one return 0. */ +	if (prefixlen > p->prefixlen) +		return 0; + +	offset = prefixlen / PNBBY; +	shift = prefixlen % PNBBY; + +	if (shift) +		if (maskbit[shift] & (np[offset] ^ pp[offset])) +			return 0; + +	while (offset--) +		if (np[offset] != pp[offset]) +			return 0; +	return 1; +  }  /* If n includes p then return 1 else return 0. Prefix mask is not considered */ @@ -773,8 +418,18 @@ int prefix_cmp(union prefixconstptr up1, union prefixconstptr up2)  	if (i)  		return i; -	return numcmp(pp1[offset] & maskbit[shift], -		      pp2[offset] & maskbit[shift]); +	/* +	 * At this point offset was the same, if we have shift +	 * that means we still have data to compare, if shift is +	 * 0 then we are at the end of the data structure +	 * and should just return, as that we will be accessing +	 * memory beyond the end of the party zone +	 */ +	if (shift) +		return numcmp(pp1[offset] & maskbit[shift], +			      pp2[offset] & maskbit[shift]); + +	return 0;  }  /* @@ -848,12 +503,12 @@ struct prefix_ipv4 *prefix_ipv4_new(void)  }  /* Free prefix_ipv4 structure. */ -void prefix_ipv4_free(struct prefix_ipv4 *p) +void prefix_ipv4_free(struct prefix_ipv4 **p)  { -	prefix_free((struct prefix *)p); +	prefix_free((struct prefix **)p);  } -/* When string format is invalid return 0. */ +/* If given string is valid return 1 else return 0 */  int str2prefix_ipv4(const char *str, struct prefix_ipv4 *p)  {  	int ret; @@ -881,8 +536,10 @@ int str2prefix_ipv4(const char *str, struct prefix_ipv4 *p)  		cp = XMALLOC(MTYPE_TMP, (pnt - str) + 1);  		memcpy(cp, str, pnt - str);  		*(cp + (pnt - str)) = '\0'; -		ret = inet_aton(cp, &p->prefix); +		ret = inet_pton(AF_INET, cp, &p->prefix);  		XFREE(MTYPE_TMP, cp); +		if (ret == 0) +			return 0;  		/* Get prefix length. */  		plen = (uint8_t)atoi(++pnt); @@ -1018,12 +675,12 @@ struct prefix_ipv6 *prefix_ipv6_new(void)  }  /* Free prefix for IPv6. */ -void prefix_ipv6_free(struct prefix_ipv6 *p) +void prefix_ipv6_free(struct prefix_ipv6 **p)  { -	prefix_free((struct prefix *)p); +	prefix_free((struct prefix **)p);  } -/* If given string is valid return pin6 else return NULL */ +/* If given string is valid return 1 else return 0 */  int str2prefix_ipv6(const char *str, struct prefix_ipv6 *p)  {  	char *pnt; @@ -1062,31 +719,46 @@ int str2prefix_ipv6(const char *str, struct prefix_ipv6 *p)   * FIXME return uint8_t as ip_maskleni() does. */  int ip6_masklen(struct in6_addr netmask)  { -	int len = 0; -	unsigned char val; -	unsigned char *pnt; - -	pnt = (unsigned char *)&netmask; - -	while ((*pnt == 0xff) && len < IPV6_MAX_BITLEN) { -		len += 8; -		pnt++; -	} - -	if (len < IPV6_MAX_BITLEN) { -		val = *pnt; -		while (val) { -			len++; -			val <<= 1; -		} -	} -	return len; +	if (netmask.s6_addr32[0] != 0xffffffffU) +		return __builtin_clz(~ntohl(netmask.s6_addr32[0])); +	if (netmask.s6_addr32[1] != 0xffffffffU) +		return __builtin_clz(~ntohl(netmask.s6_addr32[1])) + 32; +	if (netmask.s6_addr32[2] != 0xffffffffU) +		return __builtin_clz(~ntohl(netmask.s6_addr32[2])) + 64; +	if (netmask.s6_addr32[3] != 0xffffffffU) +		return __builtin_clz(~ntohl(netmask.s6_addr32[3])) + 96; +	/* note __builtin_clz(0) is undefined */ +	return 128;  }  void masklen2ip6(const int masklen, struct in6_addr *netmask)  {  	assert(masklen >= 0 && masklen <= IPV6_MAX_BITLEN); -	memcpy(netmask, maskbytes6 + masklen, sizeof(struct in6_addr)); + +	if (masklen == 0) { +		/* note << 32 is undefined */ +		memset(netmask, 0, sizeof(*netmask)); +	} else if (masklen <= 32) { +		netmask->s6_addr32[0] = htonl(0xffffffffU << (32 - masklen)); +		netmask->s6_addr32[1] = 0; +		netmask->s6_addr32[2] = 0; +		netmask->s6_addr32[3] = 0; +	} else if (masklen <= 64) { +		netmask->s6_addr32[0] = 0xffffffffU; +		netmask->s6_addr32[1] = htonl(0xffffffffU << (64 - masklen)); +		netmask->s6_addr32[2] = 0; +		netmask->s6_addr32[3] = 0; +	} else if (masklen <= 96) { +		netmask->s6_addr32[0] = 0xffffffffU; +		netmask->s6_addr32[1] = 0xffffffffU; +		netmask->s6_addr32[2] = htonl(0xffffffffU << (96 - masklen)); +		netmask->s6_addr32[3] = 0; +	} else { +		netmask->s6_addr32[0] = 0xffffffffU; +		netmask->s6_addr32[1] = 0xffffffffU; +		netmask->s6_addr32[2] = 0xffffffffU; +		netmask->s6_addr32[3] = htonl(0xffffffffU << (128 - masklen)); +	}  }  void apply_mask_ipv6(struct prefix_ipv6 *p) @@ -1124,33 +796,6 @@ void apply_mask(struct prefix *p)  	return;  } -/* Utility function of convert between struct prefix <=> union sockunion. - * FIXME This function isn't used anywhere. */ -struct prefix *sockunion2prefix(const union sockunion *dest, -				const union sockunion *mask) -{ -	if (dest->sa.sa_family == AF_INET) { -		struct prefix_ipv4 *p; - -		p = prefix_ipv4_new(); -		p->family = AF_INET; -		p->prefix = dest->sin.sin_addr; -		p->prefixlen = ip_masklen(mask->sin.sin_addr); -		return (struct prefix *)p; -	} -	if (dest->sa.sa_family == AF_INET6) { -		struct prefix_ipv6 *p; - -		p = prefix_ipv6_new(); -		p->family = AF_INET6; -		p->prefixlen = ip6_masklen(mask->sin6.sin6_addr); -		memcpy(&p->prefix, &dest->sin6.sin6_addr, -		       sizeof(struct in6_addr)); -		return (struct prefix *)p; -	} -	return NULL; -} -  /* Utility function of convert between struct prefix <=> union sockunion. */  struct prefix *sockunion2hostprefix(const union sockunion *su,  				    struct prefix *prefix) @@ -1425,10 +1070,18 @@ struct prefix *prefix_new(void)  	return p;  } +void prefix_free_lists(void *arg) +{ +	struct prefix *p = arg; + +	prefix_free(&p); +} +  /* Free prefix structure. */ -void prefix_free(struct prefix *p) +void prefix_free(struct prefix **p)  { -	XFREE(MTYPE_PREFIX, p); +	XFREE(MTYPE_PREFIX, *p); +	*p = NULL;  }  /* Utility function to convert ipv4 prefixes to Classful prefixes */ @@ -1454,14 +1107,6 @@ void apply_classful_mask_ipv4(struct prefix_ipv4 *p)  	}  } -in_addr_t ipv4_network_addr(in_addr_t hostaddr, int masklen) -{ -	struct in_addr mask; - -	masklen2ip(masklen, &mask); -	return hostaddr & mask.s_addr; -} -  in_addr_t ipv4_broadcast_addr(in_addr_t hostaddr, int masklen)  {  	struct in_addr mask;  | 
