From 965403fbad1b32c762ad5a5f1226f8ff1534cb2f Mon Sep 17 00:00:00 2001 From: niubinghui Date: Mon, 14 Oct 2024 19:04:00 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E4=BF=AE=E6=94=B9=E3=80=91=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E4=BE=9D=E8=B5=96=E7=9A=84stellar=E5=A4=B4=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dependence/include/stellar/appid.h | 31 +++ dependence/include/stellar/exdata.h | 31 +++ dependence/include/stellar/http.h | 113 +++++++++ dependence/include/stellar/log.h | 60 +++++ dependence/include/stellar/module_manager.h | 49 ++++ dependence/include/stellar/mq.h | 54 ++++ dependence/include/stellar/packet.h | 193 ++++++++++++++ dependence/include/stellar/packet_exdata.h | 8 - dependence/include/stellar/packet_manager.h | 37 +++ dependence/include/stellar/packet_mq.h | 22 -- dependence/include/stellar/polling_manager.h | 21 ++ dependence/include/stellar/session.h | 249 ++++++++++--------- dependence/include/stellar/session_exdata.h | 8 - dependence/include/stellar/session_flags.h | 55 ++++ dependence/include/stellar/session_manager.h | 27 ++ dependence/include/stellar/session_mq.h | 36 --- dependence/include/stellar/socks_decoder.h | 44 ++++ dependence/include/stellar/stellar.h | 63 ++--- dependence/include/stellar/stratum_decoder.h | 18 ++ dependence/include/stellar/utils.h | 43 ++-- 20 files changed, 917 insertions(+), 245 deletions(-) create mode 100644 dependence/include/stellar/appid.h create mode 100644 dependence/include/stellar/exdata.h create mode 100644 dependence/include/stellar/http.h create mode 100644 dependence/include/stellar/log.h create mode 100644 dependence/include/stellar/module_manager.h create mode 100644 dependence/include/stellar/mq.h create mode 100644 dependence/include/stellar/packet.h delete mode 100644 dependence/include/stellar/packet_exdata.h create mode 100644 dependence/include/stellar/packet_manager.h delete mode 100644 dependence/include/stellar/packet_mq.h create mode 100644 dependence/include/stellar/polling_manager.h delete mode 100644 dependence/include/stellar/session_exdata.h create mode 100644 dependence/include/stellar/session_flags.h create mode 100644 dependence/include/stellar/session_manager.h delete mode 100644 dependence/include/stellar/session_mq.h create mode 100644 dependence/include/stellar/socks_decoder.h create mode 100644 dependence/include/stellar/stratum_decoder.h diff --git a/dependence/include/stellar/appid.h b/dependence/include/stellar/appid.h new file mode 100644 index 0000000..6d82d71 --- /dev/null +++ b/dependence/include/stellar/appid.h @@ -0,0 +1,31 @@ +#pragma once + +#include +#include + +#define MESSAGE_MAGIC 0x12345678 + +#define MAX_APP_ID_NUM 8 +#define APP_ID_MESSAGE_TOPIC "TOPIC_APP_ID" + +enum APP_IDENTIFY_ORIGIN +{ + ORIGIN_PROTO_IDENTIFY=0, + ORIGIN_APP_SKETCH_USER_DEFINE, + ORIGIN_PROTO_ENGINE, + ORIGIN_APP_SKETCH_BUILT_IN, + ORIGIN_PROTO_DECODED, + ORIGIN_EXCEED_PACKET_LIMIT, + ORIGIN_TUNNEL, + ORIGIN_MAX +}; + +struct app_id_message +{ + int magic; + enum APP_IDENTIFY_ORIGIN origin; + uint32_t app_id_num; + int32_t app_id[MAX_APP_ID_NUM]; + uint32_t surrogate_id[MAX_APP_ID_NUM]; + uint32_t packet_sequence[MAX_APP_ID_NUM]; +}; \ No newline at end of file diff --git a/dependence/include/stellar/exdata.h b/dependence/include/stellar/exdata.h new file mode 100644 index 0000000..84f8029 --- /dev/null +++ b/dependence/include/stellar/exdata.h @@ -0,0 +1,31 @@ +#pragma once + +#ifdef __cplusplus +extern "C" +{ +#endif + +typedef void exdata_free(int idx, void *ex_ptr, void *arg); + +struct exdata_schema; + +struct exdata_schema *exdata_schema_new(); +void exdata_schema_free(struct exdata_schema *schemas); + +int exdata_schema_new_index(struct exdata_schema *schema, const char *name, exdata_free *free_func,void *free_arg); + +int exdata_schema_get_idx_by_name(struct exdata_schema *schema, const char *name); + +struct exdata_runtime; + +struct exdata_runtime *exdata_runtime_new(struct exdata_schema *schemas); +void exdata_runtime_free(struct exdata_runtime *rt); +void exdata_runtime_reset(struct exdata_runtime *rt);//call free_func, and set ex_ptr to NULL + +int exdata_set(struct exdata_runtime *rt, int idx, void *ex_ptr); +void *exdata_get(struct exdata_runtime *rt, int idx); + + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/dependence/include/stellar/http.h b/dependence/include/stellar/http.h new file mode 100644 index 0000000..1cc5bec --- /dev/null +++ b/dependence/include/stellar/http.h @@ -0,0 +1,113 @@ +#pragma once +#include +#ifdef __cplusplus +extern "C" +{ +#endif + +#define HTTP_TOPIC "HTTP_MESSAGE" + struct http_message; + + enum http_message_type + { + HTTP_TRANSACTION_START, + + HTTP_MESSAGE_REQ_LINE, + HTTP_MESSAGE_REQ_HEADER, + HTTP_MESSAGE_REQ_HEADER_END, // todo, delete END, push all fileds at once + HTTP_MESSAGE_REQ_BODY_START, + HTTP_MESSAGE_REQ_BODY, + HTTP_MESSAGE_REQ_BODY_END, + + HTTP_MESSAGE_RES_LINE, + HTTP_MESSAGE_RES_HEADER, + HTTP_MESSAGE_RES_HEADER_END, // todo, delete END, push all fileds at once + HTTP_MESSAGE_RES_BODY_START, + HTTP_MESSAGE_RES_BODY, + HTTP_MESSAGE_RES_BODY_END, + + HTTP_TRANSACTION_END, + + HTTP_MESSAGE_MAX + }; + + struct http_header_field + { + char *name; + size_t name_len; + char *value; + size_t value_len; + }; + + struct http_request_line + { + char *method; + size_t method_len; + char *uri; + size_t uri_len; + char *version; + size_t version_len; + + int major_version; + int minor_version; + }; + + struct http_response_line + { + char *version; + size_t version_len; + char *status; + size_t status_len; + int major_version; + int minor_version; + int status_code; + }; + + enum http_message_type http_message_get_type(const struct http_message *msg); + + void http_message_get0_request_line(const struct http_message *msg, struct http_request_line *line); + + void http_message_get0_response_line(const struct http_message *msg, struct http_response_line *line); + + /* + * Pay attention: key->iov_base is case-insensitive. + */ + void http_message_get0_header(const struct http_message *msg, const char *name, size_t name_len, struct http_header_field *field_result); + + /** + * @brief loop reading all headers. + * + * @retval succeed( >= 0) failed(-1) + */ + int http_message_get0_next_header(const struct http_message *msg, struct http_header_field *header); + + /** + * @retval succeed( >= 0) failed(-1) + */ + int http_message_reset_header_iter(struct http_message *msg); // to do , obsoleted + + void http_message_get0_uncompressed_body(const struct http_message *msg, const char **body, size_t *body_len); + + /** + * @brief If the body hasn't been compressed, same as http_message_get0_uncompressed_body(). + * + */ + void http_message_get0_decompressed_body(const struct http_message *msg, const char **body, size_t *body_len); + + void http_message_get0_raw_url(const struct http_message *msg, const char **url, size_t *url_len); + + /* + return value: + 0: failed + >1: success, length of decoded_url_buffer, not C string( no EOF with '\0' ) + */ + size_t http_url_decode(const char *raw_url, size_t raw_url_len, char *decoded_url_buffer, size_t decoded_url_buffer_len); + + /** + * @retval succeed( >= 0) failed(-1) + */ + int http_message_get_transaction_seq(const struct http_message *msg); + +#ifdef __cplusplus +} +#endif diff --git a/dependence/include/stellar/log.h b/dependence/include/stellar/log.h new file mode 100644 index 0000000..a075267 --- /dev/null +++ b/dependence/include/stellar/log.h @@ -0,0 +1,60 @@ +#pragma once + +#ifdef __cplusplus +extern "C" +{ +#endif + +enum log_level +{ + LOG_TRACE, + LOG_DEBUG, + LOG_INFO, + LOG_WARN, + LOG_ERROR, + LOG_FATAL, +}; + +#define STELLAR_LOG_TRACE(logger, module, format, ...) \ + if (log_check_level((logger), LOG_TRACE)) \ + { \ + log_print((logger), LOG_TRACE, (module), (format), ##__VA_ARGS__); \ + } + +#define STELLAR_LOG_DEBUG(logger, module, format, ...) \ + if (log_check_level((logger), LOG_DEBUG)) \ + { \ + log_print((logger), LOG_DEBUG, (module), (format), ##__VA_ARGS__); \ + } + +#define STELLAR_LOG_INFO(logger, module, format, ...) \ + if (log_check_level((logger), LOG_INFO)) \ + { \ + log_print((logger), LOG_INFO, (module), (format), ##__VA_ARGS__); \ + } + +#define STELLAR_LOG_WARN(logger, module, format, ...) \ + if (log_check_level((logger), LOG_WARN)) \ + { \ + log_print((logger), LOG_WARN, (module), (format), ##__VA_ARGS__); \ + } + +#define STELLAR_LOG_ERROR(logger, module, format, ...) \ + if (log_check_level((logger), LOG_ERROR)) \ + { \ + log_print((logger), LOG_ERROR, (module), (format), ##__VA_ARGS__); \ + } + +#define STELLAR_LOG_FATAL(logger, module, format, ...) \ + if (log_check_level((logger), LOG_FATAL)) \ + { \ + log_print((logger), LOG_FATAL, (module), (format), ##__VA_ARGS__); \ + } + +struct logger; +int log_check_level(struct logger *logger, enum log_level level); +void log_print(struct logger *logger, enum log_level level, const char *module, const char *fmt, ...); + +#ifdef __cplusplus +} +#endif diff --git a/dependence/include/stellar/module_manager.h b/dependence/include/stellar/module_manager.h new file mode 100644 index 0000000..a944186 --- /dev/null +++ b/dependence/include/stellar/module_manager.h @@ -0,0 +1,49 @@ +#pragma once + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "stellar/mq.h" +#include "stellar/log.h" + +#define PACKET_MANAGER_MODULE_NAME "packet_manager_module" +#define SESSION_MANAGER_MODULE_NAME "session_manager_module" + +struct stellar_module; +struct stellar_module *stellar_module_new(const char *name, void *ctx); +void stellar_module_free(struct stellar_module *mod); + +void * stellar_module_get_ctx(struct stellar_module *mod); +void stellar_module_set_ctx(struct stellar_module *mod, void *ctx); + +const char *stellar_module_get_name(struct stellar_module* mod); +void stellar_module_set_name(struct stellar_module* mod, const char *name); + +struct stellar_module_manager; + +typedef struct stellar_module *module_on_init_func(struct stellar_module_manager *mod_mgr); +typedef void module_on_exit_func(struct stellar_module_manager *mod_mgr, struct stellar_module *mod); + +struct stellar_module_manager *stellar_module_manager_new(const char *module_spec_toml_path, int max_thread_num, struct mq_schema *mq_schema, struct logger *logger); +void stellar_module_manager_free(struct stellar_module_manager *mod_mgr); + +void stellar_module_manager_register_thread(struct stellar_module_manager* mod_mgr, int thread_id, struct mq_runtime *mq_rt); + +// return -1 on error +int stellar_module_manager_get_thread_id(struct stellar_module_manager* mod_mgr); +struct mq_runtime *stellar_module_manager_get_mq_runtime(struct stellar_module_manager *mod_mgr); + +struct stellar_module *stellar_module_manager_get_module(struct stellar_module_manager *mod_mgr, const char *module_name); + +int stellar_module_manager_get_max_thread_num(struct stellar_module_manager* mod_mgr); +const char *stellar_module_manager_get_toml_path(struct stellar_module_manager *mod_mgr); +struct mq_schema *stellar_module_manager_get_mq_schema(struct stellar_module_manager *mod_mgr); +struct logger *stellar_module_manager_get_logger(struct stellar_module_manager *mod_mgr); + + + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/dependence/include/stellar/mq.h b/dependence/include/stellar/mq.h new file mode 100644 index 0000000..aa7b416 --- /dev/null +++ b/dependence/include/stellar/mq.h @@ -0,0 +1,54 @@ +#pragma once + +#ifdef __cplusplus +extern "C" +{ +#endif + +struct mq_schema; +struct mq_schema *mq_schema_new(); +void mq_schema_free(struct mq_schema *s); + +typedef void mq_msg_free_cb_func(void *msg, void *msg_free_arg); +typedef void on_msg_cb_func(int topic_id, void *msg, void *on_msg_arg); +typedef void on_msg_dispatch_cb_func(int topic_id, + void *msg, + on_msg_cb_func* on_msg_cb, + void *on_msg_cb_arg, + void *dispatch_arg); + +//return topic_id +int mq_schema_create_topic(struct mq_schema *s, + const char *topic_name, + on_msg_dispatch_cb_func *on_dispatch_cb, + void *on_dispatch_arg, + mq_msg_free_cb_func *msg_free_cb, + void *msg_free_arg); + +int mq_schema_get_topic_id(struct mq_schema *s, const char *topic_name); + +int mq_schema_update_topic(struct mq_schema *s, + int topic_id, + on_msg_dispatch_cb_func *on_dispatch_cb, + void *on_dispatch_arg, + mq_msg_free_cb_func *msg_free_cb, + void *msg_free_arg); + +int mq_schema_destroy_topic(struct mq_schema *s, int topic_id); + +//return 0 if success, otherwise return -1. +int mq_schema_subscribe(struct mq_schema *s, int topic_id, on_msg_cb_func *on_msg_cb, void * on_msg_cb_arg); + + +struct mq_runtime; +struct mq_runtime *mq_runtime_new(struct mq_schema *s); +void mq_runtime_free(struct mq_runtime *s); + +// return 0 if success, otherwise return -1 +int mq_runtime_publish_message(struct mq_runtime *rt, int topic_id, void *msg);// append message to pending queue +void mq_runtime_dispatch(struct mq_runtime *rt);// dispatch all message in pending queue, dispatched message will be append to dlq +void mq_runtime_clean(struct mq_runtime *rt); // free all message in dlq and pending queue, during this period, publish will be disabled + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/dependence/include/stellar/packet.h b/dependence/include/stellar/packet.h new file mode 100644 index 0000000..e910237 --- /dev/null +++ b/dependence/include/stellar/packet.h @@ -0,0 +1,193 @@ +#pragma once + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include +#define __FAVOR_BSD 1 +#include +#include +#include +#include +#include +#include +#include +#include + +struct packet; +/****************************************************************************** + * layer + ******************************************************************************/ + +enum layer_proto +{ + LAYER_PROTO_NONE = 0, + + // L2 -- data link layer + LAYER_PROTO_ETHER = 1, + LAYER_PROTO_PWETH = 2, + LAYER_PROTO_PPP = 3, + LAYER_PROTO_L2TP = 4, + + // L2 -- tunnel + LAYER_PROTO_VLAN = 21, + LAYER_PROTO_PPPOE = 22, + LAYER_PROTO_MPLS = 23, + + // L3 -- network layer + LAYER_PROTO_IPV4 = 31, + LAYER_PROTO_IPV6 = 32, + LAYER_PROTO_IPAH = 33, + + // L3 -- tunnel + LAYER_PROTO_GRE = 41, + + // L4 -- transport layer + LAYER_PROTO_UDP = 51, + LAYER_PROTO_TCP = 52, + LAYER_PROTO_ICMP = 53, + LAYER_PROTO_ICMP6 = 54, + + // L4 -- tunnel + LAYER_PROTO_VXLAN = 61, + LAYER_PROTO_GTP_U = 62, + LAYER_PROTO_GTP_C = 63, +}; + +struct layer +{ + enum layer_proto proto; + uint16_t hdr_len; + union + { + // all hdr ptr refer to raw packet, read-only + const struct ethhdr *eth; + const struct ip *ip4; + const struct ip6_hdr *ip6; + const struct tcphdr *tcp; + const struct udphdr *udp; + const struct icmphdr *icmp4; + const struct icmp6_hdr *icmp6; + const struct mpls_label *mpls; + const char *raw; // e.g. pppoe, l2tp, gre, gtp, etc. + } hdr; +}; + +int packet_get_layer_count(const struct packet *pkt); +const struct layer *packet_get_layer_by_idx(const struct packet *pkt, int idx); + +// // example: foreach layer in packet (inorder) +// int count = packet_get_layer_count(pkt); +// for (int i = 0; i < count; i++) +// { +// const struct layer *layer = packet_get_layer_by_idx(pkt, i); +// // do something with layer +// } +// +// +// // example: foreach layer in packet (reverse) +// int count = packet_get_layer_count(pkt); +// for (int i = count - 1; i >= 0; i--) +// { +// const struct layer *layer = packet_get_layer_by_idx(pkt, i); +// // do something with layer +// } + +/****************************************************************************** + * tunnel + ******************************************************************************/ + +enum tunnel_type +{ + TUNNEL_IPV4 = 1, // contain layers: IPv4, (next inner layer must be IPv4 / IPv6) + TUNNEL_IPV6 = 2, // contain layers: IPv6, (next inner layer must be IPv4 / IPv6) + + TUNNEL_GRE = 3, // contain layers: IPv4 + GRE + // contain layers: IPv6 + GRE + + TUNNEL_GTP = 4, // contain layers: IPv4 + UDP + GTP + // contain layers: IPv6 + UDP + GTP + + TUNNEL_VXLAN = 5, // contain layers: IPv4 + UDP + VXLAN + // contain layers: IPv6 + UDP + VXLAN + + TUNNEL_L2TP = 6, // contain layers: IPv4 + UDP + L2TP + // contain layers: IPv6 + UDP + L2TP + + TUNNEL_TEREDO = 7, // contain layers: IPv4 + UDP, (next inner layer must be IPv6) +}; + +#define MAX_LAYERS_PER_TUNNEL 3 +struct tunnel +{ + enum tunnel_type type; + + int layer_count; + const struct layer *layers[MAX_LAYERS_PER_TUNNEL]; +}; + +int packet_get_tunnel_count(const struct packet *pkt); +// return 0: success  +// return -1: failed +int packet_get_tunnel_by_idx(const struct packet *pkt, int idx, struct tunnel *out); + +/****************************************************************************** + * build + ******************************************************************************/ + +/* + * tcp_seq: the sequence number of the new TCP packet (in host byte order) + * tcp_ack: the acknowledgment number of the new TCP packet (in host byte order) + * tcp_options_len: the length of the options (must be a multiple of 4) + */ +struct packet *packet_build_tcp(const struct packet *origin_pkt, uint32_t tcp_seq, uint32_t tcp_ack, uint8_t tcp_flags, + const char *tcp_options, uint16_t tcp_options_len, + const char *tcp_payload, uint16_t tcp_payload_len); +struct packet *packet_build_udp(const struct packet *origin_pkt, const char *udp_payload, uint16_t udp_payload_len); +struct packet *packet_build_l3(const struct packet *origin_pkt, uint8_t ip_proto, const char *l3_payload, uint16_t l3_payload_len); + +/****************************************************************************** + * utils + ******************************************************************************/ + +#define MAX_SIDS 8 +struct sids +{ + uint16_t sid[MAX_SIDS]; + int used; +}; +void packet_prepend_sids(struct packet *pkt, const struct sids *sids); + +enum packet_direction +{ + PACKET_DIRECTION_OUTGOING = 0, // Internal -> External: 0 + PACKET_DIRECTION_INCOMING = 1, // External -> Internal: 1 +}; +enum packet_direction packet_get_direction(const struct packet *pkt); + +enum packet_action +{ + PACKET_ACTION_FORWARD = 0, + PACKET_ACTION_DROP = 1, +}; + +void packet_set_action(struct packet *pkt, enum packet_action action); +enum packet_action packet_get_action(const struct packet *pkt); + +void packet_set_timeval(struct packet *pkt, const struct timeval *tv); +const struct timeval *packet_get_timeval(const struct packet *pkt); + +const char *packet_get_raw_data(const struct packet *pkt); +uint16_t packet_get_raw_len(const struct packet *pkt); + +const char *packet_get_payload(const struct packet *pkt); +uint16_t packet_get_payload_len(const struct packet *pkt); + +void packet_set_exdata(struct packet *pkt, int idx, void *ex_ptr); +void *packet_get_exdata(struct packet *pkt, int idx); + +#ifdef __cplusplus +} +#endif diff --git a/dependence/include/stellar/packet_exdata.h b/dependence/include/stellar/packet_exdata.h deleted file mode 100644 index 7620eae..0000000 --- a/dependence/include/stellar/packet_exdata.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -#include "stellar.h" - -typedef void packet_exdata_free(struct packet *pkt, int idx, void *ex_ptr, void *arg); -int stellar_packet_exdata_new_index(struct stellar *st, const char *name, packet_exdata_free *free_func,void *arg); -int packet_exdata_set(struct packet *pkt, int idx, void *ex_ptr); -void *packet_exdata_get(struct packet *pkt, int idx); \ No newline at end of file diff --git a/dependence/include/stellar/packet_manager.h b/dependence/include/stellar/packet_manager.h new file mode 100644 index 0000000..8270c7b --- /dev/null +++ b/dependence/include/stellar/packet_manager.h @@ -0,0 +1,37 @@ +#pragma once + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "stellar/exdata.h" +#include "stellar/packet.h" + +enum packet_stage +{ + PACKET_STAGE_PREROUTING, + PACKET_STAGE_INPUT, + PACKET_STAGE_FORWARD, + PACKET_STAGE_OUTPUT, + PACKET_STAGE_POSTROUTING, + PACKET_STAGE_MAX, +}; + +struct packet_manager; + +int packet_manager_new_packet_exdata_index(struct packet_manager *pkt_mgr, const char *name, exdata_free *func, void *arg); + +typedef void on_packet_stage_callback(enum packet_stage stage, struct packet *pkt, void *args); +int packet_manager_subscribe(struct packet_manager *pkt_mgr, enum packet_stage stage, on_packet_stage_callback *cb, void *args); + +// if two modules claim the same packet at the same stage, the second 'claim' fails. +// return 0 on success +// return -1 on failure +typedef void on_packet_claimed_callback(struct packet *pkt, void *args); +int packet_manager_claim_packet(struct packet_manager *pkt_mgr, uint16_t thread_id, struct packet *pkt, on_packet_claimed_callback cb, void *args); +void packet_manager_schedule_packet(struct packet_manager *pkt_mgr, uint16_t thread_id, struct packet *pkt, enum packet_stage stage); + +#ifdef __cplusplus +} +#endif diff --git a/dependence/include/stellar/packet_mq.h b/dependence/include/stellar/packet_mq.h deleted file mode 100644 index 94bb39b..0000000 --- a/dependence/include/stellar/packet_mq.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include "stellar.h" - -//session mq -typedef void packet_msg_free_cb_func(struct packet *pkt, void *msg, void *msg_free_arg); -typedef void on_packet_msg_cb_func(struct packet *pkt, int topic_id, const void *msg, void *plugin_env); - -//return topic_id -int stellar_packet_mq_create_topic(struct stellar *st, const char *topic_name, packet_msg_free_cb_func *msg_free_cb, void *msg_free_arg); - -int stellar_packet_mq_get_topic_id(struct stellar *st, const char *topic_name); - -int stellar_packet_mq_update_topic(struct stellar *st, int topic_id, packet_msg_free_cb_func *msg_free_cb, void *msg_free_arg); - -int stellar_packet_mq_destroy_topic(struct stellar *st, int topic_id); - -//return 0 if success, otherwise return -1. -int stellar_packet_mq_subscribe(struct stellar *st, int topic_id, on_packet_msg_cb_func *plugin_on_msg_cb, int plugin_id); //packet plugin only - -int packet_mq_publish_message(struct packet *pkt, int topic_id, void *msg); - diff --git a/dependence/include/stellar/polling_manager.h b/dependence/include/stellar/polling_manager.h new file mode 100644 index 0000000..641c03e --- /dev/null +++ b/dependence/include/stellar/polling_manager.h @@ -0,0 +1,21 @@ +#pragma once + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "stellar/module_manager.h" + +struct stellar_polling_manager; + +struct stellar_polling_manager *stellar_module_get_polling_manager(struct stellar_module_manager *mod_mgr); + +typedef void module_on_polling_func(struct stellar_polling_manager* mod_mgr, void *polling_arg); +//return 0 if success, otherwise return -1. +int stellar_polling_subscribe(struct stellar_polling_manager* mod_mgr, module_on_polling_func on_polling, void *polling_arg); +void stellar_polling_active(struct stellar_polling_manager *mod_mgr); + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/dependence/include/stellar/session.h b/dependence/include/stellar/session.h index 3f4f4d3..67c8c98 100644 --- a/dependence/include/stellar/session.h +++ b/dependence/include/stellar/session.h @@ -1,134 +1,151 @@ #pragma once -#include "stellar.h" - -#include -#include - -enum session_type +#ifdef __cplusplus +extern "C" { - SESSION_TYPE_TCP, - SESSION_TYPE_UDP, - __SESSION_TYPE_MAX, -}; +#endif + +#include "stellar/packet.h" enum session_state { - SESSION_STATE_INVALID = 0, - SESSION_STATE_OPENING = 1 , - SESSION_STATE_ACTIVE = 2, - SESSION_STATE_CLOSING = 3, - SESSION_STATE_CONTROL = 6, - __SESSION_STATE_MAX, + SESSION_STATE_INIT = 0, + SESSION_STATE_OPENING = 1, + SESSION_STATE_ACTIVE = 2, + SESSION_STATE_CLOSING = 3, + SESSION_STATE_DISCARD = 4, + SESSION_STATE_CLOSED = 5, + MAX_STATE = 6, }; -enum session_type session_get_type(struct session *sess); +enum session_type +{ + SESSION_TYPE_TCP = 0x1, + SESSION_TYPE_UDP = 0x2, +}; + +enum session_direction +{ + SESSION_DIRECTION_INBOUND = 0, + SESSION_DIRECTION_OUTBOUND = 1, +}; + +enum flow_type +{ + FLOW_TYPE_NONE = -1, + FLOW_TYPE_C2S = 0, + FLOW_TYPE_S2C = 1, + MAX_FLOW_TYPE = 2, +}; + +enum closing_reason +{ + CLOSING_BY_TIMEOUT = 0x1, + CLOSING_BY_LRU_EVICTED = 0x2, + CLOSING_BY_PORT_REUSE_EVICTED = 0x3, + CLOSING_BY_CLIENT_FIN = 0x4, + CLOSING_BY_CLIENT_RST = 0x5, + CLOSING_BY_SERVER_FIN = 0x6, + CLOSING_BY_SERVER_RST = 0x7, +}; + +enum session_stat +{ + // raw packet + STAT_RAW_PACKETS_RECEIVED, + STAT_RAW_BYTES_RECEIVED, + + STAT_RAW_PACKETS_TRANSMITTED, + STAT_RAW_BYTES_TRANSMITTED, + + STAT_RAW_PACKETS_DROPPED, + STAT_RAW_BYTES_DROPPED, + + // duplicate packets + STAT_DUPLICATE_PACKETS_BYPASS, + STAT_DUPLICATE_BYTES_BYPASS, + + // injected packet + STAT_INJECTED_PACKETS_FAILED, + STAT_INJECTED_PACKETS_SUCCESS, + STAT_INJECTED_BYTES_SUCCESS, + + // control packet + STAT_CONTROL_PACKETS_RECEIVED, // TODO + STAT_CONTROL_BYTES_RECEIVED, // TODO + + STAT_CONTROL_PACKETS_TRANSMITTED, + STAT_CONTROL_BYTES_TRANSMITTED, + + STAT_CONTROL_PACKETS_DROPPED, + STAT_CONTROL_BYTES_DROPPED, + + // TCP segment + STAT_TCP_SEGMENTS_RECEIVED, + STAT_TCP_PAYLOADS_RECEIVED, + + STAT_TCP_SEGMENTS_EXPIRED, + STAT_TCP_PAYLOADS_EXPIRED, + + STAT_TCP_SEGMENTS_RETRANSMIT, + STAT_TCP_PAYLOADS_RETRANSMIT, + + STAT_TCP_SEGMENTS_OVERLAP, + STAT_TCP_PAYLOADS_OVERLAP, + + STAT_TCP_SEGMENTS_NOSPACE, + STAT_TCP_PAYLOADS_NOSPACE, + + STAT_TCP_SEGMENTS_INORDER, + STAT_TCP_PAYLOADS_INORDER, + + STAT_TCP_SEGMENTS_REORDERED, + STAT_TCP_PAYLOADS_REORDERED, + + STAT_TCP_SEGMENTS_BUFFERED, + STAT_TCP_PAYLOADS_BUFFERED, + + STAT_TCP_SEGMENTS_RELEASED, + STAT_TCP_PAYLOADS_RELEASED, + + MAX_STAT, +}; + +// realtime in milliseconds +enum session_timestamp +{ + SESSION_TIMESTAMP_START, + SESSION_TIMESTAMP_LAST, + MAX_TIMESTAMP, +}; + +struct session; #define SESSION_SEEN_C2S_FLOW (1 << 0) #define SESSION_SEEN_S2C_FLOW (1 << 1) -int session_is_symmetric(struct session *sess, unsigned char *flag); +int session_is_symmetric(const struct session *sess, unsigned char *flag); -long long session_get_client_isn(struct session *sess); -long long session_get_server_isn(struct session *sess); +int session_has_duplicate_traffic(const struct session *sess); +enum session_type session_get_type(const struct session *sess); -#define SESSION_IS_TUNNLE_NON (0) /* default is 0, not tunnel; */ -#define SESSION_IS_TUNNLE_6OVER4 (1 << 0) -#define SESSION_IS_TUNNLE_4OVER6 (1 << 1) -#define SESSION_IS_TUNNLE_GRE (1 << 2) -#define SESSION_IS_TUNNLE_IP_IN_IP (1 << 3) -#define SESSION_IS_TUNNLE_PPTP (1 << 4) -#define SESSION_IS_TUNNLE_L2TP (1 << 5) -#define SESSION_IS_TUNNLE_TEREDO (1 << 6) -#define SESSION_IS_TUNNLE_GTP (1 << 7) -#define SESSION_IS_TUNNLE_SOCKS (1 << 8) -#define SESSION_IS_TUNNLE_HTTP_PROXY (1 << 9) +enum session_state session_get_current_state(const struct session *sess); +const struct packet *session_get0_current_packet(const struct session *sess); -int session_is_outmost(struct session *sess, uint64_t *flag); -int session_is_innermost(struct session *sess, uint64_t *flag); +enum closing_reason session_get_closing_reason(const struct session *sess); +enum session_direction session_get_direction(const struct session *sess); +enum flow_type session_get_flow_type(const struct session *sess); +const struct packet *session_get_first_packet(const struct session *sess, enum flow_type type); +uint64_t session_get_id(const struct session *sess); +uint64_t session_get_timestamp(const struct session *sess, enum session_timestamp type); +uint64_t session_get_stat(const struct session *sess, enum flow_type type, enum session_stat stat); -#define SESSION_DIRECTION_IN 0 -#define SESSION_DIRECTION_OUT 1 -int session_get_direction(struct session *sess); +const char *session_get0_readable_addr(const struct session *sess); -enum session_addr_type -{ - SESSION_ADDR_TYPE_IPV4_TCP, - SESSION_ADDR_TYPE_IPV4_UDP, - SESSION_ADDR_TYPE_IPV6_TCP, - SESSION_ADDR_TYPE_IPV6_UDP, - SESSION_ADDR_TYPE_UNKNOWN, - __SESSION_ADDR_TYPE_MAX, -}; -struct session_addr_ipv4{ - uint32_t saddr; /* network order */ - uint32_t daddr; /* network order */ - uint16_t sport; /* network order */ - uint16_t dport; /* network order */ -}; +void session_set_discard(struct session *sess); -#include -#ifndef IPV6_ADDR_LEN -#define IPV6_ADDR_LEN (sizeof(struct in6_addr)) +void session_set_exdata(struct session *sess, int idx, void *ex_ptr); +void *session_get_exdata(const struct session *sess, int idx); + +#ifdef __cplusplus +} #endif -struct session_addr_ipv6 -{ - uint8_t saddr[IPV6_ADDR_LEN] ; - uint8_t daddr[IPV6_ADDR_LEN] ; - uint16_t sport; /* network order */ - uint16_t dport; /* network order */ -}; - -struct session_addr -{ - union - { - struct session_addr_ipv4 ipv4; - struct session_addr_ipv6 ipv6; - }; -}; - -struct session_addr *session_get0_addr(struct session *sess, enum session_addr_type *addr_type); - -const char *session_get0_readable_addr(struct session *sess); -const char *session_get0_current_payload(struct session *sess, size_t *payload_len); -enum session_state session_get_current_state(struct session *sess); - -int session_get_current_thread_id(struct session *sess); -int session_get_current_plugin_id(struct session *sess); - -/* ------------session------------------*/ -/* |l2|l3|l4|session payload| */ -const char *session_get0_current_l3_header(struct session *sess); -const char *session_get0_current_l4_header(struct session *sess); - -const char *session_get0_l2_l3_hdr(struct session *sess, int session_direction, size_t *l2_l3_hdr_len); - -uint16_t *session_get0_segment_id_list(struct session *sess, int session_direction, size_t *sid_num); -const char *session_get0_route_ctx(struct session *sess, int session_direction, size_t *route_ctx_len); - -int session_set_session_id(struct session *sess, uint64_t session_id); -int session_set_preappend_segment_id_list(struct session *sess, uint16_t *sid, size_t sid_num); - -const struct packet *session_get0_current_packet(struct session *sess); - - -//flow direction -#define PACKET_DIRECTION_C2S 0 -#define PACKET_DIRECTION_S2C 1 -#define PACKET_DIRECTION_UNKNOWN 2 -int packet_get_direction(const struct packet *pkt); - -//route direction -#define PACKET_DIRECTION_INCOMING 0 -#define PACKET_DIRECTION_OUTGOING 1 -int packet_get_route_direction(const struct packet *pkt); - -const char *packet_get0_data(const struct packet *pkt, size_t *data_len); -int packet_arrive_time(const struct packet *pkt, struct timeval *ts); -unsigned char packet_get_ip_protocol(struct packet *pkt); - -void packet_drop(const struct packet *pkt); -const char *packet_get0_readable_addr(struct packet *pkt); -int packet_get_current_thread_id(struct packet *pkt); - -struct session *packet_get_session(const struct packet *pkt); \ No newline at end of file diff --git a/dependence/include/stellar/session_exdata.h b/dependence/include/stellar/session_exdata.h deleted file mode 100644 index 6f97c94..0000000 --- a/dependence/include/stellar/session_exdata.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -#include "stellar.h" - -typedef void session_exdata_free(struct session *sess, int idx, void *ex_ptr, void *arg); -int stellar_session_exdata_new_index(struct stellar *st, const char *name, session_exdata_free *free_func,void *arg); -int session_exdata_set(struct session *sess, int idx, void *ex_ptr); -void *session_exdata_get(struct session *sess, int idx); \ No newline at end of file diff --git a/dependence/include/stellar/session_flags.h b/dependence/include/stellar/session_flags.h new file mode 100644 index 0000000..2aeace8 --- /dev/null +++ b/dependence/include/stellar/session_flags.h @@ -0,0 +1,55 @@ +#pragma once + +#include +#include + +#define MESSAGE_MAGIC 0x12345678 + +#define SESSION_FLAGS_MESSAGE_TOPIC "TOPIC_SESSION_FLAGS" + +enum +{ + session_flags_bulky_mask = 1, + session_flags_cbr_mask, + session_flags_local_client_mask, + session_flags_local_server_mask, + session_flags_download_mask, + session_flags_interactive_mask, + session_flags_inbound_mask, + session_flags_outbound_mask, + session_flags_pseudo_unidirectional_mask, + session_flags_streaming_mask, + session_flags_unidirectional_mask, + session_flags_random_looking_mask, + session_flags_c2s_mask, + session_flags_s2c_mask, + session_flags_bidirectional_mask, + session_flags_tunneling_mask, + session_flags_all_mask +}; + +#define SESSION_FLAGS_START (0x0000000000000001) +#define SESSION_FLAGS_BULKY (SESSION_FLAGS_START << session_flags_bulky_mask) +#define SESSION_FLAGS_CBR (SESSION_FLAGS_START << session_flags_cbr_mask) +#define SESSION_FLAGS_LOCAL_CLIENT (SESSION_FLAGS_START << session_flags_local_client_mask) +#define SESSION_FLAGS_LOCAL_SERVER (SESSION_FLAGS_START << session_flags_local_server_mask) +#define SESSION_FLAGS_DOWNLOAD (SESSION_FLAGS_START << session_flags_download_mask) +#define SESSION_FLAGS_INTERACTIVE (SESSION_FLAGS_START << session_flags_interactive_mask) +#define SESSION_FLAGS_INBOUND (SESSION_FLAGS_START << session_flags_inbound_mask) +#define SESSION_FLAGS_OUTBOUND (SESSION_FLAGS_START << session_flags_outbound_mask) +#define SESSION_FLAGS_PSEUDO_UNIDIRECTIONAL (SESSION_FLAGS_START << session_flags_pseudo_unidirectional_mask) +#define SESSION_FLAGS_STREAMING (SESSION_FLAGS_START << session_flags_streaming_mask) +#define SESSION_FLAGS_UNIDIRECTIONAL (SESSION_FLAGS_START << session_flags_unidirectional_mask) +#define SESSION_FLAGS_RANDOM_LOOKING (SESSION_FLAGS_START << session_flags_random_looking_mask) +#define SESSION_FLAGS_C2S (SESSION_FLAGS_START << session_flags_c2s_mask) +#define SESSION_FLAGS_S2C (SESSION_FLAGS_START << session_flags_s2c_mask) +#define SESSION_FLAGS_BIDIRECTIONAL (SESSION_FLAGS_START << session_flags_bidirectional_mask) +#define SESSION_FLAGS_TUNNELING (SESSION_FLAGS_START << session_flags_tunneling_mask) + +struct session_flags_message +{ + int magic; + uint64_t flags; + uint32_t array_num; + uint32_t *packet_sequence_array; +}; \ No newline at end of file diff --git a/dependence/include/stellar/session_manager.h b/dependence/include/stellar/session_manager.h new file mode 100644 index 0000000..749ccbb --- /dev/null +++ b/dependence/include/stellar/session_manager.h @@ -0,0 +1,27 @@ + + +#pragma once + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "stellar/exdata.h" +#include "stellar/session.h" + +struct session_manager; + +int session_manager_new_session_exdata_index(struct session_manager *sess_mgr, const char *name, exdata_free *func, void *arg); + +typedef void on_session_callback(struct session *sess, struct packet *pkt, void *args); +typedef void on_tcp_stream_callback(struct session *sess, const char *tcp_payload, uint32_t tcp_payload_len, void *args); + +int session_manager_subscribe_tcp(struct session_manager *sess_mgr, on_session_callback *cb, void *args); +int session_manager_subscribe_udp(struct session_manager *sess_mgr, on_session_callback *cb, void *args); +int session_manager_subscribe_control_packet(struct session_manager *sess_mgr, on_session_callback *cb, void *args); +int session_manager_subscribe_tcp_stream(struct session_manager *sess_mgr, on_tcp_stream_callback *cb, void *args); + +#ifdef __cplusplus +} +#endif diff --git a/dependence/include/stellar/session_mq.h b/dependence/include/stellar/session_mq.h deleted file mode 100644 index 3c62f69..0000000 --- a/dependence/include/stellar/session_mq.h +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once - -#include "stellar.h" - -//session mq -typedef void session_msg_free_cb_func(struct session *sess, void *msg, void *msg_free_arg); -typedef void on_session_msg_cb_func(struct session *sess, int topic_id, const void *msg, void *per_session_ctx, void *plugin_env); - -//return topic_id -int stellar_session_mq_create_topic(struct stellar *st, const char *topic_name, session_msg_free_cb_func *msg_free_cb, void *msg_free_arg); - -int stellar_session_mq_get_topic_id(struct stellar *st, const char *topic_name); - -int stellar_session_mq_update_topic(struct stellar *st, int topic_id, session_msg_free_cb_func *msg_free_cb, void *msg_free_arg); - -int stellar_session_mq_destroy_topic(struct stellar *st, int topic_id); - -//return 0 if success, otherwise return -1. -int stellar_session_mq_subscribe(struct stellar *st, int topic_id, on_session_msg_cb_func *plugin_on_msg_cb, int plugin_id); - -int session_mq_publish_message(struct session *sess, int topic_id, void *msg); - -int session_mq_ignore_message(struct session *sess, int topic_id, int plugin_id); -int session_mq_unignore_message(struct session *sess, int topic_id, int plugin_id); - -int session_mq_topic_is_active(struct session *sess, int topic_id); - -enum session_mq_priority -{ - SESSION_MQ_PRIORITY_LOW, - SESSION_MQ_PRIORITY_NORMAL, - SESSION_MQ_PRIORITY_HIGH, - SESSION_MQ_PRIORITY_MAX, -}; - -int session_mq_publish_message_with_priority(struct session *sess, int topic_id, void *msg, enum session_mq_priority priority); \ No newline at end of file diff --git a/dependence/include/stellar/socks_decoder.h b/dependence/include/stellar/socks_decoder.h new file mode 100644 index 0000000..c3034b8 --- /dev/null +++ b/dependence/include/stellar/socks_decoder.h @@ -0,0 +1,44 @@ +#include + +#include +#ifndef IPV6_ADDR_LEN +#define IPV6_ADDR_LEN (sizeof(struct in6_addr)) +#endif + + +#define SOCKS_MESSAGE_TOPIC "TOPIC_SOCKS" + + +enum socks_addr_type +{ + SOCKS_ADDR_IPV4, + SOCKS_ADDR_IPV6, + SOCKS_ADDR_FQDN +}; + +struct socks_addr +{ + enum socks_addr_type type; + union + { + uint32_t ipv4; /* network order */ + uint8_t ipv6[IPV6_ADDR_LEN] ; + struct iovec fqdn; + }; + uint16_t port; /* network order */ +}; + +enum socks_version +{ + SOCKS_VERSION_4, + SOCKS_VERSION_5 +}; + +struct socks_info +{ + enum socks_version version; + struct socks_addr dst_addr; + struct iovec user_name; + struct iovec password; +};//message data + \ No newline at end of file diff --git a/dependence/include/stellar/stellar.h b/dependence/include/stellar/stellar.h index e9322be..2f103a3 100644 --- a/dependence/include/stellar/stellar.h +++ b/dependence/include/stellar/stellar.h @@ -1,48 +1,35 @@ #pragma once -struct session; +#ifdef __cplusplus +extern "C" +{ +#endif + +#include + +#include "stellar/log.h" +#include "stellar/packet.h" + struct stellar; -int stellar_get_worker_thread_num(struct stellar *st); -int stellar_get_current_thread_id(struct stellar *st); - -//return plugin_env -typedef void *plugin_on_load_func(struct stellar *st); -typedef void plugin_on_unload_func(void *plugin_env); - -//return per_session_ctx -typedef void *session_ctx_new_func(struct session *sess, void *plugin_env); -typedef void session_ctx_free_func(struct session *sess, void *session_ctx, void *plugin_env); - -//intrinsic topic, publish packet as message -#define TOPIC_TCP "TCP" -#define TOPIC_TCP_STREAM "TCP_STREAM" -#define TOPIC_UDP "UDP" -#define TOPIC_EGRESS "EGRESS" -#define TOPIC_CONTROL_PACKET "CONTROL_PACKET" - -//return session plugin_id -int stellar_session_plugin_register(struct stellar *st, - session_ctx_new_func session_ctx_new, - session_ctx_free_func session_ctx_free, - void *plugin_env); - -void stellar_session_plugin_dettach_current_session(struct session *sess); +typedef void plugin_on_packet_func(struct packet *pkt, void *on_packet_cb_arg); +//return 0 if success, otherwise return -1. +int stellar_raw_packet_subscribe(struct stellar *st, plugin_on_packet_func *on_packet_cb, void *on_packet_cb_arg); -struct packet; -typedef void plugin_on_packet_func(struct packet *pkt, unsigned char ip_protocol, void *plugin_env); +void stellar_emit_datapath_telemetry(struct packet *pkt, const char * module, const char *str); -//return packet plugin_id -int stellar_packet_plugin_register(struct stellar *st, unsigned char ip_protocol, plugin_on_packet_func on_packet, void *plugin_env); +// only send user build packet, can't send packet which come from network +// void stellar_send_build_packet(struct stellar *st, struct packet *pkt); +struct stellar *stellar_new(const char *toml_file); +void stellar_run(struct stellar *st); +void stellar_free(struct stellar *st); +void stellar_loopbreak(struct stellar *st); +void stellar_reload_log_level(struct stellar *st); +struct logger *stellar_get_logger(struct stellar *st); -//return polling work result, 0: no work, 1: work -typedef int plugin_on_polling_func(void *plugin_env); - -//return polling plugin_id -int stellar_polling_plugin_register(struct stellar *st, plugin_on_polling_func on_polling, void *plugin_env); - - -void stellar_emit_datapath_telemetry(struct packet *pkt, const char * module, const char *str); \ No newline at end of file +#ifdef __cplusplus +} +#endif diff --git a/dependence/include/stellar/stratum_decoder.h b/dependence/include/stellar/stratum_decoder.h new file mode 100644 index 0000000..a6eed42 --- /dev/null +++ b/dependence/include/stellar/stratum_decoder.h @@ -0,0 +1,18 @@ +#include + +#define STRATUM_MESSAGE_TOPIC "TOPIC_STRATUM" + +enum cryptocurrency_type +{ + ETH=1, + OTHER=2 +}; + +struct stratum_field +{ + enum cryptocurrency_type type; + struct iovec mining_pools; + struct iovec mining_program; + struct iovec mining_subscribe; + +};//message data \ No newline at end of file diff --git a/dependence/include/stellar/utils.h b/dependence/include/stellar/utils.h index 8158916..16fd318 100644 --- a/dependence/include/stellar/utils.h +++ b/dependence/include/stellar/utils.h @@ -1,43 +1,52 @@ #pragma once -#include //calloc -#include //NULL +#include //calloc +#include //NULL +#define ALLOC(type, number) ((type *)calloc(sizeof(type), number)) #define CALLOC(type, number) ((type *)calloc(sizeof(type), number)) #define REALLOC(type, ptr, number) ((type *)realloc(ptr, (number) * sizeof(type))) -#define FREE(p) {free(p); p = NULL;} +#define FREE(p) \ + { \ + free(p); \ + p = NULL; \ + } -#define TRUE 1 -#define FALSE 0 +#define TRUE 1 +#define FALSE 0 #ifndef MAX -#define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) #endif #ifndef MIN -#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) #endif #ifndef offsetof -#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) +#define offsetof(TYPE, MEMBER) ((size_t) & ((TYPE *)0)->MEMBER) #endif #ifndef container_of #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ - (type *)( (char *)__mptr - offsetof(type,member) );}) + (type *)( (char *)__mptr - offsetof(type,member) ); }) #endif +#ifndef count_of +#define count_of(x) (sizeof(x) / sizeof(0 [x])) +#endif + +#ifndef likely +#define likely(x) __builtin_expect((x), 1) +#endif /* likely */ + +#ifndef unlikely +#define unlikely(x) __builtin_expect((x), 0) +#endif /* unlikely */ + #ifndef __unused #define __unused __attribute__((__unused__)) #endif - -#ifndef likely -#define likely(x) __builtin_expect((x),1) -#endif /* likely */ - -#ifndef unlikely -#define unlikely(x) __builtin_expect((x),0) -#endif /* unlikely */