Exemple #1
0
static int
arp_is_reply(struct sk_buff *skb)
{
    struct arphdr *arp = arp_hdr(skb);

    if (!arp)
    {
        HNAT_PRINTK("%s: Packet has no ARP data\n", __func__);
        return 0;
    }

    if (skb->len < sizeof(struct arphdr))
    {
        HNAT_PRINTK("%s: Packet is too small to be an ARP\n", __func__);
        return 0;
    }

    if (arp->ar_op != htons(ARPOP_REPLY))
    {
        return 0;
    }

    return 1;
}
static void
nat_ipt_del(struct ipt_replace ireplace)
{
    int i, j;
    struct ipt_entry *gentry = NULL;
    struct ipt_entry *sentry = NULL;
    struct xt_entry_target *gtarget = NULL;
    struct xt_entry_target *starget = NULL;
    struct nf_nat_ipv4_multi_range_compat *grange = NULL;
    struct nf_nat_ipv4_multi_range_compat *srange = NULL;
    uint8_t *gptr, *sptr;
    gptr = gbuffer;
    sptr = sbuffer;
    unsigned int oldnum = ireplace.num_counters;
    unsigned int seq = 1;

    HNAT_PRINTK("into nat_ipt_del\n");
    for (i = oldnum; i >= 0; i--)//NF_NAT_INIT_ENTRIES_NUM; i--)
    {
        gentry = (struct ipt_entry *)gptr;
        sentry = (struct ipt_entry *)sptr;
        gtarget = (struct xt_entry_target *)((uint8_t *) gentry + gentry->target_offset);
        starget = (struct xt_entry_target *)((uint8_t *) sentry + sentry->target_offset);
        grange = (struct nf_nat_ipv4_multi_range_compat *)((uint8_t *) gtarget + sizeof (*gtarget));
        srange = (struct nf_nat_ipv4_multi_range_compat *)((uint8_t *) starget + sizeof (*starget));

        HNAT_PRINTK("(%d)isis_nat_del name %s:%s#####(%x:%x %x)###\n",
                    i, gtarget->u.user.name, starget->u.user.name,
                    gentry->ip.src.s_addr, gentry->ip.dst.s_addr,
                    grange->range[0].min.all);

        if (strcmp(gtarget->u.user.name, starget->u.user.name))
        {
            /*if (!strcmp(gtarget->u.user.name, "DNAT")) {
                if (gentry->ip.src.s_addr || !gentry->ip.dst.s_addr
                    || grange->range[0].min.all)
                    return;
                goto delete;
            } else */
            if (!strcmp(gtarget->u.user.name, "SNAT"))
            {
                if (!gentry->ip.src.s_addr || gentry->ip.dst.s_addr
                        || grange->range[0].min.all)
                    return;
                goto delete;
            }
            return;
        } /*else if (!strcmp(gtarget->u.user.name, "DNAT")) {
            if (memcmp(gentry, sentry, gentry->next_offset)) {
                if (gentry->ip.src.s_addr || !gentry->ip.dst.s_addr
                    || grange->range[0].min.all)
                    return;
                goto delete;
            }
        } */else if (!strcmp(gtarget->u.user.name, "SNAT"))
        {
            if (memcmp(gentry, sentry, gentry->next_offset))
            {
                if (!gentry->ip.src.s_addr || gentry->ip.dst.s_addr
                        || grange->range[0].min.all)
                    return;
                goto delete;
            }
        }
        gptr += gentry->next_offset;
        sptr += gentry->next_offset;
        if(!strcmp(gtarget->u.user.name, "SNAT"))
        {
            seq++;
        }
    }
Exemple #3
0
static sw_error_t setup_interface_entry(char *list_if, int is_wan)
{
    char temp[IFNAMSIZ*4]; /* Max 4 interface entries right now. */
    char *dev_name, *list_all;
    struct net_device *nat_dev;
    struct in_device *in_device_lan = NULL;
    uint8_t *devmac, if_mac_addr[MAC_LEN];
    char *br_name;
    uint32_t vid = 0;
    sw_error_t setup_error;
    uint32_t ipv6 = 0;

    memcpy(temp, list_if, strlen(list_if)+1);
    list_all = temp;

    setup_error = SW_OK;
    while ((dev_name = strsep(&list_all, " ")) != NULL)
    {
        nat_dev = dev_get_by_name(&init_net, dev_name);
        if (NULL == nat_dev)
        {
            // printk("%s: Cannot get device %s by name!\n", __FUNCTION__, dev_name);
            setup_error = SW_FAIL;
            continue;
        }
#if defined (CONFIG_BRIDGE)
        if (NULL != nat_dev->br_port) /* under bridge interface. */
        {
            /* Get bridge interface name */
            br_name = (char *)nat_dev->br_port->br->dev->name;
            memcpy (nat_bridge_dev, br_name, sizeof(br_name));
            /* Get dmac */
            devmac = (uint8_t *)nat_dev->br_port->br->dev->dev_addr;
        }
        else
#endif /* CONFIG_BRIDGE */
        {
            devmac = (uint8_t *)nat_dev->dev_addr;
        }
        /* get vid */
#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
        vid = vlan_dev_vlan_id(nat_dev);
#else
        vid = 0;
#endif
#ifdef CONFIG_IPV6_HWACCEL
        ipv6 = 1;
        if (is_wan)
        {
            wan_fid = vid;
        }
#else
        ipv6 = 0;
        if (is_wan)
        {
            if (NF_S17_WAN_TYPE_PPPOEV6 == nf_athrs17_hnat_wan_type)
                ipv6 = 1;
            wan_fid = vid;
        }
#endif
#ifdef ISISC
        if (0 == is_wan) /* Not WAN -> LAN */
        { /* Setup private and netmask as soon as possible */
            in_device_lan = (struct in_device *) nat_dev->ip_ptr;
            nat_hw_prv_mask_set((a_uint32_t)(in_device_lan->ifa_list->ifa_mask));
            nat_hw_prv_base_set((a_uint32_t)(in_device_lan->ifa_list->ifa_address));
        }
#endif
        memcpy(if_mac_addr, devmac, MAC_LEN);
        devmac = if_mac_addr;
        dev_put(nat_dev);

        HNAT_PRINTK("DMAC: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
                    devmac[0], devmac[1], devmac[2],
                    devmac[3], devmac[4], devmac[5]);
        HNAT_PRINTK("VLAN id: %d\n", vid);

        if(if_mac_add(devmac, vid, ipv6) != 0)
        {
            setup_error = SW_FAIL;
            continue;
        }
        else
        {
            setup_error = SW_OK;
        }
    }

    return setup_error;
}