--- zzzz-none-000/linux-4.4.60/net/ipv4/ip_input.c 2017-04-08 07:53:53.000000000 +0000 +++ hawkeye-5590-729/linux-4.4.60/net/ipv4/ip_input.c 2022-03-30 14:21:53.000000000 +0000 @@ -148,6 +148,8 @@ #include #include +#include + /* * Process Router Attention IP option (RFC 2113) */ @@ -465,3 +467,34 @@ out: return NET_RX_DROP; } + +static void ip_avm_pa_transmit(void *arg, struct sk_buff *skb) +{ + /* We can safely pass NULL as sk parameter, it is just required + * to be a valid netfilter hook. The initiator, ip_local_deliver() + * passes a NULL sock because it doesn't even know the socket yet. + */ + ip_local_deliver_finish((struct net *) arg, NULL, skb); +} + +static void __init ip_avm_pa_register(void) +{ + struct avm_pa_dev_info *ip_dev = AVM_PA_NET_IP_DEVINFO(&init_net); + struct avm_pa_pid_cfg cfg = {0}; + + if (!ip_dev) + return; + + strlcpy(cfg.name, "ipv4", sizeof(cfg.name)); + cfg.framing = avm_pa_framing_ipdev; + cfg.default_mtu = 0xffff; + cfg.tx_func = ip_avm_pa_transmit; + cfg.tx_arg = &init_net; + if (avm_pa_dev_pid_register(ip_dev, &cfg) < 0) + pr_err("failed to register avm_pa pid %s\n", cfg.name); +} + +void __init ip_input_init(void) +{ + ip_avm_pa_register(); +}