static int dev_configuration(struct net_device *dev) { struct net_addr dst; struct service_id default_service; int ret; memset(&default_service, 0, sizeof(default_service)); if (ifname && strcmp(dev->name, ifname) != 0) return 0; if (dev->flags & IFF_POINTOPOINT) ret = dev_get_ipv4_addr(dev, IFADDR_ADDRESS, &dst); else ret = dev_get_ipv4_addr(dev, IFADDR_BROADCAST, &dst); if (ret == 1) { #if defined(ENABLE_DEBUG) { char buf[16]; LOG_DBG("dev %s bc=%s\n", dev->name, inet_ntop(AF_INET, &dst, buf, 16)); } #endif service_add(&default_service, 0, SERVICE_RULE_FORWARD, 0, BROADCAST_SERVICE_DEFAULT_PRIORITY, BROADCAST_SERVICE_DEFAULT_WEIGHT, &dst, sizeof(dst), make_dev_target(dev), GFP_ATOMIC); } return ret; }
int serval_ipv4_build_and_send_pkt(struct sk_buff *skb, struct sock *sk, u32 saddr, u32 daddr, struct ip_options *opt) { int err = 0; #if defined(OS_LINUX_KERNEL) /* We need to initialize the IP control block since SAL might have dirtied it. */ memset(IPCB(skb), 0, sizeof(struct inet_skb_parm)); #endif if (saddr == 0) { if (!skb->dev) { LOG_ERR("no device set\n"); FREE_SKB(skb); return -ENODEV; } dev_get_ipv4_addr(skb->dev, IFADDR_LOCAL, &saddr); } err = serval_ipv4_fill_in_hdr(sk, skb, saddr, daddr); if (err < 0) { LOG_ERR("hdr failed\n"); FREE_SKB(skb); return err; } /* Transmit */ err = serval_ip_local_out(skb); if (err < 0) { LOG_ERR("xmit failed\n"); } return err; }