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++; } }
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; }