diff options
-rw-r--r-- | bgpd/ChangeLog | 18 | ||||
-rw-r--r-- | bgpd/bgp_attr.c | 12 | ||||
-rw-r--r-- | bgpd/bgp_attr.h | 45 | ||||
-rw-r--r-- | bgpd/bgp_route.h | 58 | ||||
-rw-r--r-- | bgpd/bgp_table.c | 12 | ||||
-rw-r--r-- | bgpd/bgp_table.h | 10 |
6 files changed, 100 insertions, 55 deletions
diff --git a/bgpd/ChangeLog b/bgpd/ChangeLog index 0c8c9d6e..51f2e133 100644 --- a/bgpd/ChangeLog +++ b/bgpd/ChangeLog @@ -1,3 +1,21 @@ +2006-03-12 Paul Jakma <paul.jakma@sun.com> + + * bgp_attr.h: (struct attr) rearrange fields to avoid + wasted padding between them as much as possible. + (attr_count,attr_unknown_count) export new functions to + return number of counts of cached attributes. + * bgp_attr.c: (attr_count,attr_unknown_count) new functions to + return number of counts of cached attributes. + * bgp_route.h: (struct bgp_info) rearrange fields to avoid + wasted padding. + * bgp_table.h: (struct bgp_table) Add a count field, of number + of nodes in the table. + (struct bgp_node) rearrange fields to avoid + wasted padding between them, though I don't think there + was any in this case. + * bgp_table.c: (bgp_node_{delete,get}) Maintain the table node count. + (bgp_table_count) new function to access the table count. + 2006-03-03 Paul Jakma <paul.jakma@sun.com> * bgp_route.c: (bgp_clear_node_complete) Doh. When clearing diff --git a/bgpd/bgp_attr.c b/bgpd/bgp_attr.c index 3b27517d..27ddab11 100644 --- a/bgpd/bgp_attr.c +++ b/bgpd/bgp_attr.c @@ -274,6 +274,18 @@ transit_init () struct hash *attrhash; +unsigned long int +attr_count (void) +{ + return attrhash->count; +} + +unsigned long int +attr_unknown_count (void) +{ + return transit_hash->count; +} + unsigned int attrhash_key_make (struct attr *attr) { diff --git a/bgpd/bgp_attr.h b/bgpd/bgp_attr.h index ad0302d8..a018256f 100644 --- a/bgpd/bgp_attr.h +++ b/bgpd/bgp_attr.h @@ -48,30 +48,11 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA /* BGP attribute structure. */ struct attr { - /* Reference count of this attribute. */ - unsigned long refcnt; - - /* Flag of attribute is set or not. */ - u_int32_t flag; - /* Attributes. */ - u_char origin; - struct in_addr nexthop; - u_int32_t med; - u_int32_t local_pref; - as_t aggregator_as; - struct in_addr aggregator_addr; - u_int32_t weight; - struct in_addr originator_id; - struct cluster_list *cluster; - - u_char mp_nexthop_len; #ifdef HAVE_IPV6 struct in6_addr mp_nexthop_global; struct in6_addr mp_nexthop_local; #endif /* HAVE_IPV6 */ - struct in_addr mp_nexthop_global_in; - struct in_addr mp_nexthop_local_in; /* AS Path structure */ struct aspath *aspath; @@ -81,9 +62,31 @@ struct attr /* Extended Communities attribute. */ struct ecommunity *ecommunity; - + + /* Route-Reflector Cluster attribute */ + struct cluster_list *cluster; + /* Unknown transitive attribute. */ struct transit *transit; + + /* Reference count of this attribute. */ + unsigned long refcnt; + + /* Flag of attribute is set or not. */ + u_int32_t flag; + + /* Apart from in6_addr, the remaining static attributes */ + struct in_addr nexthop; + u_int32_t med; + u_int32_t local_pref; + struct in_addr aggregator_addr; + struct in_addr originator_id; + struct in_addr mp_nexthop_global_in; + struct in_addr mp_nexthop_local_in; + u_int32_t weight; + as_t aggregator_as; + u_char origin; + u_char mp_nexthop_len; }; /* Router Reflector related structure. */ @@ -129,6 +132,8 @@ extern void bgp_dump_routes_attr (struct stream *, struct attr *, extern unsigned int attrhash_key_make (struct attr *); extern int attrhash_cmp (struct attr *, struct attr *); extern void attr_show_all (struct vty *); +extern unsigned long int attr_count (void); +extern unsigned long int attr_unknown_count (void); /* Cluster list prototypes. */ extern int cluster_loop_check (struct cluster_list *, struct in_addr); diff --git a/bgpd/bgp_route.h b/bgpd/bgp_route.h index 24be30ff..e5f3ae59 100644 --- a/bgpd/bgp_route.h +++ b/bgpd/bgp_route.h @@ -29,20 +29,27 @@ struct bgp_info struct bgp_info *next; struct bgp_info *prev; + /* Peer structure. */ + struct peer *peer; + + /* Attribute structure. */ + struct attr *attr; + + /* Pointer to dampening structure. */ + struct bgp_damp_info *damp_info; + + /* Uptime. */ + time_t uptime; + + /* This route is suppressed with aggregation. */ + int suppress; + + /* Nexthop reachability check. */ + u_int32_t igpmetric; + /* reference count */ unsigned int lock; - /* BGP route type. This can be static, RIP, OSPF, BGP etc. */ - u_char type; - - /* When above type is BGP. This sub type specify BGP sub type - information. */ - u_char sub_type; -#define BGP_ROUTE_NORMAL 0 -#define BGP_ROUTE_STATIC 1 -#define BGP_ROUTE_AGGREGATE 2 -#define BGP_ROUTE_REDISTRIBUTE 3 - /* BGP information status. */ u_int16_t flags; #define BGP_INFO_IGP_CHANGED (1 << 0) @@ -57,26 +64,19 @@ struct bgp_info #define BGP_INFO_REMOVED (1 << 9) #define BGP_INFO_COUNTED (1 << 10) - /* Peer structure. */ - struct peer *peer; - - /* Attribute structure. */ - struct attr *attr; - - /* This route is suppressed with aggregation. */ - int suppress; - - /* Nexthop reachability check. */ - u_int32_t igpmetric; - - /* Uptime. */ - time_t uptime; - - /* Pointer to dampening structure. */ - struct bgp_damp_info *damp_info; - /* MPLS label. */ u_char tag[3]; + + /* BGP route type. This can be static, RIP, OSPF, BGP etc. */ + u_char type; + + /* When above type is BGP. This sub type specify BGP sub type + information. */ + u_char sub_type; +#define BGP_ROUTE_NORMAL 0 +#define BGP_ROUTE_STATIC 1 +#define BGP_ROUTE_AGGREGATE 2 +#define BGP_ROUTE_REDISTRIBUTE 3 }; /* BGP static route configuration. */ diff --git a/bgpd/bgp_table.c b/bgpd/bgp_table.c index a3b489d5..810dab54 100644 --- a/bgpd/bgp_table.c +++ b/bgpd/bgp_table.c @@ -350,8 +350,10 @@ bgp_node_get (struct bgp_table *table, struct prefix *p) match = new; new = bgp_node_set (table, p); set_link (match, new); + table->count++; } } + table->count++; bgp_lock_node (new); return new; @@ -389,7 +391,9 @@ bgp_node_delete (struct bgp_node *node) } else node->table->top = child; - + + node->table->count--; + bgp_node_free (node); /* If parent node is stub then delete it also. */ @@ -492,3 +496,9 @@ bgp_route_next_until (struct bgp_node *node, struct bgp_node *limit) bgp_unlock_node (start); return NULL; } + +unsigned long +bgp_table_count (struct bgp_table *table) +{ + return table->count; +} diff --git a/bgpd/bgp_table.h b/bgpd/bgp_table.h index e13022bb..62421e71 100644 --- a/bgpd/bgp_table.h +++ b/bgpd/bgp_table.h @@ -39,6 +39,8 @@ struct bgp_table void *owner; struct bgp_node *top; + + unsigned long count; }; struct bgp_node @@ -51,18 +53,16 @@ struct bgp_node #define l_left link[0] #define l_right link[1] - unsigned int lock; - void *info; struct bgp_adj_out *adj_out; struct bgp_adj_in *adj_in; - void *aggregate; - struct bgp_node *prn; + unsigned int lock; + u_char flags; #define BGP_NODE_PROCESS_SCHEDULED (1 << 0) }; @@ -84,5 +84,5 @@ extern struct bgp_node *bgp_node_match_ipv4 (struct bgp_table *, extern struct bgp_node *bgp_node_match_ipv6 (struct bgp_table *, struct in6_addr *); #endif /* HAVE_IPV6 */ - +extern unsigned long bgp_table_count (struct bgp_table *); #endif /* _QUAGGA_BGP_TABLE_H */ |