#ifndef _SESSION_ADDRESS_H #define _SESSION_ADDRESS_H #ifdef __cpluscplus extern "C" { #endif #include #include "packet.h" #define SESSION_ADDR_MAX_LAYER 8 enum layer_type { LAYER_IPV4 = 0, LAYER_IPV6 = 1, LAYER_TCP = 2, LAYER_UDP = 3, }; struct ipv4_address { struct in_addr src; /* network order */ struct in_addr dst; /* network order */ }; struct ipv6_address { struct in6_addr src; /* network order */ struct in6_addr dst; /* network order */ }; struct tcp_port { uint16_t src; /* network order */ uint16_t dst; /* network order */ }; struct udp_port { uint16_t src; /* network order */ uint16_t dst; /* network order */ }; struct layer_tuple { enum layer_type type; union { struct ipv4_address ipv4; struct ipv6_address ipv6; struct tcp_port tcp; struct udp_port udp; } tuple; }; struct session_address { uint8_t used; struct layer_tuple layers[SESSION_ADDR_MAX_LAYER]; }; void session_address_init(struct session_address *addr, const struct packet *packet); void session_address_tostring(const struct session_address *addr, char *buf, size_t len); void session_address_reverse(struct session_address *addr); int session_address_selfcmp(struct session_address *addr); #ifdef __cpluscplus } #endif #endif