On Wed, May 6, 2020 at 9:26 AM <[email protected]> wrote:
>
> Hello - I am looking to trace ip_forward_finish. The intent is to trace 
> latency of all TCP connections going through a linux based gateway router.  
> Hence thought of tracing ip_forward_finish kernel function. And capture the 
> time-stamp of SYN, SYN-ACK and ACK messages at the router.
>
> The issue is accessing iphdr inside the trace function crashes with the below 
> error:
>
> bpf: Failed to load program: Permission denied
> 0: (79) r6 = *(u64 *)(r1 +96)
> 1: (b7) r1 = 0
> 2: (6b) *(u16 *)(r10 -24) = r1
> 3: (bf) r3 = r6
> 4: (07) r3 += 192
> 5: (bf) r1 = r10
> 6: (07) r1 += -24
> 7: (b7) r2 = 2
> 8: (85) call bpf_probe_read#4
> 9: (69) r1 = *(u16 *)(r10 -24)
> 10: (55) if r1 != 0x8 goto pc+7
>  R0=inv(id=0) R1=inv8 R6=inv(id=0) R10=fp0
> 11: (69) r1 = *(u16 *)(r6 +196)
> R6 invalid mem access 'inv'

You did not show the code which actually caused the problem.

>     bpf_probe_read(&ip_Hdr, sizeof(ip_Hdr), (void*)ip_hdr(skb));
>
>     if ( (ip_Hdr.protocol != IPPROTO_TCP))
>          return 0;
>
>     return 0;
> }

There must be code after "if ( (ip_Hdr.protocol != IPPROTO_TCP)) return 0;" .
You may need bpf_probe_read() for memory accesses there.

>
> HINT: The invalid mem access 'inv' error can happen if you try to dereference 
> memory without first using bpf_probe_read() to copy it to the BPF stack. 
> Sometimes the bpf_probe_read is automatic by the bcc rewriter, other times 
> you'll need to be explicit.
>
> The code fragment I originally had was as below and the crash occurs when an 
> access to ip_Hdr->protocol is made. And I also checked that ip_Hdr is not 
> null.
>
> int trace_forward_finish(struct pt_regs *ctx,struct net *net, struct sock 
> *sk, struct sk_buff *skb)
> {
>
>     if (skb->protocol != htons(ETH_P_IP)) return 0;
>
>     struct iphdr* ip_Hdr = (struct iphdr *) skb_network_header(skb);
>
>     if (ip_Hdr->protocol != IPPROTO_TCP)
>          return 0;
>
>
>     /// Other code
>
>   }
>
> Per the HINT in the message, I did try to change to bpf_probe_read but still 
> the same outcome
>
> int trace_forward_finish(struct pt_regs *ctx,struct net *net, struct sock 
> *sk, struct sk_buff *skb)
> {
>     if (skb->protocol != htons(ETH_P_IP)) return 0;
>
>     struct iphdr ip_Hdr;
>     bpf_probe_read(&ip_Hdr, sizeof(ip_Hdr), (void*)ip_hdr(skb));
>
>     if ( (ip_Hdr.protocol != IPPROTO_TCP))
>          return 0;
>
>     return 0;
> }
>
> Any help would be appreciated.
> 

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.

View/Reply Online (#1843): https://lists.iovisor.org/g/iovisor-dev/message/1843
Mute This Topic: https://lists.iovisor.org/mt/74032161/21656
Mute #bcc: https://lists.iovisor.org/mk?hashtag=bcc&subid=2590197
Group Owner: [email protected]
Unsubscribe: https://lists.iovisor.org/g/iovisor-dev/unsub  
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to