Hi,

If you wanted to write a flow with only nw_dst set (not wildcarded), then
flow being written is incorrect.

  cookie=0, duration_sec=33s, duration_nsec=704000000s, table_id=1,
> priority=32768, n_packets=71, n_bytes=2718, idle_timeout=60,hard_timeout=0,
> *actions=mod_nw_dst:10.0.0.3*
>

In the above, No nw_dst field means it is wildcarded. The flow is being
written for wildcards=OFPFW_ALL.

for the correct flow the line,

ofm->match.wildcards =htonl(OFPFW_ALL & (~OFPFW_NW_DST_ALL));
>

should be,

ofm->match.wildcards =htonl(OFPFW_ALL & 0xFFF03FFF & (~OFPFW_DL_TYPE))

the value 0xFFF03FFF sets nw_dst (I donot remember if ~OFPFW_NW_DST_ALL
will work but 0xFFF03FFF will). It is important to set dl_type as well
because as per specifications, nw_dst will be wildcarded automatically if
dl_type is wildcarded. (reference: page 8 of OpenFlow specs. v1.0)

The Second thing: If you want to receive/output the resulting packet having
the modified IP, you should add a *second* action to the Flow which should
be of type 'OFPAT_OUT'.

Regards,
Khan
xFlow Research
http://xflowresearch.com

On Wed, Dec 7, 2011 at 1:42 PM, Hyogi Jung <hgj...@mmlab.snu.ac.kr> wrote:

> Hi All.
>
> I'm working in Openflow using mininet that is virtual emulation.
>
> I want to modify packet's destination IP address.
> For example, If packet's destination is 10.0.0.2, then Switch modify
> destination to 10.0.0.3.
> So I modify some nox source code such as switch.cc. And add some actions
> to switch such as OFPAT_SET_NW_DST.
>
> Below sentence show switch's flows. *Red text* is action.
> But It didn't work. Why? Do mininet support this action?
>
> Could you give some advice?
>
> Best Regards
>
> - Hyogi
>
> mininet> dpctl dump-flows
> *** s4
> ------------------------------------------------------------------------
> stats_reply (xid=0x52625b89): flags=none type=1(flow)
>   cookie=0, duration_sec=33s, duration_nsec=704000000s, table_id=1,
> priority=32768, n_packets=71, n_bytes=2718, idle_timeout=60,hard_timeout=0,
> *actions=mod_nw_dst:10.0.0.3*
>   cookie=8661653833487901345, duration_sec=33s, duration_nsec=719000000s,
> table_id=1, priority=65535, n_packets=0, n_bytes=0,
> idle_timeout=60,hard_timeout=0,arp,in_port=2,dl_vlan=0xffff,dl_vlan_pcp=0x00,dl_src=6a:e0:e2:84:06:d6,dl_dst=ff:ff:ff:ff:ff:ff,nw_src=0.0.0.0,nw_dst=0.0.0.0,nw_tos=0x00,nw_proto=0,tp_src=0,tp_dst=0,actions=FLOOD
>   cookie=6090790159401796605, duration_sec=33s, duration_nsec=753000000s,
> table_id=1, priority=65535, n_packets=0, n_bytes=0,
> idle_timeout=60,hard_timeout=0,arp,in_port=1,dl_vlan=0xffff,dl_vlan_pcp=0x00,dl_src=aa:7a:42:10:45:dc,dl_dst=ff:ff:ff:ff:ff:ff,nw_src=0.0.0.0,nw_dst=0.0.0.0,nw_tos=0x00,nw_proto=0,tp_src=0,tp_dst=0,actions=FLOOD
>
> *This is my source.*
>
>
> //////////////////////////////////////////////////////////////////////////////////////
>
> ofp_flow_mod* ofm;
> size_t size = sizeof *ofm + sizeof(ofp_action_nw_addr);
> boost::shared_array<char> raw_of(new char[size]);
> ofm = (ofp_flow_mod*) raw_of.get();
>
> ofm->header.version = OFP_VERSION;
> ofm->header.type = OFPT_FLOW_MOD;
> ofm->header.length = htons(size);
> ofm->match.wildcards =htonl(OFPFW_ALL & (~OFPFW_NW_DST_ALL));
>
>
> ofm->match.in_port = htons(flow.in_port);
> ofm->match.dl_vlan = flow.dl_vlan;
> ofm->match.dl_vlan_pcp = flow.dl_vlan_pcp;
> memcpy(ofm->match.dl_src, flow.dl_src.octet, sizeof ofm->match.dl_src);
> memcpy(ofm->match.dl_dst, flow.dl_dst.octet, sizeof ofm->match.dl_dst);
>
> ofm->match.dl_type = flow.dl_type;
>
> ofm->match.nw_src = flow.nw_src;
> ofm->match.nw_dst = 33554442; // IP address : 10.0.0.2
>
> ofm->match.nw_proto = flow.nw_proto;
> ofm->match.nw_tos = flow.nw_tos;
> ofm->match.tp_src = flow.tp_src;
> ofm->match.tp_dst = flow.tp_dst;
> ofm->cookie = htonl(0);
> ofm->command = htons(OFPFC_ADD);
> ofm->buffer_id = htonl(buffer_id);
> ofm->idle_timeout = htons(60);
> ofm->hard_timeout = htons(OFP_FLOW_PERMANENT);
> ofm->priority = htons(OFP_DEFAULT_PRIORITY);
> ofm->flags = htons(ofd_flow_mod_flags());
>
> // OFPAT_SET_NW_DST
> ofp_action_nw_addr& dlset = *((ofp_action_nw_addr*)ofm->actions);
> memset(&dlset, 0, sizeof(ofp_action_nw_addr));
> dlset.type = htons(OFPAT_SET_NW_DST);
> dlset.len = htons(sizeof(ofp_action_nw_addr));
> dlset.nw_addr = 50331658; // 50331658 IP address : 10.0.0.3
>
> send_openflow_command(pi.datapath_id, &ofm->header, true);
>
>
> //////////////////////////////////////////////////////////////////////////////////////
>
> Not all OpenFlow actions are supported.
>
> The following are not currently supported on any Indigo platform:
> OFPAT_SET_NW_SRC (Set L3 IP source address) OFPAT_SET_NW_DST (Set L3 IP
> destination address) OFPAT_SET_TP_SRC (Set L4 source port) OFPAT_SET_TP_DST
> (Set L4 destination port)
>
> The following are only supported on the Pronto 3290 and the Triumph 2
> reference:
> OFPAT_SET_DL_SRC (Set L2 MAC source address) OFPAT_SET_DL_DST (Set L2 MAC
> destination address)
>
> OFPAT_STRIP_VLAN (Strip VLAN tag) is supported (but with only limited
> validation) on the 3290 and 3240 platforms. On other platforms, the
> function can be implemented by setting to the system's untagged VLAN
> (untested).
>
> _______________________________________________
> 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

Reply via email to