This is probably a problem with the NOX-Classic version of the packet library.
The one in POX is significantly improved. It could be backported to
NOX-Classic, but none of us have bothered because we don't really use or
support NOX-Classic anymore.
If you look at the packet more closely in Wireshark, maybe you can get a hint.
Specifically, look at the IP part. Does it look okay? Is the length set
correctly, for example?
-- Murphy
On Jul 11, 2012, at 9:53 AM, Weiyun wrote:
> Hi,
>
> I followed pong.py from POX to create an ICMP reply using NOX, the packet
> captured by wireshark says “Malformed Packet: IP”. I looked into the packet,
> the ethernet header seems fine.
>
> Here is my codes, could you help me to check where I did wrong?
> Is it because icmp has no payload?
> Or, ethernet_header.tostring() is the wrong argument when calling
> send_openflow_packet?
>
> Thank you very much.
>
> Weiyun
>
> from nox.lib.packet.ethernet import ethernet
> from nox.lib.packet.ipv4 import ipv4
> from nox.lib.packet.icmp import icmp
>
> # ICMP reply
> icmp_header = icmp()
> # icmp.TYPE_ECHO_REPLY = 0
> icmp_header.type = 0
> #icmp_header.payload = packet.find("icmp").payload
> #Controller print: AttributeError: icmp instance has no attribute 'payload'
>
> ip_header = ipv4()
> ip_header.protocol = ipv4.ICMP_PROTOCOL
> ip_header.srcip = packet.next.dstip
> ip_header.dstip = packet.next.srcip
>
> ethernet_header = ethernet()
> ethernet_header.src = packet.dst
> ethernet_header.dst = packet.src
> ethernet_header.type = ethernet.IP_TYPE
>
> ip_header.payload = icmp_header
> ethernet_header.payload = ip_header
>
> actions = [[openflow.OFPAT_OUTPUT, [0, inport]]]
> # call send_openflow_packet(self, dp_id, packet, actions,
> inport=openflow.OFPP_CONTROLLER)
> inst.send_openflow_packet(dpid, ethernet_header.tostring(), actions,
> openflow.OFPP_CONTROLLER)
>
>
>
> From: Murphy McCauley
> Sent: Tuesday, July 10, 2012 3:39 PM
> To: Weiyun
> Cc: [email protected]
> Subject: Re: [nox-dev] How to generate ICMP packet?
>
> On Jul 10, 2012, at 12:24 PM, Weiyun wrote:
>
>> Could you give me an example how to generate a ICMP reply message?
>>
>> I suppose that first create packet_base instance, then add ipv4 header, and
>> then icmp header?
>
> More like an *ethernet* and then ipv4 and then icmp.
>
>> Is there a way to copy necessary information from ICMP request to reply
>> message, and then modify some attributes?
>
> Sure. Just copy it.
>
> The pong.py sample in POX does exactly this. It won't quite work with NOX's
> version of the packet library, but it may be useful as an example.
>
>> How about ICMP unreachable message?
>
> Well, you can read the RFC and set the fields appropriately.
>
> Also, POX's l2_multi.py has an example of generating destination unreachable
> messages. Again, it won't be directly usable in NOX, but it might be helpful.
>
>
> Hope that helps.
>
> -- Murphy