Glad you got it working; I had missed yeffri's reply. -- Murphy
On Dec 15, 2011, at 8:26 PM, Kimihiko FUKAMI wrote: > I am sorry for replying this thread late. > > And I sent a reply only to yeffri. > > At first, I successed to send an ARP reply in C++. yeffri's code > helps me very much! > > But yeffri's code can send an ARP request, so I wrote the code > to send an ARP reply. The code is below. > > To yeffri and Murphy, thank you very much !! > > Kimihiko FUKAMI > > === code 1 === > > Disposition Switch::handle(const Event& e){ > const Packet_in_event& pi = assert_cast<const Packet_in_event&>(e); > uint32_t buffer_id = pi.buffer_id; > Flow flow(pi.in_port, *pi.get_buffer()); > stringstream out, out2; > ipaddr ipsrc(ntohl(flow.nw_src)); > ipaddr ipdst(ntohl(flow.nw_dst)); > string tp_src; > string tp_dst; > ipaddr globalgwaddr(LB_IP); > ipaddr privategwaddr(GATEWAY_IP); > > if (flow.dl_type == ethernet::ARP){ > Nonowning_buffer b(*pi.get_buffer()); > const arp_eth_header* arp = NULL; > const eth_header* eth = b.try_pull<eth_header>(); > > if (b.size() >= ARP_ETH_HEADER_LEN) { > arp = reinterpret_cast<const > arp_eth_header*>(b.try_pull(ARP_ETH_HEADER_\ > LEN)); > }else { > return CONTINUE; > } > > if (arp->ar_op == arp::REQUEST){ > if (ipdst.string() == GATEWAY_IP){ > ethernetaddr senderMAC(arptable[GATEWAY_IP]); > ethernetaddr targetMAC(flow.dl_src.string().c_str()); > > sendARPReply(pi.datapath_id, pi.in_port, senderMAC, > privategwaddr.addr\ > , targetMAC, ipsrc.addr); > } > } > > ===== > > sendARPReply function code is below. > > ====== > void Switch::sendARPReply(datapathid dpid, int port, ethernetaddr senderMAC, > u\ > int32_t senderIP, ethernetaddr targetMAC, uint32_t targetIP) > { > ethernet ethPacket; > arp arpPacket; > > ethPacket.daddr = targetMAC; > ethPacket.saddr = senderMAC; > ethPacket.type = ethernet::ARP; > > arpPacket.hrd = arp::ETHER; > arpPacket.pro = ethernet::IP; > arpPacket.hln = ethernet::PAYLOAD_MIN; //6 for ethernet > arpPacket.pln = sizeof(targetIP); //4 for IPV4 > arpPacket.sha = senderMAC; > arpPacket.sip = senderIP; > arpPacket.tha = targetMAC; > arpPacket.tip = targetIP; > arpPacket.op = arp::REPLY; > > int size = sizeof(ethernet) + sizeof(arp); > uint8_t *data = new uint8_t[size]; > > memcpy(data, ðPacket, sizeof(ethPacket)); > memcpy(data + sizeof(ethPacket), &arpPacket, sizeof(arpPacket)); > Array_buffer buffer(data,size); // data will be deleted automatically > > send_openflow_packet(dpid, buffer, port, OFPP_LOCAL, true); } > } > > === end === > > Murphy McCauley <jam...@nau.edu> wrote: > >> First, I'd suggest that you install a flow to send all appropriate ARP >> messages to the controller. >> >> Second, use the packet in event to examine the ARP request. The data that >> you need is all on the event object (specifically, the "buf" field of the >> Ofp_msg_event class contains the raw packet data, which you can parse as an >> ARP request). >> >> Third, build an ARP reply based on the request. Send this data using one of >> the packet sending functions (e.g., send_openflow_packet()). >> >> >> Have you considered writing this as a Python application first? >> >> >> Hope that helps. >> >> -- Murphy >> >> On Nov 30, 2011, at 12:15 AM, Kimihiko FUKAMI wrote: >> >>> Hi,Murphy! >>> >>> Thank you for your reply! >>> >>> I look at arp.hh source code. But, my question is not addressed. >>> >>> I forgot to tell you the code I want to write... >>> >>> The code is NAT program. In the NAT, the condition is that arp >>> reply should be addressed. >>> >>> I examined which api to send arp reply by using of Nox(zaku) in >>> C++, and I get a hint from attached Nox sample code "switch.cc". >>> The hint is Packet_in_event... >>> >>> Then I want to tell you how to get packet data from Packet_in_event >>> instance. Please give me a hint! >>> >>> >>> Murphy McCauley <jam...@nau.edu> wrote: >>> >>>> I don't think I've ever used it, but have you taken a look at >>>> include/netinet++/arp.hh? >>>> >>>> -- Murphy >>>> >>>> On Nov 25, 2011, at 1:54 AM, Kimihiko FUKAMI wrote: >>>> >>>>> Hi, >>>>> >>>>> Currently, I can not send an ARP Reply by using of Nox(zaku) in >>>>> C++ code. >>>>> >>>>> # I can write a code to reply ARP in python. >>>>> >>>>> So, I want a code sample to send ARP Reply in C++. >>>>> >>>>> Please teach me! >>>>> >>>>> --- >>>>> E-mail: fukami.kimih...@lab.ntt.co.jp >>>>> >>>>> _______________________________________________ >>>>> nox-dev mailing list >>>>> nox-dev@noxrepo.org >>>>> http://noxrepo.org/mailman/listinfo/nox-dev >>> >>> >>> --- >>> 深見 公彦 (Kimihiko FUKAMI) TEL:0422-59-2475 >>> NTT 情報流通プラットホーム研究所 >>> ネットワークセキュリティプロジェクト >>> E-mail: fukami.kimih...@lab.ntt.co.jp >>> > > > > _______________________________________________ > nox-dev mailing list > nox-dev@noxrepo.org > http://noxrepo.org/mailman/listinfo/nox-dev _______________________________________________ nox-dev mailing list nox-dev@noxrepo.org http://noxrepo.org/mailman/listinfo/nox-dev