Here's an example of sending a UDP packet. If you want to send an ICMP
packet just change l4=icmp() (and fill in the icmp fields) and the
l3.protocol type to icmp.
Aaron
P.S: I'm using the latest nox destiny and I didn't need to change any
internal nox code.
def send_udp(mac, dstip, srcip, srcport, dstport, payload):
l4 = udp()
l4.srcport = srcport
l4.dstport = dstport
l4.len = udp.MIN_LEN + len(payload)
l4.set_payload(payload)
l4.arr = l4.tostring()
l3 = ipv4()
l3.iplen = ipv4.MIN_LEN + l4.len
l3.protocol = ipv4.UDP_PROTOCOL
l3.dstip = dstip
l3.srcip = srcip
l3.set_payload(l4)
l2 = ethernet()
l2.set_payload(l3)
l2.dst = mac
l2.src = octstr_to_array(CONTROLLER_MAC)
l2.type = ethernet.IP_TYPE
l4.csum = l4.checksum()
return l2
then:
send_openflow_packet(dpid, send_udp(mac, dstip, srcip, srcport,
dstport, payload).tostring(), inport)
On Thu, Jan 26, 2012 at 2:43 PM, Sabnis, Saurabh S <[email protected]> wrote:
> Hi,
>
> I have similar doubt. I was trying to send ICMP unreachable packets back to
> host but when I tried to set the payload of unreach() packet to
> "packet.next.arr[0:packet.next.hl * 4 + 8]", I got an error due to missing
> 'import array' statement. After inserting it in the packet_base.py file I got
> the following error.
>
> 00074|pyrt|ERR:unable to invoke a Python event handler:
> Traceback (most recent call last):
> File "./nox/lib/util.py", line 116, in f
> event.total_len, buffer_id, packet)
> File "./nox/coreapps/examples/printpacket.py", line 185, in
> packet_in_callback
> route_packet(self,dpid, inport, packet, packet.arr, bufid)
> File "./nox/coreapps/examples/printpacket.py", line 173, in route_packet
> learn_and_forward(self,dpid,inport,packet,buf,bufid)
> File "./nox/coreapps/examples/printpacket.py", line 132, in learn_and_forward
> send_dest_unreach(self,dpid,packet,inport)
> File "./nox/coreapps/examples/printpacket.py", line 89, in send_dest_unreach
> unreach_packet.set_payload(packet.next.arr[0:packet.next.hl * 4 + 8])
> File "./nox/lib/packet/packet_base.py", line 96, in set_payload
> elif type(payload) == array.array:
> AttributeError: type object 'array.array' has no attribute 'array'
>
> Then to work around, I did not set the payload of unreach() and created other
> wrapper packets and sent them to the host using sed_openflow_packet method.
> This method requires eth.tostring() method which calls hdr and checksum
> methods of ipv4.py. But then it again gets stuck there by giving following
> error:
>
> File "./nox/coreapps/examples/printpacket.py", line 185, in
> packet_in_callback
> route_packet(self,dpid, inport, packet, packet.arr, bufid)
> File "./nox/coreapps/examples/printpacket.py", line 173, in route_packet
> learn_and_forward(self,dpid,inport,packet,buf,bufid)
> File "./nox/coreapps/examples/printpacket.py", line 132, in learn_and_forward
> send_dest_unreach(self,dpid,packet,inport)
> File "./nox/coreapps/examples/printpacket.py", line 119, in send_dest_unreach
> self.send_openflow_packet(dpid, unreach_eth.tostring(),
> inport,openflow.OFPP_NONE)
> File "./nox/lib/packet/packet_base.py", line 117, in tostring
> return ''.join((buf, self.next.tostring()))
> File "./nox/lib/packet/packet_base.py", line 112, in tostring
> buf = self.hdr()
> File "./nox/lib/packet/ipv4.py", line 167, in hdr
> self.csum = self.checksum()
> File "./nox/lib/packet/ipv4.py", line 162, in checksum
> self.dstip)
> error: 'H' format requires 0 <= number <= 65535
>
> I printed the values of the attributes used in these functions and found out
> that the self.id attribute of ipv4 packet has value more than 65535. It is
> generated using int(time.time()) function. So I changed the statement to
> int(time.time()) % 65535 and went ahead.
>
> Now I am able to send my packet to the host and I can see it in Wireshark but
> my host is not giving me destination unreachable error. There are several
> problems here. Can someone please help me regarding this. My code is as
> follows:
>
> def send_dest_unreach(self,dpid,packet,inport):
>
> unreach_packet = unreach()
> unreach_packet.unused = 0
> unreach_packet.next_mtu = 0
>
> # unreachable messages include the IP header and the first 8 bytes of
> the
> # packet that couldn't reach its destination
> #print packet.next.arr[0:packet.next.hl * 4 + 8]
> unreach_packet.set_payload(packet.next.arr[0:packet.next.hl * 4 + 8])
> #unreach_packet.arr = packet.next.arr[0:packet.next.hl * 4 + 8]
>
> unreach_icmp = icmp()
> unreach_icmp.type = 3 # unreachable
> unreach_icmp.code = 0 # network unreachable
> unreach_icmp.set_payload(unreach_packet)
>
> # icmp (unlike ipv4) doesn't automatically calculate its checksum, so
> we
> # have to do it ourself
> unreach_icmp.csum = packet_utils.checksum(unreach_icmp.tostring(), 0)
>
> unreach_ip = ipv4()
>
> # length of the header plus the length of the payload
> unreach_ip.iplen = unreach_ip.hl * 4 + len(unreach_icmp.tostring())
>
> unreach_ip.protocol = ipv4.ICMP_PROTOCOL
> unreach_ip.srcip = packet.next.dstip # Hmm... ?
> unreach_ip.dstip = packet.next.srcip
> unreach_ip.set_payload(unreach_icmp)
> print_packet(unreach_ip,"ID")
>
> unreach_eth = ethernet()
> unreach_eth.src = packet.dst # I wonder what this should actually
> be... ?
> unreach_eth.dst = packet.src
> unreach_eth.type = packet.type
> unreach_eth.set_payload(unreach_ip)
>
> ----- Original Message -----
> From: Aaron Rosen <[email protected]>
> To: Bernd Wittefeld <[email protected]>
> Cc: nox-dev <[email protected]>
> Sent: Thu, 26 Jan 2012 14:03:38 -0500 (EST)
> Subject: Re: [nox-dev] Creating and sending udp packet from controller
> through switch
>
> Hi,
>
> You need to set the length field in the Ipv4 packet.
>
> ipv4_packet.iplen = ipv4.MIN_LEN + udp_packet.len()
>
> should do the trick.
>
> Aaron
>
> On Thu, Jan 26, 2012 at 1:42 PM, Bernd Wittefeld
> <[email protected]> wrote:
>> Hi,
>> I have a python component and want to create an udp packet in the controller
>> and send it out via "self.send_openflow_packet(dpid, packet.tostring(),
>> outport)"
>>
>> First of all: a small bugfix is needed:
>> nox/src/nox/lib/packet/packet_base.py needs an "import array". Without that,
>> the set_payload function raises an exception as it does not find
>> array.array.
>>
>> Now I create my packet the following way:
>>
>> from nox.lib.packet.udp import udp
>> from nox.lib.packet.ipv4 import ipv4
>> from nox.lib.packet.ethernet import ethernet
>>
>> udp_packet = udp()
>> udp_packet.srcport = 12345
>> udp_packet.dstport = 4711
>> rand = random.random()
>> udp_packet.set_payload(str(rand))
>> udp_packet.csum = udp_packet.checksum()
>>
>> ipv4_packet = ipv4()
>> ipv4_packet.set_payload(udp_packet)
>> ipv4_packet.srcip = ipstr_to_int(CONTROLLER_IP)
>> ipv4_packet.dstip = ipstr_to_int(CONTROLLER_IP)
>> ipv4_packet.csum = ipv4_packet.checksum()
>>
>> eth_packet = ethernet()
>> eth_packet.src = CONTROLLER_MAC
>> eth_packet.dst = CONTROLLER_MAC
>> eth_packet.set_payload(ipv4_packet)
>> eth_packet.type = ethernet.IP_TYPE
>>
>> and send this then via self.send_openflow_packet
>>
>> The packet goes out the link and is forwarded (via a flow on another switch)
>> back to the controller where I can see it in my packet_in handler.
>> The only problem is: the packet only consists of the link layer (ethernet
>> type) header and the ipv4 type header. The payload of the ipv4 packet (which
>> should be my udp header and the payload) is completely missing. From the
>> ipv4 class, the ipv4.next is None and I can also verify with wireshark that
>> the packet that is transmitted from the controller to the switch encapsuled
>> in an OpenFlow packet, consists only of the ethernet header and the ipv4
>> header.
>> Am I missing something? Where is this going wrong?
>> I tried to look at the send_openflow_packet function. It seems to somehow
>> call self.ctxt.send_openflow_packet_port in nox/src/nox/lib/core.py which I
>> could not find?!
>> I am not into Swig and all that stuff, so I am stuck here :(
>>
>> Any help is greatly appreciated!
>>
>>
>> Best regards
>>
>> Bernd
>>
>> _______________________________________________
>> nox-dev mailing list
>> [email protected]
>> http://noxrepo.org/mailman/listinfo/nox-dev
>
>
>
> --
> Aaron O. Rosen
> Masters Student - Network Communication
> 306B Fluor Daniel
> _______________________________________________
> nox-dev mailing list
> [email protected]
> http://noxrepo.org/mailman/listinfo/nox-dev
>
--
Aaron O. Rosen
Masters Student - Network Communication
306B Fluor Daniel
_______________________________________________
nox-dev mailing list
[email protected]
http://noxrepo.org/mailman/listinfo/nox-dev