Date: Sun, 9 Aug 2009 22:24:10 GMT From: Gabor Pali <pgj@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 167146 for review Message-ID: <200908092224.n79MOAxV012202@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=167146 Change 167146 by pgj@petymeg-current on 2009/08/09 22:23:51 Add the basic types and functions for the upcoming route_type, an abstraction for FIB entries. Affected files ... .. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/Makefile#17 edit .. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat.h#59 edit .. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat_internal.h#56 edit .. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat_route.c#1 add .. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat_util.c#64 edit Differences ... ==== //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/Makefile#17 (text+ko) ==== @@ -4,7 +4,7 @@ LIB= netstat SRCS= netstat_socket.c netstat_mbuf.c netstat_if.c netstat_bpf.c \ - netstat_stat.c netstat_util.c + netstat_stat.c netstat_route.c netstat_util.c INCS= netstat.h ==== //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat.h#59 (text+ko) ==== @@ -93,6 +93,31 @@ #define NETSTAT_IP6_MBUF_MAX 32 #define NETSTAT_IP6_IF_MAX 16 +/* Flags for netstat_route(): */ +#define NETSTAT_ROUTE_ALL 0x01 /* Return all routes. */ +#define NETSTAT_ROUTE_ALLFIBS 0x02 /* Return routes for all FIBs. */ + +/* Testing flags for route_type: */ +#define NETSTAT_RT_UP 0x00001 +#define NETSTAT_RT_GATEWAY 0x00002 +#define NETSTAT_RT_HOST 0x00004 +#define NETSTAT_RT_REJECT 0x00008 +#define NETSTAT_RT_DYNAMIC 0x00010 +#define NETSTAT_RT_MODIFIED 0x00020 +#define NETSTAT_RT_DONE 0x00040 +#define NETSTAT_RT_XRESOLVE 0x00080 +#define NETSTAT_RT_STATIC 0x00100 +#define NETSTAT_RT_PROTO1 0x00200 +#define NETSTAT_RT_PROTO2 0x00400 +#define NETSTAT_RT_PROTO3 0x00800 +#define NETSTAT_RT_PRCLONING 0x01000 +#define NETSTAT_RT_BLACKHOLE 0x02000 +#define NETSTAT_RT_BROADCAST 0x04000 +#define NETSTAT_RT_LLINFO 0x08000 +#define NETSTAT_RT_WASCLONED 0x10000 +#define NETSTAT_RT_CLONING 0x20000 +#define NETSTAT_RT_EXPIRES 0x40000 /* has expire time */ + /* Enum for TCP states: */ enum tcp_state { tcps_Closed, @@ -232,6 +257,10 @@ struct mroute6_stat; #endif +struct route_type; +struct route_type_list; +struct route_type_iterator; + __BEGIN_DECLS const char *netstat_strerror(int); const char *netstat_kvmerror(const struct session_type *); @@ -1177,4 +1206,31 @@ u_int64_t netstat_mroute6s_get_pkt2large(const struct mroute6_stat *); u_int64_t netstat_mroute6s_get_upq_sockfull(const struct mroute6_stat *); #endif + +/* Routing: */ +struct route_type_list *netstat_rtl_alloc(void); +void netstat_rtl_free(struct route_type_list *); +int netstat_rtl_geterror(const struct route_type_list *); +int netstat_rtl_length(const struct route_type_list *); + +int netstat_rti_alloc(struct route_type_list *list, + struct route_type_iterator **iterator); +const struct route_type *netstat_rti_first(struct route_type_iterator *); +const struct route_type *netstat_rti_next(struct route_type_iterator *); +void netstat_rti_free(struct route_type_iterator *); + +int netstat_route(const struct session_type *, int fib, int domain, + struct route_type_list *list, int flags); + +int netstat_rt_get_fib(const struct route_type *); +int netstat_rt_get_family(const struct route_type *); +const struct routeaddr_type *netstat_rt_get_destination(const struct route_type *); +const struct routeaddr_type *netstat_rt_get_gateway(const struct route_type *); +int netstat_rt_get_flags(const struct route_type *); +u_int64_t netstat_rt_get_refs(const struct route_type *); +u_int64_t netstat_rt_get_used(const struct route_type *); +const char *netstat_rt_get_interface(const struct route_type *); +u_int64_t netstat_rt_get_expire(const struct route_type *); +u_int32_t netstat_rt_get_mtu(const struct route_type *); +u_int64_t netstat_rt_get_address(const struct route_type *); #endif /* !_NETSTAT_H_ */ ==== //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat_internal.h#56 (text+ko) ==== @@ -439,6 +439,45 @@ const char *str; }; +/* Route type. */ +struct routeaddr_type { + /* for printing purposes: */ + char *rat_address; /* resolved hostname */ + char rat_ni_address[20]; /* numeric */ + /* for other: */ + void *rat_data; /* raw socket information */ + int rat_data_len; +}; + +struct route_type { + int rt_fib; /* FIB instance */ + int rt_family; /* protocol family */ + struct routeaddr_type *rt_destination; /* destination: subnet */ + struct routeaddr_type *rt_gateway; /* gateway: node */ + int rt_flags; + u_int64_t rt_refs; /* # references */ + u_int64_t rt_used; /* # raw packets forwarded */ + char *rt_interface; /* routing interface name */ + u_int64_t rt_expire; /* sec */ + u_int32_t rt_mtu; /* bytes */ + u_int64_t rt_address; /* opaque pointer */ + + TAILQ_ENTRY(route_type) rt_list; +}; + +struct route_type_list { + TAILQ_HEAD(, route_type) rtl_list; + int rtl_length; + int rtl_error; +}; + +struct route_type_iterator { + struct route_type_list *rti_list; + struct route_type *rti_first; + struct route_type *rti_next; +}; + + int kread_data(kvm_t *kvm, u_long kvm_pointer, void *address, size_t size); int kread_string(kvm_t *kvm, u_long kvm_pointer, char *buffer, int buflen); @@ -464,6 +503,12 @@ struct bpf_type *_netstat_bpt_allocate(struct bpf_type_list *list, const char *ifname); +void _netstat_rtl_empty(struct route_type_list *); +void _netstat_rt_free(struct route_type *); +void _netstat_rat_free(struct routeaddr_type *); +struct route_type *_netstat_rt_allocate(struct route_type_list *); +struct routeaddr_type *_netstat_rat_allocate(void *, size_t); + const char *resolve_val2str_name(int, const struct val2str *); /* XXX: merge these into a common address resolution routine. */ const char *routename(in_addr_t in, int numeric); ==== //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat_util.c#64 (text+ko) ==== @@ -2190,6 +2190,219 @@ #undef MRT6_ACC #endif +void +_netstat_rtl_empty(struct route_type_list *list) +{ + struct route_type *rtp; + + while ((rtp = TAILQ_FIRST(&list->rtl_list)) ) { + TAILQ_REMOVE(&list->rtl_list, rtp, rt_list); + _netstat_rt_free(rtp); + } + + list->rtl_length = 0; +} + +void +_netstat_rt_free(struct route_type *rtp) +{ + _netstat_rat_free(rtp->rt_destination); + _netstat_rat_free(rtp->rt_gateway); + free(rtp->rt_interface); + free(rtp); +} + +void +_netstat_rat_free(struct routeaddr_type *ratp) +{ + free(ratp->rat_address); + free(ratp->rat_data); + free(ratp); +} + +struct route_type * +_netstat_rt_allocate(struct route_type_list *list) +{ + struct route_type *rtp; + + rtp = malloc(sizeof(*rtp)); + if (rtp == NULL) + return (NULL); + + bzero(rtp, sizeof(*rtp)); + TAILQ_INSERT_TAIL(&list->rtl_list, rtp, rt_list); + list->rtl_length += 1; + return (rtp); +} + +struct routeaddr_type * +_netstat_rat_allocate(void *address, size_t len) +{ + struct routeaddr_type *ratp; + + ratp = malloc(sizeof(*ratp)); + if (ratp == NULL) + return (NULL); + + bzero(ratp, sizeof(*ratp)); + if (address != NULL && len > 0) { + ratp->rat_data = malloc(len); + if (ratp->rat_data == NULL) { + free(ratp); + ratp = NULL; + } else { + memcpy(ratp->rat_data, address, len); + ratp->rat_data_len = len; + } + } + return (ratp); +} + +struct route_type_list * +netstat_rtl_alloc(void) +{ + struct route_type_list *rtlp; + + rtlp = malloc(sizeof(*rtlp)); + if (rtlp == NULL) + return (NULL); + + TAILQ_INIT(&rtlp->rtl_list); + rtlp->rtl_error = NETSTAT_ERROR_UNDEFINED; + rtlp->rtl_length = 0; + return (rtlp); +} + +void +netstat_rtl_free(struct route_type_list *list) +{ + _netstat_rtl_empty(list); + free(list); +} + +int +netstat_rtl_geterror(const struct route_type_list *list) +{ + return (list->rtl_error); +} + +int +netstat_rtl_length(const struct route_type_list *list) +{ + return (list->rtl_length); +} + +int +netstat_rti_alloc(struct route_type_list *list, + struct route_type_iterator **iterator) +{ + struct route_type_iterator *rtip; + + rtip = malloc(sizeof(*rtip)); + if (rtip == NULL) + return (-1); + + bzero(rtip, sizeof(*rtip)); + rtip->rti_list = list; + rtip->rti_first = TAILQ_FIRST(&list->rtl_list); + if (rtip->rti_first != NULL) + rtip->rti_next = TAILQ_NEXT(rtip->rti_first, rt_list); + *iterator = rtip; + return (0); +} + +const struct route_type * +netstat_rti_first(struct route_type_iterator *rtip) +{ + if (rtip->rti_first != NULL) + rtip->rti_next = TAILQ_NEXT(rtip->rti_first, rt_list); + return (rtip->rti_first); +} + +const struct route_type * +netstat_rti_next(struct route_type_iterator *rtip) +{ + const struct route_type *rtp; + + rtp = rtip->rti_next; + if (rtip->rti_next != NULL) + rtip->rti_next = TAILQ_NEXT(rtip->rti_next, rt_list); + + return (rtp); +} + +void +netstat_rti_free(struct route_type_iterator *rtip) +{ + free(rtip); +} + +int +netstat_rt_get_fib(const struct route_type *rtp) +{ + return (rtp->rt_fib); +} + +int +netstat_rt_get_family(const struct route_type *rtp) +{ + return (rtp->rt_family); +} + +const struct routeaddr_type * +netstat_rt_get_destination(const struct route_type *rtp) +{ + return (rtp->rt_destination); +} + +const struct routeaddr_type * +netstat_rt_get_gateway(const struct route_type *rtp) +{ + return (rtp->rt_gateway); +} + +int +netstat_rt_get_flags(const struct route_type *rtp) +{ + return (rtp->rt_flags); +} + +u_int64_t +netstat_rt_get_refs(const struct route_type *rtp) +{ + return (rtp->rt_refs); +} + +u_int64_t +netstat_rt_get_used(const struct route_type *rtp) +{ + return (rtp->rt_used); +} + +const char * +netstat_rt_get_interface(const struct route_type *rtp) +{ + return (rtp->rt_interface); +} + +u_int64_t +netstat_rt_get_expire(const struct route_type *rtp) +{ + return (rtp->rt_expire); +} + +u_int32_t +netstat_rt_get_mtu(const struct route_type *rtp) +{ + return (rtp->rt_mtu); +} + +u_int64_t +netstat_rt_get_address(const struct route_type *rtp) +{ + return (rtp->rt_address); +} + static const char *icmpnames[ICMP_MAXTYPE + 1] = { "echo reply", /* RFC 792 */ "#1",
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200908092224.n79MOAxV012202>