[lttng-dev] [PATCH lttng-modules] Add UDP and ICMP packet header information to the tracepoint:
* UDP transport header * ICMP transport header (Correct indentation for switch/case) Signed-off-by: Florian Walbroel --- instrumentation/events/lttng-module/net.h | 165 -- 1 file changed, 152 insertions(+), 13 deletions(-) diff --git a/instrumentation/events/lttng-module/net.h b/instrumentation/events/lttng-module/net.h index bfa14fc..f28e9ed 100644 --- a/instrumentation/events/lttng-module/net.h +++ b/instrumentation/events/lttng-module/net.h @@ -11,6 +11,8 @@ #include #include #include +#include +#include #include #include #include @@ -85,6 +87,53 @@ static struct lttng_event_field tcpfields[] = { }, }; +static struct lttng_event_field udpfields[] = { + [0] = { + .name = "source_port", + .type = __type_integer(uint16_t, 0, 0, 0, + __BIG_ENDIAN, 10, none), + }, + [1] = { + .name = "dest_port", + .type = __type_integer(uint16_t, 0, 0, 0, + __BIG_ENDIAN, 10, none), + }, + [2] = { + .name = "len", + .type = __type_integer(uint16_t, 0, 0, 0, + __BIG_ENDIAN, 10, none), + }, + [3] = { + .name = "check", + .type = __type_integer(uint16_t, 0, 0, 0, + __BIG_ENDIAN, 10, none), + }, +}; + +static struct lttng_event_field icmpfields[] = { + [0] = { + .name = "type", + .type = __type_integer(uint8_t, 0, 0, 0, + __BIG_ENDIAN, 10, none), + }, + [1] = { + .name = "code", + .type = __type_integer(uint8_t, 0, 0, 0, + __BIG_ENDIAN, 10, none), + }, + [2] = { + .name = "checksum", + .type = __type_integer(uint16_t, 0, 0, 0, + __BIG_ENDIAN, 10, none), + }, + [3] = { + .name = "gateway", + .type = __type_integer(uint32_t, 0, 0, 0, + __BIG_ENDIAN, 10, none), + }, +}; + + static struct lttng_event_field transport_fields[] = { [0] = { .name = "unknown", @@ -102,13 +151,57 @@ static struct lttng_event_field transport_fields[] = { .u._struct.fields = tcpfields, }, }, + [2] = { + .name = "udp", + .type = { + .atype = atype_struct, + .u._struct.nr_fields = ARRAY_SIZE(udpfields), + .u._struct.fields = udpfields, + }, + }, + [3] = { + .name = "icmp", + .type = { + .atype = atype_struct, + .u._struct.nr_fields = ARRAY_SIZE(icmpfields), + .u._struct.fields = icmpfields, + }, + }, }; enum transport_header_types { TH_NONE = 0, TH_TCP = 1, + TH_UDP = 2, + TH_ICMP = 3, }; +static inline enum transport_header_types __get_transport_header_type_ip(struct sk_buff *skb) +{ + switch(ip_hdr(skb)->protocol) { + case IPPROTO_TCP: + return TH_TCP; + case IPPROTO_UDP: + return TH_UDP; + case IPPROTO_ICMP: + return TH_ICMP; + } + return TH_NONE; +} + +static inline enum transport_header_types __get_transport_header_type_ipv6(struct sk_buff *skb) +{ + switch(ipv6_hdr(skb)->nexthdr) { + case IPPROTO_TCP: + return TH_TCP; + case IPPROTO_UDP: + return TH_UDP; + case IPPROTO_ICMP: + return TH_ICMP; + } + return TH_NONE; +} + static inline enum transport_header_types __get_transport_header_type(struct sk_buff *skb) { if (__has_network_hdr(skb)) { @@ -123,13 +216,12 @@ static inline enum transport_header_types __get_transport_header_type(struct sk_ * header's data. This method works both for * sent and received packets. */ - if ((skb->protocol == htons(ETH_P_IP) && - ip_hdr(skb)->protocol == IPPROTO_TCP) || - (skb->protocol == htons(ETH_P_IPV6) && - ipv6_hdr(skb)->nexthdr == IPPROTO_TCP)) - return TH_TCP; + if (skb->protocol == htons(ETH_P_IP)) + return __get_transport_header_type_ip(skb); + else if(skb->protocol == htons(ETH_P_IPV6)) + return __get_transport_header_type_ipv6(skb); } - /* Fallthroug
Re: [lttng-dev] [PATCH lttng-modules] Add UDP and ICMP packet header information to the tracepoint:
- On Nov 13, 2019, at 4:08 AM, Florian Walbroel walbr...@silexica.com wrote: > * UDP transport header > * ICMP transport header > > (Correct indentation for switch/case) You appear to have missed the switch/case in __get_transport_header_type_ip() and __get_transport_header_type_ipv6(). Thanks, Mathieu > > Signed-off-by: Florian Walbroel > --- > instrumentation/events/lttng-module/net.h | 165 -- > 1 file changed, 152 insertions(+), 13 deletions(-) > > diff --git a/instrumentation/events/lttng-module/net.h > b/instrumentation/events/lttng-module/net.h > index bfa14fc..f28e9ed 100644 > --- a/instrumentation/events/lttng-module/net.h > +++ b/instrumentation/events/lttng-module/net.h > @@ -11,6 +11,8 @@ > #include > #include > #include > +#include > +#include > #include > #include > #include > @@ -85,6 +87,53 @@ static struct lttng_event_field tcpfields[] = { > }, > }; > > +static struct lttng_event_field udpfields[] = { > + [0] = { > + .name = "source_port", > + .type = __type_integer(uint16_t, 0, 0, 0, > + __BIG_ENDIAN, 10, none), > + }, > + [1] = { > + .name = "dest_port", > + .type = __type_integer(uint16_t, 0, 0, 0, > + __BIG_ENDIAN, 10, none), > + }, > + [2] = { > + .name = "len", > + .type = __type_integer(uint16_t, 0, 0, 0, > + __BIG_ENDIAN, 10, none), > + }, > + [3] = { > + .name = "check", > + .type = __type_integer(uint16_t, 0, 0, 0, > + __BIG_ENDIAN, 10, none), > + }, > +}; > + > +static struct lttng_event_field icmpfields[] = { > + [0] = { > + .name = "type", > + .type = __type_integer(uint8_t, 0, 0, 0, > + __BIG_ENDIAN, 10, none), > + }, > + [1] = { > + .name = "code", > + .type = __type_integer(uint8_t, 0, 0, 0, > + __BIG_ENDIAN, 10, none), > + }, > + [2] = { > + .name = "checksum", > + .type = __type_integer(uint16_t, 0, 0, 0, > + __BIG_ENDIAN, 10, none), > + }, > + [3] = { > + .name = "gateway", > + .type = __type_integer(uint32_t, 0, 0, 0, > + __BIG_ENDIAN, 10, none), > + }, > +}; > + > + > static struct lttng_event_field transport_fields[] = { > [0] = { > .name = "unknown", > @@ -102,13 +151,57 @@ static struct lttng_event_field transport_fields[] = { > .u._struct.fields = tcpfields, > }, > }, > + [2] = { > + .name = "udp", > + .type = { > + .atype = atype_struct, > + .u._struct.nr_fields = ARRAY_SIZE(udpfields), > + .u._struct.fields = udpfields, > + }, > + }, > + [3] = { > + .name = "icmp", > + .type = { > + .atype = atype_struct, > + .u._struct.nr_fields = ARRAY_SIZE(icmpfields), > + .u._struct.fields = icmpfields, > + }, > + }, > }; > > enum transport_header_types { > TH_NONE = 0, > TH_TCP = 1, > + TH_UDP = 2, > + TH_ICMP = 3, > }; > > +static inline enum transport_header_types > __get_transport_header_type_ip(struct > sk_buff *skb) > +{ > + switch(ip_hdr(skb)->protocol) { > + case IPPROTO_TCP: > + return TH_TCP; > + case IPPROTO_UDP: > + return TH_UDP; > + case IPPROTO_ICMP: > + return TH_ICMP; > + } > + return TH_NONE; > +} > + > +static inline enum transport_header_types > __get_transport_header_type_ipv6(struct sk_buff *skb) > +{ > + switch(ipv6_hdr(skb)->nexthdr) { > + case IPPROTO_TCP: > + return TH_TCP; > + case IPPROTO_UDP: > + return TH_UDP; > + case IPPROTO_ICMP: > + return TH_ICMP; > + } > + return TH_NONE; > +} > + > static inline enum transport_header_types __get_transport_header_type(struct > sk_buff *skb) > { > if (__has_network_hdr(skb)) { > @@ -123,13 +216,12 @@ static inline enum transport_header_types > __get_transport_header_type(struct sk_ >* header's data. This method works both for >* sent and received packets. >*/ > - if ((skb->protocol == htons(ETH_P_IP) && > - ip_hdr(skb)->protocol == IPPROTO_TCP) || > - (skb->protocol == htons(ETH_P_IPV6) && > - ipv6_hdr(skb)->nexthdr == IPPROTO_TCP)) > - return TH_TCP; > +
[lttng-dev] [PATCH lttng-modules] Add UDP and ICMP packet header information to the tracepoint:
* UDP transport header * ICMP transport header (Correct indentation for switch/case) Signed-off-by: Florian Walbroel --- instrumentation/events/lttng-module/net.h | 166 -- 1 file changed, 153 insertions(+), 13 deletions(-) diff --git a/instrumentation/events/lttng-module/net.h b/instrumentation/events/lttng-module/net.h index bfa14fc..ad1892a 100644 --- a/instrumentation/events/lttng-module/net.h +++ b/instrumentation/events/lttng-module/net.h @@ -11,6 +11,8 @@ #include #include #include +#include +#include #include #include #include @@ -85,6 +87,53 @@ static struct lttng_event_field tcpfields[] = { }, }; +static struct lttng_event_field udpfields[] = { + [0] = { + .name = "source_port", + .type = __type_integer(uint16_t, 0, 0, 0, + __BIG_ENDIAN, 10, none), + }, + [1] = { + .name = "dest_port", + .type = __type_integer(uint16_t, 0, 0, 0, + __BIG_ENDIAN, 10, none), + }, + [2] = { + .name = "len", + .type = __type_integer(uint16_t, 0, 0, 0, + __BIG_ENDIAN, 10, none), + }, + [3] = { + .name = "check", + .type = __type_integer(uint16_t, 0, 0, 0, + __BIG_ENDIAN, 10, none), + }, +}; + +static struct lttng_event_field icmpfields[] = { + [0] = { + .name = "type", + .type = __type_integer(uint8_t, 0, 0, 0, + __BIG_ENDIAN, 10, none), + }, + [1] = { + .name = "code", + .type = __type_integer(uint8_t, 0, 0, 0, + __BIG_ENDIAN, 10, none), + }, + [2] = { + .name = "checksum", + .type = __type_integer(uint16_t, 0, 0, 0, + __BIG_ENDIAN, 10, none), + }, + [3] = { + .name = "gateway", + .type = __type_integer(uint32_t, 0, 0, 0, + __BIG_ENDIAN, 10, none), + }, +}; + + static struct lttng_event_field transport_fields[] = { [0] = { .name = "unknown", @@ -102,13 +151,57 @@ static struct lttng_event_field transport_fields[] = { .u._struct.fields = tcpfields, }, }, + [2] = { + .name = "udp", + .type = { + .atype = atype_struct, + .u._struct.nr_fields = ARRAY_SIZE(udpfields), + .u._struct.fields = udpfields, + }, + }, + [3] = { + .name = "icmp", + .type = { + .atype = atype_struct, + .u._struct.nr_fields = ARRAY_SIZE(icmpfields), + .u._struct.fields = icmpfields, + }, + }, }; enum transport_header_types { TH_NONE = 0, TH_TCP = 1, + TH_UDP = 2, + TH_ICMP = 3, }; +static inline enum transport_header_types __get_transport_header_type_ip(struct sk_buff *skb) +{ + switch(ip_hdr(skb)->protocol) { + case IPPROTO_TCP: + return TH_TCP; + case IPPROTO_UDP: + return TH_UDP; + case IPPROTO_ICMP: + return TH_ICMP; + } + return TH_NONE; +} + +static inline enum transport_header_types __get_transport_header_type_ipv6(struct sk_buff *skb) +{ + switch(ipv6_hdr(skb)->nexthdr) { + case IPPROTO_TCP: + return TH_TCP; + case IPPROTO_UDP: + return TH_UDP; + case IPPROTO_ICMP: + return TH_ICMP; + } + return TH_NONE; +} + static inline enum transport_header_types __get_transport_header_type(struct sk_buff *skb) { if (__has_network_hdr(skb)) { @@ -123,13 +216,13 @@ static inline enum transport_header_types __get_transport_header_type(struct sk_ * header's data. This method works both for * sent and received packets. */ - if ((skb->protocol == htons(ETH_P_IP) && - ip_hdr(skb)->protocol == IPPROTO_TCP) || - (skb->protocol == htons(ETH_P_IPV6) && - ipv6_hdr(skb)->nexthdr == IPPROTO_TCP)) - return TH_TCP; + if (skb->protocol == htons(ETH_P_IP)) { + return __get_transport_header_type_ip(skb); + } else if(skb->protocol == htons(ETH_P_IPV6)) { + return __get_transport_header_type_ipv6(skb); + } } - /* Fallthrough for other cases where header is not TCP. */ + /*