switch (IPV4_GET_RAW_IPPROTO(icmp4_ip4h)) {
case IPPROTO_TCP:
if (len >= IPV4_HEADER_LEN + TCP_HEADER_LEN ) {
- p->icmpv4vars.emb_tcph = (TCPHdr*)(partial_packet + IPV4_HEADER_LEN);
- p->icmpv4vars.emb_sport = SCNtohs(p->icmpv4vars.emb_tcph->th_sport);
- p->icmpv4vars.emb_dport = SCNtohs(p->icmpv4vars.emb_tcph->th_dport);
+ TCPHdr *emb_tcph = (TCPHdr *)(partial_packet + IPV4_HEADER_LEN);
+ p->icmpv4vars.emb_sport = SCNtohs(emb_tcph->th_sport);
+ p->icmpv4vars.emb_dport = SCNtohs(emb_tcph->th_dport);
+ p->icmpv4vars.emb_ports_set = true;
p->icmpv4vars.emb_ip4_proto = IPPROTO_TCP;
SCLogDebug("DecodePartialIPV4: ICMPV4->IPV4->TCP header sport: "
p->icmpv4vars.emb_dport);
} else if (len >= IPV4_HEADER_LEN + 4) {
/* only access th_sport and th_dport */
- TCPHdr *emb_tcph = (TCPHdr*)(partial_packet + IPV4_HEADER_LEN);
-
- p->icmpv4vars.emb_tcph = NULL;
+ TCPHdr *emb_tcph = (TCPHdr *)(partial_packet + IPV4_HEADER_LEN);
p->icmpv4vars.emb_sport = SCNtohs(emb_tcph->th_sport);
p->icmpv4vars.emb_dport = SCNtohs(emb_tcph->th_dport);
+ p->icmpv4vars.emb_ports_set = true;
p->icmpv4vars.emb_ip4_proto = IPPROTO_TCP;
SCLogDebug("DecodePartialIPV4: ICMPV4->IPV4->TCP partial header sport: "
"%"PRIu16" dport %"PRIu16"", p->icmpv4vars.emb_sport,
break;
case IPPROTO_UDP:
if (len >= IPV4_HEADER_LEN + UDP_HEADER_LEN ) {
- p->icmpv4vars.emb_udph = (UDPHdr*)(partial_packet + IPV4_HEADER_LEN);
- p->icmpv4vars.emb_sport = SCNtohs(p->icmpv4vars.emb_udph->uh_sport);
- p->icmpv4vars.emb_dport = SCNtohs(p->icmpv4vars.emb_udph->uh_dport);
+ UDPHdr *emb_udph = (UDPHdr *)(partial_packet + IPV4_HEADER_LEN);
+ p->icmpv4vars.emb_sport = SCNtohs(emb_udph->uh_sport);
+ p->icmpv4vars.emb_dport = SCNtohs(emb_udph->uh_dport);
+ p->icmpv4vars.emb_ports_set = true;
p->icmpv4vars.emb_ip4_proto = IPPROTO_UDP;
SCLogDebug("DecodePartialIPV4: ICMPV4->IPV4->UDP header sport: "
break;
case IPPROTO_ICMP:
- if (len >= IPV4_HEADER_LEN + ICMPV4_HEADER_LEN ) {
- p->icmpv4vars.emb_icmpv4h = (ICMPV4Hdr*)(partial_packet + IPV4_HEADER_LEN);
+ if (len >= IPV4_HEADER_LEN + ICMPV4_HEADER_LEN) {
p->icmpv4vars.emb_sport = 0;
p->icmpv4vars.emb_dport = 0;
p->icmpv4vars.emb_ip4_proto = IPPROTO_ICMP;
/** Pointers to the embedded packet headers */
IPV4Hdr *emb_ipv4h;
- TCPHdr *emb_tcph;
- UDPHdr *emb_udph;
- ICMPV4Hdr *emb_icmpv4h;
uint8_t emb_ip4_proto;
+ bool emb_ports_set;
/** TCP/UDP ports */
uint16_t emb_sport;
uint16_t emb_dport;
/** macro for icmpv4 embedded "protocol" access */
#define ICMPV4_GET_EMB_PROTO(p) (p)->icmpv4vars.emb_ip4_proto
/** macro for icmpv4 embedded "ipv4h" header access */
-#define ICMPV4_GET_EMB_IPV4(p) (p)->icmpv4vars.emb_ipv4h
-/** macro for icmpv4 embedded "tcph" header access */
-#define ICMPV4_GET_EMB_TCP(p) (p)->icmpv4vars.emb_tcph
-/** macro for icmpv4 embedded "udph" header access */
-#define ICMPV4_GET_EMB_UDP(p) (p)->icmpv4vars.emb_udph
-/** macro for icmpv4 embedded "icmpv4h" header access */
-#define ICMPV4_GET_EMB_ICMPV4H(p) (p)->icmpv4vars.emb_icmpv4h
+#define ICMPV4_GET_EMB_IPV4(p) (p)->icmpv4vars.emb_ipv4h
/** macro for icmpv4 header length */
#define ICMPV4_GET_HLEN_ICMPV4H(p) (p)->icmpv4vars.hlen
*
* \warning use only _after_ the decoder has processed the packet
*/
-#define ICMPV4_DEST_UNREACH_IS_VALID(p) ( \
- (!((p)->flags & PKT_IS_INVALID)) && \
- ((p)->icmpv4h != NULL) && \
- (ICMPV4_GET_TYPE((p)) == ICMP_DEST_UNREACH) && \
- (ICMPV4_GET_EMB_IPV4((p)) != NULL) && \
- ((ICMPV4_GET_EMB_TCP((p)) != NULL) || \
- (ICMPV4_GET_EMB_UDP((p)) != NULL)))
+#define ICMPV4_DEST_UNREACH_IS_VALID(p) \
+ ((!((p)->flags & PKT_IS_INVALID)) && ((p)->icmpv4h != NULL) && \
+ (ICMPV4_GET_TYPE((p)) == ICMP_DEST_UNREACH) && (ICMPV4_GET_EMB_IPV4((p)) != NULL) && \
+ (p)->icmpv4vars.emb_ports_set)
/**
* marco for checking if a ICMP packet is an error message or an