Add tools packet_parser
This commit is contained in:
@@ -6,6 +6,7 @@ extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netinet/ip.h>
|
||||
@@ -255,6 +256,25 @@ static inline void ipv4_hdr_set_opt_data(struct ip *hdr, const char *opt_data)
|
||||
memcpy((char *)hdr + sizeof(struct ip), opt_data, ipv4_hdr_get_opt_len(hdr));
|
||||
}
|
||||
|
||||
static inline int ipv4_hdr_to_str(const struct ip *hdr, char *buf, size_t size)
|
||||
{
|
||||
memset(buf, 0, size);
|
||||
char src_addr_str[INET6_ADDRSTRLEN] = {0};
|
||||
char dst_addr_str[INET6_ADDRSTRLEN] = {0};
|
||||
|
||||
struct in_addr src_addr = ipv4_hdr_get_src_in_addr(hdr);
|
||||
struct in_addr dst_addr = ipv4_hdr_get_dst_in_addr(hdr);
|
||||
inet_ntop(AF_INET, &src_addr, src_addr_str, sizeof(src_addr_str));
|
||||
inet_ntop(AF_INET, &dst_addr, dst_addr_str, sizeof(dst_addr_str));
|
||||
|
||||
return snprintf(buf, size, "IPv4: version=%u hdr_len=%u tos=%u total_len=%u ipid=%u flags=%u(rf=%u df=%u mf=%u) frag_offset=%u ttl=%u proto=%u checksum=%u src_addr=%s dst_addr=%s opt_len=%u",
|
||||
ipv4_hdr_get_version(hdr), ipv4_hdr_get_hdr_len(hdr), ipv4_hdr_get_tos(hdr),
|
||||
ipv4_hdr_get_total_len(hdr), ipv4_hdr_get_ipid(hdr), ipv4_hdr_get_flags(hdr),
|
||||
ipv4_hdr_get_rf_flag(hdr), ipv4_hdr_get_df_flag(hdr), ipv4_hdr_get_mf_flag(hdr),
|
||||
ipv4_hdr_get_frag_offset(hdr), ipv4_hdr_get_ttl(hdr), ipv4_hdr_get_proto(hdr),
|
||||
ipv4_hdr_get_checksum(hdr), src_addr_str, dst_addr_str, ipv4_hdr_get_opt_len(hdr));
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -6,6 +6,7 @@ extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netinet/ip6.h>
|
||||
|
||||
@@ -195,6 +196,22 @@ static inline void ipv6_frag_set_more(struct ip6_frag *frag, bool more)
|
||||
}
|
||||
}
|
||||
|
||||
static inline int ipv6_hdr_to_str(const struct ip6_hdr *hdr, char *buf, size_t size)
|
||||
{
|
||||
memset(buf, 0, size);
|
||||
char src_addr_str[INET6_ADDRSTRLEN] = {0};
|
||||
char dst_addr_str[INET6_ADDRSTRLEN] = {0};
|
||||
|
||||
struct in6_addr src_addr = ipv6_hdr_get_src_in6_addr(hdr);
|
||||
struct in6_addr dst_addr = ipv6_hdr_get_dst_in6_addr(hdr);
|
||||
inet_ntop(AF_INET6, &src_addr, src_addr_str, INET6_ADDRSTRLEN);
|
||||
inet_ntop(AF_INET6, &dst_addr, dst_addr_str, INET6_ADDRSTRLEN);
|
||||
|
||||
return snprintf(buf, size, "IPv6: version=%u traffic_class=%u flow_label=%u payload_len=%u next_header=%u hop_limit=%u src_addr=%s dst_addr=%s",
|
||||
ipv6_hdr_get_version(hdr), ipv6_hdr_get_traffic_class(hdr), ipv6_hdr_get_flow_label(hdr), ipv6_hdr_get_payload_len(hdr),
|
||||
ipv6_hdr_get_next_header(hdr), ipv6_hdr_get_hop_limit(hdr), src_addr_str, dst_addr_str);
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1021,9 +1021,9 @@ static inline const char *parse_ipv4(struct packet *pkt, const char *data, uint1
|
||||
// ip fragmented
|
||||
if (ipv4_hdr_get_mf_flag(hdr) || ipv4_hdr_get_frag_offset(hdr))
|
||||
{
|
||||
PACKET_LOG_WARN("ip is fragmented");
|
||||
PACKET_LOG_WARN("packet %p ip layer %p is fragmented", pkt, layer);
|
||||
pkt->frag_layer = layer;
|
||||
return layer->pld_ptr;
|
||||
// try continue parse
|
||||
}
|
||||
|
||||
// TESTED
|
||||
@@ -1057,9 +1057,9 @@ static inline const char *parse_ipv6(struct packet *pkt, const char *data, uint1
|
||||
// ipv6 fragment
|
||||
if (next_proto == IPPROTO_FRAGMENT)
|
||||
{
|
||||
PACKET_LOG_WARN("ipv6 is fragmented");
|
||||
PACKET_LOG_WARN("packet %p ipv6 layer %p is fragmented", pkt, layer);
|
||||
pkt->frag_layer = layer;
|
||||
return layer->pld_ptr;
|
||||
// try continue parse
|
||||
}
|
||||
|
||||
// TODO parse ipv6 extension headers
|
||||
@@ -1363,21 +1363,63 @@ void packet_print_str(const struct packet *pkt)
|
||||
return;
|
||||
}
|
||||
|
||||
char buffer[2048] = {0};
|
||||
printf("packet: %p, data_ptr: %p, data_len: %u, layers_used: %u, layers_size: %u\n",
|
||||
pkt, pkt->data_ptr, pkt->data_len,
|
||||
pkt->layers_used, pkt->layers_size);
|
||||
for (uint8_t i = 0; i < pkt->layers_used; i++)
|
||||
{
|
||||
int used = 0;
|
||||
const struct packet_layer *layer = &pkt->layers[i];
|
||||
printf(" layer[%u]: %p, type: %s, hdr_offset: %u, hdr_ptr: %p, hdr_len: %u, pld_ptr: %p, pld_len: %u\n",
|
||||
i, layer, layer_type_to_str(layer->type), layer->hdr_offset,
|
||||
layer->hdr_ptr, layer->hdr_len, layer->pld_ptr, layer->pld_len);
|
||||
switch (layer->type)
|
||||
{
|
||||
case LAYER_TYPE_ETHER:
|
||||
break;
|
||||
case LAYER_TYPE_PPP:
|
||||
break;
|
||||
case LAYER_TYPE_HDLC:
|
||||
break;
|
||||
case LAYER_TYPE_L2TP:
|
||||
break;
|
||||
case LAYER_TYPE_VLAN:
|
||||
break;
|
||||
case LAYER_TYPE_PPPOE:
|
||||
break;
|
||||
case LAYER_TYPE_MPLS:
|
||||
break;
|
||||
case LAYER_TYPE_IPV4:
|
||||
used = ipv4_hdr_to_str((const struct ip *)layer->hdr_ptr, buffer, sizeof(buffer));
|
||||
break;
|
||||
case LAYER_TYPE_IPV6:
|
||||
used = ipv6_hdr_to_str((const struct ip6_hdr *)layer->hdr_ptr, buffer, sizeof(buffer));
|
||||
break;
|
||||
case LAYER_TYPE_GRE:
|
||||
break;
|
||||
case LAYER_TYPE_UDP:
|
||||
used = udp_hdr_to_str((const struct udphdr *)layer->hdr_ptr, buffer, sizeof(buffer));
|
||||
break;
|
||||
case LAYER_TYPE_TCP:
|
||||
used = tcp_hdr_to_str((const struct tcphdr *)layer->hdr_ptr, buffer, sizeof(buffer));
|
||||
break;
|
||||
case LAYER_TYPE_ICMP:
|
||||
break;
|
||||
case LAYER_TYPE_ICMP6:
|
||||
break;
|
||||
case LAYER_TYPE_VXLAN:
|
||||
break;
|
||||
case LAYER_TYPE_GTPV1_U:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (used)
|
||||
{
|
||||
printf(" %s\n", buffer);
|
||||
}
|
||||
}
|
||||
for (uint16_t i = 0; i < pkt->data_len; i++)
|
||||
{
|
||||
printf("0x%02x, ", (uint8_t)pkt->data_ptr[i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
void packet_print_table(const struct packet *pkt)
|
||||
|
||||
@@ -6,6 +6,7 @@ extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <arpa/inet.h>
|
||||
#define __FAVOR_BSD 1
|
||||
@@ -261,6 +262,23 @@ static inline void tcp_hdr_set_opt_data(struct tcphdr *hdr, const char *ptr)
|
||||
memcpy((char *)hdr + sizeof(struct tcphdr), ptr, tcp_hdr_get_opt_len(hdr));
|
||||
}
|
||||
|
||||
static inline int tcp_hdr_to_str(const struct tcphdr *hdr, char *buf, size_t size)
|
||||
{
|
||||
memset(buf, 0, size);
|
||||
return snprintf(buf, size, "TCP: src_port=%u dst_port=%u seq=%u ack=%u hdr_len=%u flags=0x%02x(%s%s%s%s%s%s) window=%u checksum=%u urg_ptr=%u opt_len=%u",
|
||||
tcp_hdr_get_src_port(hdr), tcp_hdr_get_dst_port(hdr),
|
||||
tcp_hdr_get_seq(hdr), tcp_hdr_get_ack(hdr),
|
||||
tcp_hdr_get_hdr_len(hdr), tcp_hdr_get_flags(hdr),
|
||||
tcp_hdr_get_urg_flag(hdr) ? "URG " : "",
|
||||
tcp_hdr_get_ack_flag(hdr) ? "ACK " : "",
|
||||
tcp_hdr_get_push_flag(hdr) ? "PSH " : "",
|
||||
tcp_hdr_get_rst_flag(hdr) ? "RST " : "",
|
||||
tcp_hdr_get_syn_flag(hdr) ? "SYN " : "",
|
||||
tcp_hdr_get_fin_flag(hdr) ? "FIN " : "",
|
||||
tcp_hdr_get_window(hdr), tcp_hdr_get_checksum(hdr),
|
||||
tcp_hdr_get_urg_ptr(hdr), tcp_hdr_get_opt_len(hdr));
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -6,6 +6,7 @@ extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <arpa/inet.h>
|
||||
#define __FAVOR_BSD 1
|
||||
#include <netinet/udp.h>
|
||||
@@ -72,6 +73,14 @@ static inline void udp_hdr_set_checksum(struct udphdr *hdr, uint16_t sum)
|
||||
hdr->uh_sum = htons(sum);
|
||||
}
|
||||
|
||||
static inline int udp_hdr_to_str(const struct udphdr *hdr, char *buf, size_t size)
|
||||
{
|
||||
memset(buf, 0, size);
|
||||
return snprintf(buf, size, "UDP: src_port=%u dst_port=%u total_len=%u checksum=%u",
|
||||
udp_hdr_get_src_port(hdr), udp_hdr_get_dst_port(hdr),
|
||||
udp_hdr_get_total_len(hdr), udp_hdr_get_checksum(hdr));
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user