From: David J. Wilder Date: Mon, 20 Jul 2009 23:08:42 +0000 (-0700) Subject: Fixes for 2.6.31. There are some changes in sk_buff structure those cause X-Git-Tag: release-0.9.9~54 X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=1c47903b03c678470cf81c3a7d5c3ad95420d569;p=systemtap.git Fixes for 2.6.31. There are some changes in sk_buff structure those cause failures of compiling ipmib.stp and tcpmib.stp, rtable and dst fields are deleted. --- diff --git a/tapset/ipmib.stp b/tapset/ipmib.stp index 3430a8a17..0eeb6913a 100644 --- a/tapset/ipmib.stp +++ b/tapset/ipmib.stp @@ -310,8 +310,7 @@ probe ipmib.InDiscards=kernel.function("ip_rcv").return * MIB: IPSTATS_MIB_OUTFORWDATAGRAMS * */ -probe ipmib.ForwDatagrams=kernel.function("ip_forward_finish"), - kernel.function("ipmr_forward_finish") +probe ipmib.ForwDatagrams=kernel.function("ip_forward_finish") { skb = $skb; op = 1; @@ -416,22 +415,70 @@ probe ipmib.FragFails=kernel.function("ip_fragment").return } function _input_route_type:long (skb:long) +{ +%( kernel_v < "2.6.31" %? + return __input_route_type_old(skb) +%: + return __input_route_type_new(skb) +%) +} + +function __input_route_type_old:long (skb:long) +%{ /* pure */ + struct rtable *rt; + struct sk_buff *skb = (struct sk_buff *)(long)THIS->skb; + rt = (struct rtable *)kread(&(skb->rtable)); + if ( rt ) + THIS->__retvalue = kread(&(rt->rt_type)); + else + THIS->__retvalue = RTN_UNSPEC; + CATCH_DEREF_FAULT(); +%} + +function __input_route_type_new:long (skb:long) %{ /* pure */ struct rtable *rt; struct sk_buff *skb = (struct sk_buff *)(long)THIS->skb; - rt = (struct rtable *)kread(&(skb->rtable)); - THIS->__retvalue = kread(&(rt->rt_type)); + rt = (struct rtable *)kread(&(skb->_skb_dst)); + if ( rt ) + THIS->__retvalue = kread(&(rt->rt_type)); + else + THIS->__retvalue = RTN_UNSPEC; CATCH_DEREF_FAULT(); %} function _output_route_type:long (skb:long) +{ +%( kernel_v < "2.6.31" %? + return __output_route_type_old(skb) +%: + return __output_route_type_new(skb) +%) +} + +function __output_route_type_old:long (skb:long) %{ /* pure */ struct rtable *rt; struct dst_entry *dst; struct sk_buff *skb = (struct sk_buff *)(long)THIS->skb; dst = (struct dst_entry *)kread(&(skb->dst)); rt = (struct rtable *)dst; - THIS->__retvalue = kread(&(rt->rt_type)); + if ( rt ) + THIS->__retvalue = kread(&(rt->rt_type)); + else + THIS->__retvalue = RTN_UNSPEC; + CATCH_DEREF_FAULT(); +%} + +function __output_route_type_new:long (skb:long) +%{ /* pure */ + struct rtable *rt; + struct sk_buff *skb = (struct sk_buff *)(long)THIS->skb; + rt = (struct rtable *)kread(&(skb->_skb_dst)); + if ( rt ) + THIS->__retvalue = kread(&(rt->rt_type)); + else + THIS->__retvalue = RTN_UNSPEC; CATCH_DEREF_FAULT(); %} diff --git a/tapset/tcpmib.stp b/tapset/tcpmib.stp index e3e769009..8b443309a 100644 --- a/tapset/tcpmib.stp +++ b/tapset/tcpmib.stp @@ -250,12 +250,36 @@ function _is_reset:long (skb:long) %} function _tcpmib_input_route_type:long (skb:long) +{ +%( kernel_v < "2.6.31" %? + return __tcpmib_input_route_type_old(skb) +%: + return __tcpmib_input_route_type_new(skb) +%) +} + +function __tcpmib_input_route_type_old:long (skb:long) %{ /* pure */ - struct rtable *rt; - struct sk_buff *skb = (struct sk_buff *)(long)THIS->skb; - rt = (struct rtable *)kread(&(skb->rtable)); - THIS->__retvalue = kread(&(rt->rt_type)); - CATCH_DEREF_FAULT(); + struct rtable *rt; + struct sk_buff *skb = (struct sk_buff *)(long)THIS->skb; + rt = (struct rtable *)kread(&(skb->rtable)); + if ( rt ) + THIS->__retvalue = kread(&(rt->rt_type)); + else + THIS->__retvalue = RTN_UNSPEC; + CATCH_DEREF_FAULT(); +%} + +function __tcpmib_input_route_type_new:long (skb:long) +%{ /* pure */ + struct rtable *rt; + struct sk_buff *skb = (struct sk_buff *)(long)THIS->skb; + rt = (struct rtable *)kread(&(skb->_skb_dst)); + if ( rt ) + THIS->__retvalue = kread(&(rt->rt_type)); + else + THIS->__retvalue = RTN_UNSPEC; + CATCH_DEREF_FAULT(); %} /*