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