@ -39,11 +39,13 @@
# include "util-unittest.h"
# include "util-debug.h"
# include "tmqh-packetpool.h"
/**
* \ brief Function to decode GRE packets
*/
void DecodeGRE ( ThreadVars * tv , DecodeThreadVars * dtv , Packet * p , uint8_t * pkt , uint16_t len , PacketQueue * pq )
int DecodeGRE ( ThreadVars * tv , DecodeThreadVars * dtv , Packet * p , uint8_t * pkt , uint16_t len , PacketQueue * pq )
{
uint16_t header_len = GRE_HDR_LEN ;
GRESreHdr * gsre = NULL ;
@ -52,12 +54,12 @@ void DecodeGRE(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, u
if ( len < GRE_HDR_LEN ) {
ENGINE_SET_EVENT ( p , GRE_PKT_TOO_SMALL ) ;
return ;
return TM_ECODE_FAILED ;
}
p - > greh = ( GREHdr * ) pkt ;
if ( p - > greh = = NULL )
return ;
return TM_ECODE_FAILED ;
SCLogDebug ( " p %p pkt %p GRE protocol %04x Len: %d GRE version %x " ,
p , pkt , GRE_GET_PROTO ( p - > greh ) , len , GRE_GET_VERSION ( p - > greh ) ) ;
@ -77,12 +79,12 @@ void DecodeGRE(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, u
if ( GRE_FLAG_ISSET_RECUR ( p - > greh ) ) {
ENGINE_SET_EVENT ( p , GRE_VERSION0_RECUR ) ;
return ;
return TM_ECODE_OK ;
}
if ( GREV1_FLAG_ISSET_FLAGS ( p - > greh ) ) {
ENGINE_SET_EVENT ( p , GRE_VERSION0_FLAGS ) ;
return ;
return TM_ECODE_OK ;
}
/* Adjust header length based on content */
@ -98,7 +100,7 @@ void DecodeGRE(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, u
if ( header_len > len ) {
ENGINE_SET_EVENT ( p , GRE_VERSION0_HDR_TOO_BIG ) ;
return ;
return TM_ECODE_OK ;
}
if ( GRE_FLAG_ISSET_ROUTE ( p - > greh ) )
@ -107,7 +109,7 @@ void DecodeGRE(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, u
{
if ( ( header_len + GRE_SRE_HDR_LEN ) > len ) {
ENGINE_SET_EVENT ( p , GRE_VERSION0_MALFORMED_SRE_HDR ) ;
return ;
return TM_ECODE_OK ;
}
gsre = ( GRESreHdr * ) ( pkt + header_len ) ;
@ -120,7 +122,7 @@ void DecodeGRE(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, u
header_len + = gsre - > sre_length ;
if ( header_len > len ) {
ENGINE_SET_EVENT ( p , GRE_VERSION0_MALFORMED_SRE_HDR ) ;
return ;
return TM_ECODE_OK ;
}
}
}
@ -139,37 +141,37 @@ void DecodeGRE(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, u
if ( GRE_FLAG_ISSET_CHKSUM ( p - > greh ) ) {
ENGINE_SET_EVENT ( p , GRE_VERSION1_CHKSUM ) ;
return ;
return TM_ECODE_OK ;
}
if ( GRE_FLAG_ISSET_ROUTE ( p - > greh ) ) {
ENGINE_SET_EVENT ( p , GRE_VERSION1_ROUTE ) ;
return ;
return TM_ECODE_OK ;
}
if ( GRE_FLAG_ISSET_SSR ( p - > greh ) ) {
ENGINE_SET_EVENT ( p , GRE_VERSION1_SSR ) ;
return ;
return TM_ECODE_OK ;
}
if ( GRE_FLAG_ISSET_RECUR ( p - > greh ) ) {
ENGINE_SET_EVENT ( p , GRE_VERSION1_RECUR ) ;
return ;
return TM_ECODE_OK ;
}
if ( GREV1_FLAG_ISSET_FLAGS ( p - > greh ) ) {
ENGINE_SET_EVENT ( p , GRE_VERSION1_FLAGS ) ;
return ;
return TM_ECODE_OK ;
}
if ( GRE_GET_PROTO ( p - > greh ) ! = GRE_PROTO_PPP ) {
ENGINE_SET_EVENT ( p , GRE_VERSION1_WRONG_PROTOCOL ) ;
return ;
return TM_ECODE_OK ;
}
if ( ! ( GRE_FLAG_ISSET_KY ( p - > greh ) ) ) {
ENGINE_SET_EVENT ( p , GRE_VERSION1_NO_KEY ) ;
return ;
return TM_ECODE_OK ;
}
header_len + = GRE_KEY_LEN ;
@ -184,13 +186,13 @@ void DecodeGRE(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, u
if ( header_len > len ) {
ENGINE_SET_EVENT ( p , GRE_VERSION1_HDR_TOO_BIG ) ;
return ;
return TM_ECODE_OK ;
}
break ;
default :
ENGINE_SET_EVENT ( p , GRE_WRONG_VERSION ) ;
return ;
return TM_ECODE_OK ;
}
switch ( GRE_GET_PROTO ( p - > greh ) )
@ -202,9 +204,12 @@ void DecodeGRE(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, u
len - header_len , IPPROTO_IP ) ;
if ( tp ! = NULL ) {
PKT_SET_SRC ( tp , PKT_SRC_DECODER_GRE ) ;
DecodeTunnel ( tv , dtv , tp , GET_PKT_DATA ( tp ) ,
GET_PKT_LEN ( tp ) , pq , IPPROTO_IP ) ;
if ( DecodeTunnel ( tv , dtv , tp , GET_PKT_DATA ( tp ) ,
GET_PKT_LEN ( tp ) , pq , IPPROTO_IP ) = = TM_ECODE_OK ) {
PacketEnqueue ( pq , tp ) ;
} else {
TmqhOutputPacketpool ( tv , tp ) ;
}
}
}
break ;
@ -217,9 +222,12 @@ void DecodeGRE(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, u
len - header_len , PPP_OVER_GRE ) ;
if ( tp ! = NULL ) {
PKT_SET_SRC ( tp , PKT_SRC_DECODER_GRE ) ;
DecodeTunnel ( tv , dtv , tp , GET_PKT_DATA ( tp ) ,
GET_PKT_LEN ( tp ) , pq , PPP_OVER_GRE ) ;
if ( DecodeTunnel ( tv , dtv , tp , GET_PKT_DATA ( tp ) ,
GET_PKT_LEN ( tp ) , pq , PPP_OVER_GRE ) = = TM_ECODE_OK ) {
PacketEnqueue ( pq , tp ) ;
} else {
TmqhOutputPacketpool ( tv , tp ) ;
}
}
}
break ;
@ -232,9 +240,12 @@ void DecodeGRE(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, u
len - header_len , IPPROTO_IPV6 ) ;
if ( tp ! = NULL ) {
PKT_SET_SRC ( tp , PKT_SRC_DECODER_GRE ) ;
DecodeTunnel ( tv , dtv , tp , GET_PKT_DATA ( tp ) ,
GET_PKT_LEN ( tp ) , pq , IPPROTO_IPV6 ) ;
if ( DecodeTunnel ( tv , dtv , tp , GET_PKT_DATA ( tp ) ,
GET_PKT_LEN ( tp ) , pq , IPPROTO_IPV6 ) = = TM_ECODE_OK ) {
PacketEnqueue ( pq , tp ) ;
} else {
TmqhOutputPacketpool ( tv , tp ) ;
}
}
}
break ;
@ -247,18 +258,21 @@ void DecodeGRE(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, u
len - header_len , VLAN_OVER_GRE ) ;
if ( tp ! = NULL ) {
PKT_SET_SRC ( tp , PKT_SRC_DECODER_GRE ) ;
DecodeTunnel ( tv , dtv , tp , GET_PKT_DATA ( tp ) ,
GET_PKT_LEN ( tp ) , pq , VLAN_OVER_GRE ) ;
if ( DecodeTunnel ( tv , dtv , tp , GET_PKT_DATA ( tp ) ,
GET_PKT_LEN ( tp ) , pq , VLAN_OVER_GRE ) = = TM_ECODE_OK ) {
PacketEnqueue ( pq , tp ) ;
} else {
TmqhOutputPacketpool ( tv , tp ) ;
}
}
}
break ;
}
default :
return ;
return TM_ECODE_OK ;
}
return TM_ECODE_OK ;
}