summaryrefslogtreecommitdiffstats
path: root/bgpd/bgp_aspath.h
blob: 538bada8e456b86baae889727c13c685fac9ad44 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/* AS path related definitions.
   Copyright (C) 1997, 98, 99 Kunihiro Ishiguro

This file is part of GNU Zebra.

GNU Zebra is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.

GNU Zebra is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Zebra; see the file COPYING.  If not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.  */

#ifndef _QUAGGA_BGP_ASPATH_H
#define _QUAGGA_BGP_ASPATH_H

/* AS path segment type.  */
#define AS_SET                       1
#define AS_SEQUENCE                  2
#define AS_CONFED_SEQUENCE           3
#define AS_CONFED_SET                4

/* Private AS range defined in RFC2270.  */
#define BGP_PRIVATE_AS_MIN       64512U
#define BGP_PRIVATE_AS_MAX       65535U

/* we leave BGP_AS_MAX as the 16bit AS MAX number.  */
#define BGP_AS_MAX		 65535U
/* Transition 16Bit AS as defined by IANA */
#define BGP_AS_TRANS		 23456U

/* AS_PATH segment data in abstracted form, no limit is placed on length */
struct assegment
{
  struct assegment *next;
  as_t *as;
  u_short length;
  u_char type;
};

/* AS path may be include some AsSegments.  */
struct aspath 
{
  /* Reference count to this aspath.  */
  unsigned long refcnt;

  /* segment data */
  struct assegment *segments;
  
  /* String expression of AS path.  This string is used by vty output
     and AS path regular expression match.  */
  char *str;
};

#define ASPATH_STR_DEFAULT_LEN 32

/* stuffed this here, with as4 we have different asnumber formats */
enum bgp_asnumber_format
{
  BGP_ASNUMBER_FORMAT_ASDOT,
  BGP_ASNUMBER_FORMAT_ASDOTPLUS,
  BGP_ASNUMBER_FORMAT_ASPLAIN,
  BGP_ASNUMBER_FORMAT_ASIP,

  BGP_ASNUMBER_FORMAT_NOTUSED
};

/* This is the default definition for asnumber output
 * It is used whenever an asnumber is turned into a string
 * so it changes the string representation og aspaths as well as
 * all configuration and command outputs.
 * As of now, it is ASDOT.  It may well become ASPLAIN in the future
 * if the net community should reach consensus for that.
 * Aeh, ASIP is more like a joke, nobody wants this - lets say it is
 * for testing purposes ;-)
 * 
 * As of now, the RIRs and Cisco already use ASDOT so we use that as
 * default.
 * For everybody, the summary (all <...> are given out as decimal value):
 *
 *     asdot   [<higher16bits>.]<lower16bits>
 *              higher16bits ONLY given out if not 0.
 *     asdot+  <higher16bits>.<lower16bits>
 *              higher16bits ALWAYS given out.
 *     asplain <32bits>
 *     asip    <8highestbits><8bitsbelowthem><8bitsfurtherdown><lowest8bits>
 *
 * BTW, quagga automagically munges all of these formats as inputs, no
 * change needed there.    -JK 20061114
 */

#define BGP_ASNUMBER_FORMAT_DEFAULT BGP_ASNUMBER_FORMAT_ASDOT

/* Prototypes. */
extern void aspath_init (void);
extern void aspath_finish (void);
extern struct aspath *aspath_parse (struct stream *, size_t, int);
extern struct aspath *aspath_dup (struct aspath *);
extern struct aspath *aspath_aggregate (struct aspath *, struct aspath *);
extern struct aspath *aspath_prepend (struct aspath *, struct aspath *);
extern struct aspath *aspath_add_seq (struct aspath *, as_t);
extern struct aspath *aspath_add_confed_seq (struct aspath *, as_t);
extern int aspath_cmp_left (struct aspath *, struct aspath *);
extern int aspath_cmp_left_confed (struct aspath *, struct aspath *);
extern struct aspath *aspath_delete_confed_seq (struct aspath *);
extern struct aspath *aspath_empty (void);
extern struct aspath *aspath_empty_get (void);
extern struct aspath *aspath_str2aspath (const char *);
extern void aspath_free (struct aspath *);
extern struct aspath *aspath_intern (struct aspath *);
extern void aspath_unintern (struct aspath *);
extern const char *aspath_print (struct aspath *);
extern void aspath_print_vty (struct vty *, const char *, struct aspath *);
extern void aspath_print_all_vty (struct vty *);
extern unsigned int aspath_key_make (struct aspath *);
extern int aspath_loop_check (struct aspath *, as_t);
extern int aspath_private_as_check (struct aspath *);
extern int aspath_firstas_check (struct aspath *, as_t);
extern unsigned long aspath_count (void);
extern unsigned int aspath_count_hops (struct aspath *);
extern unsigned int aspath_count_confeds (struct aspath *);
extern unsigned int aspath_size (struct aspath *);
extern as_t aspath_highest (struct aspath *);
extern void aspath_put (struct stream *, struct aspath *, int);

extern void aspath_truncateathopsandjoin (struct aspath **, struct aspath **, int);
extern unsigned int aspath_count_num32as (struct aspath *);
extern unsigned int aspath_count_numas (struct aspath *);
extern void aspath_cleanoutall_asconfeds( struct aspath **, unsigned int *);

/* For SNMP BGP4PATHATTRASPATHSEGMENT, might be useful for debug */
extern u_char *aspath_snmp_pathseg (struct aspath *, size_t *);

/* asnumber format things */
extern void setasnumber_format (int);
extern int get_asnumber_format (void);
extern char *as2str(as_t);
extern as_t str2asnum (const char *, const char **);

#endif /* _QUAGGA_BGP_ASPATH_H */