From c0514964f95715f59e11f8aaba82fadca567a91c Mon Sep 17 00:00:00 2001 From: luwenpeng Date: Sun, 4 Feb 2024 17:40:26 +0800 Subject: [PATCH] Add ip_reassemble & ip_fragment function define --- src/ip_fragment/ip_fragment.cpp | 32 +++++++++++++++++++++++ src/ip_fragment/ip_fragment.h | 26 +++++++++++++++++++ src/ip_reassemble/ip_reassemble.cpp | 31 ++++++++++++++++++++++ src/ip_reassemble/ip_reassemble.h | 40 +++++++++++++++++++++++++++++ 4 files changed, 129 insertions(+) create mode 100644 src/ip_fragment/ip_fragment.cpp create mode 100644 src/ip_fragment/ip_fragment.h create mode 100644 src/ip_reassemble/ip_reassemble.cpp create mode 100644 src/ip_reassemble/ip_reassemble.h diff --git a/src/ip_fragment/ip_fragment.cpp b/src/ip_fragment/ip_fragment.cpp new file mode 100644 index 0000000..8ee9c74 --- /dev/null +++ b/src/ip_fragment/ip_fragment.cpp @@ -0,0 +1,32 @@ +#include "ip_fragment.h" + +/* + * Return the number of fragmented packets, stored in the pkts_out array + * Packets in the pkts_out array should be freed by calling the packet_free() function + */ + +uint16_t ipv4_fragment_packet(struct packet *pkt_in, struct packet **pkts_out, uint16_t nb_pkts_out, uint16_t mtu_size) +{ + if (pkt_in == NULL || pkts_out == NULL || nb_pkts_out == 0) + { + IP_FRAGMENT_LOG_ERROR("invalid input parameters"); + return 0; + } + + // TODO + + return 0; +} + +uint16_t ipv6_fragment_packet(struct packet *pkt_in, struct packet **pkts_out, uint16_t nb_pkts_out, uint16_t mtu_size) +{ + if (pkt_in == NULL || pkts_out == NULL || nb_pkts_out == 0) + { + IP_FRAGMENT_LOG_ERROR("invalid input parameters"); + return 0; + } + + // TODO + + return 0; +} \ No newline at end of file diff --git a/src/ip_fragment/ip_fragment.h b/src/ip_fragment/ip_fragment.h new file mode 100644 index 0000000..227d750 --- /dev/null +++ b/src/ip_fragment/ip_fragment.h @@ -0,0 +1,26 @@ +#ifndef _IP_FRAGMENT_H +#define _IP_FRAGMENT_H + +#ifdef __cpluscplus +extern "C" +{ +#endif + +#include "packet.h" +#include "log.h" + +#define IP_FRAGMENT_LOG_DEBUG(format, ...) LOG_DEBUG("ip_fragment", format, ##__VA_ARGS__) +#define IP_FRAGMENT_LOG_ERROR(format, ...) LOG_ERROR("ip_fragment", format, ##__VA_ARGS__) + +/* + * Return the number of fragmented packets, stored in the pkts_out array + * Packets in the pkts_out array should be freed by calling the packet_free() function + */ +uint16_t ipv4_fragment_packet(struct packet *pkt_in, struct packet **pkts_out, uint16_t nb_pkts_out, uint16_t mtu_size); +uint16_t ipv6_fragment_packet(struct packet *pkt_in, struct packet **pkts_out, uint16_t nb_pkts_out, uint16_t mtu_size); + +#ifdef __cpluscplus +} +#endif + +#endif diff --git a/src/ip_reassemble/ip_reassemble.cpp b/src/ip_reassemble/ip_reassemble.cpp new file mode 100644 index 0000000..4479d7f --- /dev/null +++ b/src/ip_reassemble/ip_reassemble.cpp @@ -0,0 +1,31 @@ +#include "ip_reassemble.h" + +struct ip_reassemble_manager *ip_reassemble_manager_create(const struct ip_reassemble_config *config) +{ + // TODO +} + +void ip_reassemble_manager_destory(struct ip_reassemble_manager *mgr) +{ + // TODO +} + +void ip_reassemble_manager_stat(struct ip_reassemble_manager *mgr) +{ + // TODO +} + +/* + * Returns the reassembled packet, or NULL if the packet is not reassembled + * The returned packet should be freed by calling the packet_free() function + */ + +struct packet *ipv4_reassemble_packet(struct ip_reassemble_manager *mgr, const struct packet *pkt) +{ + // TODO +} + +struct packet *ipv6_reassemble_packet(struct ip_reassemble_manager *mgr, const struct packet *pkt) +{ + // TODO +} \ No newline at end of file diff --git a/src/ip_reassemble/ip_reassemble.h b/src/ip_reassemble/ip_reassemble.h new file mode 100644 index 0000000..911e8bc --- /dev/null +++ b/src/ip_reassemble/ip_reassemble.h @@ -0,0 +1,40 @@ +#ifndef _IP_REASSEMBLE_H +#define _IP_REASSEMBLE_H + +#ifdef __cpluscplus +extern "C" +{ +#endif + +#include "packet.h" +#include "log.h" + +#define IP_REASSEMBLE_DEBUG(format, ...) LOG_DEBUG("ip_reassemble", format, ##__VA_ARGS__) +#define IP_REASSEMBLE_ERROR(format, ...) LOG_ERROR("ip_reassemble", format, ##__VA_ARGS__) + +struct ip_reassemble_config +{ + bool enable_reassemble; + + uint32_t max_cycles; + uint32_t max_entries; + uint32_t bucket_entries; + uint32_t bucket_num; +}; + +struct ip_reassemble_manager *ip_reassemble_manager_create(const struct ip_reassemble_config *config); +void ip_reassemble_manager_destory(struct ip_reassemble_manager *mgr); +void ip_reassemble_manager_stat(struct ip_reassemble_manager *mgr); + +/* + * Returns the reassembled packet, or NULL if the packet is not reassembled + * The returned packet should be freed by calling the packet_free() function + */ +struct packet *ipv4_reassemble_packet(struct ip_reassemble_manager *mgr, const struct packet *pkt); +struct packet *ipv6_reassemble_packet(struct ip_reassemble_manager *mgr, const struct packet *pkt); + +#ifdef __cpluscplus +} +#endif + +#endif