#ifndef _CHANNEL_H_ #define _CHANNEL_H_ #include "mcast.h" #include "udp.h" #include "tcp.h" struct channel; struct nethdr; enum { CHANNEL_NONE, CHANNEL_MCAST, CHANNEL_UDP, CHANNEL_TCP, CHANNEL_MAX, }; struct mcast_channel { struct mcast_sock *client; struct mcast_sock *server; }; struct udp_channel { struct udp_sock *client; struct udp_sock *server; }; struct tcp_channel { struct tcp_sock *client; struct tcp_sock *server; }; #define CHANNEL_F_DEFAULT (1 << 0) #define CHANNEL_F_BUFFERED (1 << 1) #define CHANNEL_F_STREAM (1 << 2) #define CHANNEL_F_ERRORS (1 << 3) #define CHANNEL_F_ACCEPT (1 << 4) #define CHANNEL_F_MAX (1 << 5) union channel_type_conf { struct mcast_conf mcast; struct udp_conf udp; struct tcp_conf tcp; }; struct channel_conf { int channel_type; char channel_ifname[IFNAMSIZ]; unsigned int channel_flags; union channel_type_conf u; }; struct nlif_handle; #define CHANNEL_T_DATAGRAM 0 #define CHANNEL_T_STREAM 1 struct channel_ops { int headersiz; int type; void * (*open)(void *conf); void (*close)(void *channel); int (*send)(void *channel, const void *data, int len); int (*recv)(void *channel, char *buf, int len); int (*accept)(struct channel *c); int (*get_fd)(void *channel); int (*isset)(struct channel *c, fd_set *readfds); int (*accept_isset)(struct channel *c, fd_set *readfds); void (*stats)(struct channel *c, int fd); void (*stats_extended)(struct channel *c, int active, struct nlif_handle *h, int fd); }; struct channel_buffer; struct channel { int channel_type; int channel_ifindex; int channel_ifmtu; unsigned int channel_flags; struct channel_buffer *buffer; struct channel_ops *ops; void *data; }; int channel_init(void); void channel_end(void); struct channel *channel_open(struct channel_conf *conf); void channel_close(struct channel *c); int channel_send(struct channel *c, const struct nethdr *net); int channel_send_flush(struct channel *c); int channel_recv(struct channel *c, char *buf, int size); int channel_accept(struct channel *c); int channel_get_fd(struct channel *c); int channel_accept_isset(struct channel *c, fd_set *readfds); int channel_isset(struct channel *c, fd_set *readfds); void channel_stats(struct channel *c, int fd); void channel_stats_extended(struct channel *c, int active, struct nlif_handle *h, int fd); int channel_type(struct channel *c); #define MULTICHANNEL_MAX 4 struct multichannel { int channel_num; struct channel *channel[MULTICHANNEL_MAX]; struct channel *current; }; struct multichannel *multichannel_open(struct channel_conf *conf, int len); void multichannel_close(struct multichannel *m); int multichannel_send(struct multichannel *c, const struct nethdr *net); int multichannel_send_flush(struct multichannel *c); int multichannel_recv(struct multichannel *c, char *buf, int size); void multichannel_stats(struct multichannel *m, int fd); void multichannel_stats_extended(struct multichannel *m, struct nlif_handle *h, int fd); int multichannel_get_ifindex(struct multichannel *m, int i); int multichannel_get_current_ifindex(struct multichannel *m); void multichannel_set_current_channel(struct multichannel *m, int i); void multichannel_change_current_channel(struct multichannel *m, struct channel *c); #endif /* _CHANNEL_H_ */