//----------------------------------------------------------------------- void ip_pkt_hdr(u_char *packetOut){ struct iphdr *iph = (struct iphdr *)(packetOut + sizeof(struct ethhdr) ); iph->ttl=64; unsigned long src_ip = iph->saddr; unsigned long dest_ip = iph->daddr; iph->saddr = dest_ip; iph->daddr = src_ip; unsigned short cksum = calc_ip_checksum(packetOut); iph->check = htons(cksum); }
void ip_pkt_ttl0_hdr(u_char *packetOut, int packet_size){ struct iphdr *iph = (struct iphdr *)(packetOut + sizeof(struct ethhdr) ); unsigned short iphdrlen = iph->ihl * 4; iph->ttl = 64; unsigned long src_ip = iph->saddr; unsigned long dest_ip = iph->daddr; iph->saddr = dest_ip; iph->daddr = src_ip; iph->tot_len = iphdrlen + sizeof(struct icmphdr) + 8; iph->protocol=1; unsigned short cksum = calc_ip_checksum(packetOut); iph->check = htons(cksum); }
INT4 CNatIcmpService::IpHandler(const CSmartPtr<CSwitch> & srcSw, CSmartPtr<CHost>& srcHost, CSmartPtr<CHost>& dstHost, ip_t* pkt, packet_in_info_t* packetIn) { BOOL from_inside = TRUE; Base_External *baseExternalPort(NULL); CSmartPtr<CSwitch> gatewaysw(NULL); if ((dstHost.isNotNull()&&(bnc::host::HOST_GATEWAY == dstHost->getHostType())) &&(srcHost.isNull()||(bnc::host::HOST_EXTERNAL== srcHost->getHostType()))) { from_inside = FALSE; } // get icmp data icmp_t* packetin_icmp = (icmp_t*)(pkt->data); LOG_ERROR_FMT("NAT: icmp: CNatIcmpService::IpHandler from_inside=%d packetin_icmp->id = %d",from_inside, packetin_icmp->id); CNatIcmpEntry* nat_icmp_p = CNatIcmpEntryMgr::getInstance()->findNatIcmpEntryByIdentifier(packetin_icmp->id); if (TRUE == from_inside) { // judge nat_icmp create if (NULL == nat_icmp_p) { // if not created, create nat_icmp nat_icmp_p = CNatIcmpEntryMgr::getInstance()->AddNatIcmpEntry(packetin_icmp->id,pkt->src, pkt->eth_head.src, srcSw->getDpid(), packetIn->inport); } if (NULL == nat_icmp_p) { LOG_ERROR("NAT: icmp: nat_icmp_p is NULL or srchostNode is NULL!"); return BNC_ERR; } CRouter* router = CRouterGateMgr::getInstance()->FindRouterNodeByHostMac(pkt->eth_head.src); if(NULL == router) { INT1 macStr[20] = {0}; mac2str(pkt->eth_head.src, macStr); LOG_ERROR_FMT("NAT: external_port_no is NULL, Can't get router by mac[%s] !!!", macStr); return BNC_ERR; } baseExternalPort = G_ExternalMgr.getExternalPortByInternalIp(pkt->src); if(NULL == baseExternalPort) { LOG_ERROR("NAT: icmp: baseExternalPort is NULL!"); return BNC_ERR; } gatewaysw = CControl::getInstance()->getSwitchMgr().getSwitchByDpid(baseExternalPort->get_switch_DPID()); if(gatewaysw.isNull()) { LOG_ERROR_FMT("NAT: icmp: gatewaysw is NULL!, dpid=0x%llx",baseExternalPort->get_switch_DPID()); return BNC_ERR; } //UINT4 external_outer_interface_ip= 0xa334a8c0; //UINT1 external_outer_interface_mac[6] = {0xfa,0x16,0x3e, 0x32,0xcf, 0xc3}; UINT4 external_outer_interface_ip= 0; UINT1 external_outer_interface_mac[6] = {0}; external_outer_interface_ip = router->getRouterIp(); CSmartPtr<CHost> routerNode = CHostMgr::getInstance()->findHostByIp(external_outer_interface_ip); if(routerNode.isNull()) { LOG_ERROR_FMT("NAT: external_port_no is NULL, Can't get router Node!!! external_outer_interface_ip=0x%x",external_outer_interface_ip); return BNC_ERR; } memcpy(external_outer_interface_mac, routerNode->getMac(), 6); pkt->src = external_outer_interface_ip; memcpy(pkt->eth_head.src, external_outer_interface_mac, 6); memcpy(pkt->eth_head.dest,baseExternalPort->get_gateway_MAC(), 6); /* pkt->eth_head.dest[0]=0x4e; pkt->eth_head.dest[1]=0xab; pkt->eth_head.dest[2]=0x3d; pkt->eth_head.dest[3]=0xd7; pkt->eth_head.dest[4]=0xa0; pkt->eth_head.dest[5]=0xae; */ // calculate checksum pkt->cksum = 0; pkt->cksum = calc_ip_checksum((UINT2*)&pkt->hlen, 20); COfMsgUtil::forward(gatewaysw, baseExternalPort->get_switch_port(), packetIn); LOG_ERROR_FMT("ip = 0x%x dpid=0x%llx port=%d", gatewaysw->getSwIp(), gatewaysw->getDpid(), baseExternalPort->get_switch_port()); } else { if (NULL == nat_icmp_p) { LOG_ERROR("NAT ICMP not created!"); return BNC_ERR; } pkt->dest = nat_icmp_p->getIp(); memcpy(pkt->eth_head.dest, nat_icmp_p->getMac(), MAC_LEN); // calculate checksum pkt->cksum = 0; pkt->cksum = calc_ip_checksum((UINT2*)&pkt->hlen,20); CSmartPtr<CHost> host = CHostMgr::getInstance()->findHostByMac(nat_icmp_p->getMac()); if (host.isNull()) { LOG_ERROR("NAT: icmp: host is NULL!"); return BNC_ERR; } if(host->getSw().isNull()||(0 == host->getPortNo())) { CSmartPtr<CHost> gateway_p = CHostMgr::getInstance()->getHostGateway( host); if (gateway_p.isNotNull()) { CArpFloodMgr::getInstance()->AddArpRequestNode(gateway_p->getIp(), host->getIp(), const_cast<UINT1 *>(gateway_p->getMac())); } return BNC_ERR; } LOG_ERROR_FMT("NAT: icmp: ok! nat_icmp_p->getSwDpid()=0x%llx",nat_icmp_p->getSwDpid()); COfMsgUtil::forward(host->getSw(), host->getPortNo(), packetIn); } return BNC_OK; }