static unsigned int hwaddr_in_hook_fn(struct nf_hook_ops const *ops, #endif struct sk_buff *skb, struct net_device const *in, struct net_device const *out, int (*okfn)(struct sk_buff *)) { struct net_device *target = NULL; struct ethhdr *lhdr = NULL; struct iphdr *nhdr = NULL; if (!in) return NF_ACCEPT; if (in->type != ARPHRD_ETHER && in->type != ARPHRD_IEEE802) return NF_ACCEPT; if (skb->mac_len != ETH_HLEN) return NF_ACCEPT; lhdr = eth_hdr(skb); nhdr = ip_hdr(skb); target = __ip_dev_find(dev_net(in), nhdr->daddr, false); if (target == in) hwaddr_update(in, nhdr->saddr, nhdr->daddr, lhdr->h_source, ETH_ALEN); return NF_ACCEPT; }
static unsigned int hwaddr_input_hook( #if LINUX_VERSION_CODE < KERNEL_VERSION(3,13,0) unsigned unused, #else struct nf_hook_ops const *unused, #endif struct sk_buff *skb, struct net_device const *in, struct net_device const *out, int (*okfn)(struct sk_buff *)) { struct net_device *target = NULL; struct ethhdr *llhdr = NULL; struct iphdr *nhdr = NULL; if (!in) return NF_ACCEPT; if (in->type != ARPHRD_ETHER && in->type != ARPHRD_IEEE802) return NF_ACCEPT; llhdr = eth_hdr(skb); nhdr = ip_hdr(skb); target = __ip_dev_find(dev_net(in), nhdr->daddr, false); if (target == in) hwaddr_update(target, nhdr->saddr, nhdr->daddr, llhdr->h_source, ETH_ALEN); return NF_ACCEPT; }
/** * tipc_udp_enable - callback to create a new udp bearer instance * @net: network namespace * @b: pointer to generic tipc_bearer * @attrs: netlink bearer configuration * * validate the bearer parameters and initialize the udp bearer * rtnl_lock should be held */ static int tipc_udp_enable(struct net *net, struct tipc_bearer *b, struct nlattr *attrs[]) { int err = -EINVAL; struct udp_bearer *ub; struct udp_media_addr *remote; struct udp_media_addr local = {0}; struct udp_port_cfg udp_conf = {0}; struct udp_tunnel_sock_cfg tuncfg = {NULL}; ub = kzalloc(sizeof(*ub), GFP_ATOMIC); if (!ub) return -ENOMEM; remote = (struct udp_media_addr *)&b->bcast_addr.value; memset(remote, 0, sizeof(struct udp_media_addr)); err = parse_options(attrs, ub, &local, remote); if (err) goto err; b->bcast_addr.media_id = TIPC_MEDIA_TYPE_UDP; b->bcast_addr.broadcast = 1; rcu_assign_pointer(b->media_ptr, ub); rcu_assign_pointer(ub->bearer, b); tipc_udp_media_addr_set(&b->addr, &local); if (local.proto == htons(ETH_P_IP)) { struct net_device *dev; dev = __ip_dev_find(net, local.ipv4.s_addr, false); if (!dev) { err = -ENODEV; goto err; } udp_conf.family = AF_INET; udp_conf.local_ip.s_addr = htonl(INADDR_ANY); udp_conf.use_udp_checksums = false; ub->ifindex = dev->ifindex; b->mtu = dev->mtu - sizeof(struct iphdr) - sizeof(struct udphdr); #if IS_ENABLED(CONFIG_IPV6) } else if (local.proto == htons(ETH_P_IPV6)) { udp_conf.family = AF_INET6; udp_conf.use_udp6_tx_checksums = true; udp_conf.use_udp6_rx_checksums = true; udp_conf.local_ip6 = in6addr_any; b->mtu = 1280; #endif } else { err = -EAFNOSUPPORT; goto err; } udp_conf.local_udp_port = local.port; err = udp_sock_create(net, &udp_conf, &ub->ubsock); if (err) goto err; tuncfg.sk_user_data = ub; tuncfg.encap_type = 1; tuncfg.encap_rcv = tipc_udp_recv; tuncfg.encap_destroy = NULL; setup_udp_tunnel_sock(net, ub->ubsock, &tuncfg); if (enable_mcast(ub, remote)) goto err; return 0; err: kfree(ub); return err; }