[I have typed this email for a while but was distracted before actually sending it, I see that in the meantime Ali already sent some very similar code, I am sending mine just as a reference as well]

Sure, if it would help here is the code.
It's in python, and I wrote it against the zaku release.
I am sure this is not the best way to do this and it's definitely not
bulletproof. I just needed a quick way to test this capability for an experiment.

Cheers,
Niky

MAC_ADDR = "00:00:00:00:00:01"
IP_ADDR = ""10.100.1.200"

if packet.type == ethernet.ARP_TYPE:
  if (ip_to_str(arph.protodst) == IP_ADDR and
         arph.opcode == arp.REQUEST) :
      arph = packet.find('arp')
      if (arph.opcode == arp.REQUEST) :
        send_arp_reply(dpid, packet, inport)

# Fxn that send an arp reply
# INPUT
#  - dpid : the dpid that sent up the ARP REQUEST
#  - reqpkt : the rcvd ARP REQUEST packet
#  - inport : the port where the ARP REQUEST can from
def send_arp_reply(dpid, reqpkt, inport) :
  # Grab the arp hdrs of the rcvd pkt
  reqh = reqpkt.find('arp')
  logger.debug("send arp reply")
  # Create the arp packet and fill in the info
  replyh = arp()
  replyh.hwsrc      = octstr_to_array(MAC_ADDR)
  replyh.hwdst      = reqh.hwsrc
  replyh.hwlen      = reqh.hwlen
  replyh.opcode     = arp.REPLY
  replyh.protolen   = reqh.protolen
  replyh.protosrc   = reqh.protodst
  replyh.protodst   = reqh.protosrc

  # Create the ethernet packet, fill in the info and set as payload the arp
  # packet
  replypkt = ethernet()
  replypkt.set_payload(replyh)
  replypkt.type = ethernet.ARP_TYPE
  replypkt.src = octstr_to_array(MAC_ADDR)
  replypkt.dst = reqpkt.src
  logger.debug("arp pkt %s" % str(replypkt))

# Send the arp reply out the same switch that recvd the request and out the
  # port from which the REQUEST was rcvd
  inst.send_openflow_packet(dpid, replypkt.tostring(), inport)

On 2/16/11 4:29 PM, kk yap wrote:
Hi,

There are many ways to do this and none of this is particularly more
appealing.  If you are using Python, you can try dpkt or scapy.
Handcrafting it is not that bad for ARP either.  If you are using
C/C++, I do not know of nice libraries to use here so anyone who has
any idea can educate me too.

In general, you can craft all sort of packets in NOX and it is not
clear than NOX is responsible for support that.

Regards
KK

On 16 February 2011 13:20, Bob Lantz<[email protected]>  wrote:
Generating ARPs in OpenFlow is a frequently encountered problem (a FEP?)!! And 
how to do so conveniently and correctly might be something of what I call a 
FABNAQ - a Frequently Asked But Never (or rarely adequately) Answered Question. 
(FABNAQs are great because they generate lots of Google results which don't 
actually answer the question.)

So, if you have working code to generate correct ARP replies, I think sending 
it to the list would be helpful for posterity!

Also, for NOX developers - what is the preferred easy way to generate ARP 
packets? If it's not simple or convenient, is there a way to make it more so?

-Bob

On Feb 16, 2011, at 12:18 PM, Niky Riga wrote:

Hi Aaron,

that might not be an issue at all, but I don't see in your code where you set 
the ethernet headers (basically the src and dst) for the arp reply.

If you want, I have some code that I wrote a while back to send arp replies, 
that seemed to work as expected. I can forward it along if this is helpful.

--niky

On 2/16/11 2:59 PM, Aaron Rosen wrote:
Hello,

I'm trying to send arp replies from my nox controller though for some
reason my packets don't seem to be getting sent out and I was hoping
someone could point out where I'm going wrong. This is the code I
have:

      if packet.type == ethernet.ARP_TYPE:
             arppacket = arp.arp(packet.next.arr, packet.next.prev)
             if arppacket.opcode == arppacket.REQUEST:
                 tmp_dst = arppacket.protodst
                 arppacket.protodst =  arppacket.protosrc
                 arppacket.protosrc =  tmp_dst
                 arppacket.hwdst = arppacket.hwsrc
                 arppacket.hwsrc = mac_to_int('\xd2\x85\xde\x8e\xf6\x13')
                 arppacket.opcode = arppacket.REPLY
                 packet.next = arppacket;
                 self.send_openflow(dpid, None, packet.arr,
openflow.OFPP_FLOOD, inport);
                 print "ARP REPLY SEND!!"
                 return CONTINUE

When I run tcpdump on the node that is sending the requests I does not
see any of these packets.

I'm trying to look at my openflow traffic with wireshark but for some
reason I'm not seeing any. Though at my controller I'm definitely
getting the packets. (I think this may because I'm using mininet? I've
tried all the interfaces on my machine in wireshark). Though when I
try this using the Openflow Tutorial provided VM i'm also not seeing
any 'of' packets in wireshark there? (Any idea why)?

Thanks,

Aaron




_______________________________________________
nox-dev mailing list
[email protected]
http://noxrepo.org/mailman/listinfo/nox-dev_noxrepo.org


_______________________________________________
nox-dev mailing list
[email protected]
http://noxrepo.org/mailman/listinfo/nox-dev_noxrepo.org


_______________________________________________
nox-dev mailing list
[email protected]
http://noxrepo.org/mailman/listinfo/nox-dev_noxrepo.org

Reply via email to