break;
        case bpf_ctx_range_ptr(struct __sk_buff, flow_keys):
                return false;
+       case bpf_ctx_range(struct __sk_buff, hwtstamp):
+               if (type == BPF_WRITE || size != sizeof(__u64))
+                       return false;
+               break;
        case bpf_ctx_range(struct __sk_buff, tstamp):
                if (size != sizeof(__u64))
                        return false;
                        return false;
                info->reg_type = PTR_TO_SOCK_COMMON_OR_NULL;
                break;
+       case offsetofend(struct __sk_buff, gso_size) ... offsetof(struct __sk_buff, hwtstamp) - 1:
+               /* Explicitly prohibit access to padding in __sk_buff. */
+               return false;
        default:
                /* Only narrow read access allowed for now. */
                if (type == BPF_WRITE) {
        case bpf_ctx_range_till(struct __sk_buff, family, local_port):
        case bpf_ctx_range(struct __sk_buff, tstamp):
        case bpf_ctx_range(struct __sk_buff, wire_len):
+       case bpf_ctx_range(struct __sk_buff, hwtstamp):
                return false;
        }
 
        case bpf_ctx_range(struct __sk_buff, data_meta):
        case bpf_ctx_range(struct __sk_buff, tstamp):
        case bpf_ctx_range(struct __sk_buff, wire_len):
+       case bpf_ctx_range(struct __sk_buff, hwtstamp):
                return false;
        }
 
        case bpf_ctx_range(struct __sk_buff, data_meta):
        case bpf_ctx_range(struct __sk_buff, tstamp):
        case bpf_ctx_range(struct __sk_buff, wire_len):
+       case bpf_ctx_range(struct __sk_buff, hwtstamp):
                return false;
        }
 
                                      si->dst_reg, si->src_reg,
                                      offsetof(struct sk_buff, sk));
                break;
+       case offsetof(struct __sk_buff, hwtstamp):
+               BUILD_BUG_ON(sizeof_field(struct skb_shared_hwtstamps, hwtstamp) != 8);
+               BUILD_BUG_ON(offsetof(struct skb_shared_hwtstamps, hwtstamp) != 0);
+
+               insn = bpf_convert_shinfo_access(si, insn);
+               *insn++ = BPF_LDX_MEM(BPF_DW,
+                                     si->dst_reg, si->dst_reg,
+                                     bpf_target_off(struct skb_shared_info,
+                                                    hwtstamps, 8,
+                                                    target_size));
+               break;
        }
 
        return insn - insn_buf;