⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cdp.h

📁 Net-CDP-0.09 cdp相关源包
💻 H
字号:
/* * $Id: cdp.h,v 1.3 2005/07/20 13:44:13 mchapman Exp $ */#ifndef _CDP_H#define _CDP_H#include <stddef.h>#include <stdint.h>#include <netinet/in.h>#ifdef __cplusplusextern "C" {#endif/******************************************************************************//* * The size of the error buffer to be passed to functions that expect one. */#define CDP_ERRBUF_SIZE 256/******************************************************************************//* * Dup and free operators for data stored in linked lists. */typedef void * (*cdp_dup_fn_t)(const void *);typedef void (*cdp_free_fn_t)(void *);/* * Opaque container for a linked list node. */typedef struct _cdp_llist_item {	struct _cdp_llist_item *next;	void *x;} cdp_llist_item_t;/* * Opaque linked list. Items on a linked list must have a "void *next" * member. */typedef struct {	cdp_dup_fn_t dup_fn;	cdp_free_fn_t free_fn;	uint32_t count;		cdp_llist_item_t *head;	cdp_llist_item_t *tail;} cdp_llist_t;/* * Linked lists are append-only. This means they only ever grow, and * elements will appear in the list in the order in which they were * added. * * The cdp_llist_dup function makes a deep copy of the specified llist * using the cdp_dup_fn_t that was provided when the llist was created. * * Similarly, cdp_llist_free deeply frees the llist using the cdp_free_fn_t * provided when the llist was created. */cdp_llist_t * cdp_llist_new(cdp_dup_fn_t, cdp_free_fn_t);cdp_llist_t * cdp_llist_dup(const cdp_llist_t *);void cdp_llist_append(cdp_llist_t *, void *);void cdp_llist_transfer(cdp_llist_t *, cdp_llist_t *);void cdp_llist_free(cdp_llist_t *);#define cdp_llist_count(LLIST) ((const uint32_t)((LLIST)->count))/* * Linked list iterator. * * void frobnicate(item_t *); * * void frobnicate_all(const cdp_llist_t *llist) { *     cdp_llist_iter_t iter; *  *     for (iter = cdp_llist_iter(llist); iter; iter = cdp_llist_next(iter)) *         frobnicate(cdp_llist_get(iter)); * } */typedef const cdp_llist_item_t *cdp_llist_iter_t;#define cdp_llist_iter(LLIST) ((cdp_llist_iter_t)((LLIST)->head))#define cdp_llist_get(ITER) ((ITER)->x)#define cdp_llist_next(ITER) ((ITER)->next)/******************************************************************************//* * Get a list of strings representing available ports. */cdp_llist_t * cdp_get_ports(char *);/* * Opaque CDP listener/advertiser object. */typedef struct _cdp cdp_t;/******************************************************************************//* * Predefined protocol_type/protocol_length/protocol combinations. */#define CDP_ADDR_PROTO_CLNP      0#define CDP_ADDR_PROTO_IPV4      1#define CDP_ADDR_PROTO_IPV6      2#define CDP_ADDR_PROTO_DECNET    3#define CDP_ADDR_PROTO_APPLETALK 4#define CDP_ADDR_PROTO_IPX       5#define CDP_ADDR_PROTO_VINES     6#define CDP_ADDR_PROTO_XNS       7#define CDP_ADDR_PROTO_APOLLO    8#define CDP_ADDR_PROTO_MAX       CDP_ADDR_PROTO_APOLLOstruct cdp_predef {	uint8_t protocol_type;	uint8_t protocol_length;	void *protocol;};extern struct cdp_predef cdp_predefs[];/* * CDP address object. */struct cdp_address {	uint8_t protocol_type;	uint8_t protocol_length;	void *protocol;	uint16_t address_length;	void *address;};struct cdp_address * cdp_address_new(	uint8_t, uint8_t, const void *, uint8_t, const void *);struct cdp_address * cdp_address_dup(const struct cdp_address *);void cdp_address_free(struct cdp_address *);/******************************************************************************//* * CDP IP Prefix object. */struct cdp_ip_prefix {	struct in_addr network;	uint8_t length;};struct cdp_ip_prefix * cdp_ip_prefix_new(struct in_addr, uint8_t);struct cdp_ip_prefix * cdp_ip_prefix_dup(const struct cdp_ip_prefix *);void cdp_ip_prefix_free(struct cdp_ip_prefix *);/******************************************************************************/struct cdp_appliance {	uint8_t id;	uint16_t vlan;};struct cdp_appliance * cdp_appliance_new(uint8_t, uint16_t);struct cdp_appliance * cdp_appliance_dup(const struct cdp_appliance *);void cdp_appliance_free(struct cdp_appliance *);/******************************************************************************//* * CDP capabilities. */#define CDP_CAP_ROUTER             0x01#define CDP_CAP_TRANSPARENT_BRIDGE 0x02#define CDP_CAP_SOURCE_BRIDGE      0x04#define CDP_CAP_SWITCH             0x08#define CDP_CAP_HOST               0x10#define CDP_CAP_IGMP               0x20#define CDP_CAP_REPEATER           0x40/* * CDP packet. * * The packet field must always exist. It is always preallocated with * at least BUFSIZ bytes of space -- don't shrink it to less than this. * * packet_length indicates the number of bytes actually used in packet to * represent the CDP packet in encoded form. You don't need to touch this * since cdp_packet_update will update it as necessary. *  * You can fiddle with the fields directly. Any field which is a pointer can * also be NULL, indicating that the field does not "exist" in the packet, * ie. it wasn't received and it won't be sent. * * cdp_generate will generate a packet with most values filled out for you. * Pass a cdp_t * object in as the first argument to associate the packet with * the device used by that object. */struct cdp_packet {	void *packet;	uint16_t packet_length;	uint8_t version;	uint8_t ttl;	uint16_t checksum;	char *device_id;	cdp_llist_t *addresses;	char *port_id;	uint32_t *capabilities;	char *ios_version;	char *platform;	cdp_llist_t *ip_prefixes;	char *vtp_mgmt_domain;	uint16_t *native_vlan;	uint8_t *duplex;	struct cdp_appliance *appliance;	struct cdp_appliance *appliance_query;	uint16_t *power_consumption;	uint32_t *mtu;	uint8_t *extended_trust;	uint8_t *untrusted_cos;	cdp_llist_t *mgmt_addresses;};struct cdp_packet * cdp_packet_generate(const cdp_t *);struct cdp_packet * cdp_packet_dup(const struct cdp_packet *);void cdp_packet_free(struct cdp_packet *);/* * Update the packet, packet_length and checksum fields. You'll need to * call this before sending the packet, otherwise it will send the old data * stored in packet. */int cdp_packet_update(struct cdp_packet *, char *);/******************************************************************************//* * cdp_new flags. */#define CDP_PROMISCUOUS        0x01#define CDP_DISABLE_RECV       0x02#define CDP_DISABLE_SEND       0x04/* * cdp_recv flags. */#define CDP_RECV_NONBLOCK      0x01#define CDP_RECV_DECODE_ERRORS 0x02cdp_t * cdp_new(const char *, int, char *);void cdp_free(cdp_t *);const char * cdp_get_port(const cdp_t *);const cdp_llist_t * cdp_get_addresses(const cdp_t *);const uint8_t * cdp_get_duplex(const cdp_t *);int cdp_get_fd(const cdp_t *);struct cdp_packet * cdp_recv(cdp_t *, int, char *);int cdp_send(cdp_t *, const struct cdp_packet *, char *);#ifdef __cplusplus}#endif#endif /* _CDP_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -