the incoming/outgoing packets on that pure ip interface do not have an ethernet header. So adding ARPHRD_PUREIP to the dev_is_mac_header_xmit() make the function return false, and __bpf_redirect() checks this boolean to determine whether to prefix an ethernet header. Signed-off-by: Rocco Yue <rocco.yue@xxxxxxxxxxxx> --- include/linux/if_arp.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/linux/if_arp.h b/include/linux/if_arp.h index bf5c5f32c65e..0dc7af11c463 100644 --- a/include/linux/if_arp.h +++ b/include/linux/if_arp.h @@ -51,6 +51,7 @@ static inline bool dev_is_mac_header_xmit(const struct net_device *dev) case ARPHRD_VOID: case ARPHRD_NONE: case ARPHRD_RAWIP: + case ARPHRD_PUREIP: return false; default: return true; -- 2.18.0