Hi all,
Sorry to bother you!
I have a question that what should I do to delete existent flow entry? My way is
1) store the information of flow entry which has been installed. I used a list
to save the ofm(of_flow_mod).
2) I get the ofm which in list and change the ofm.command to OFPFC_DELETE.
But the flow entry is not deleted by it. So what is wrong with my code.
This is my code.
hash_map<datapathid, list<of_flow_mod> > OfmCache;
// set up a new flow
ofp_action_list act_list;
ofp_action *act;
act = new ofp_action();
act->set_action_dl_addr(OFPAT_SET_DL_DST,
ARPTable[RouteEntry.NextIPAddr]);
act_list.action_list.push_back(*act);
act = new ofp_action();
act->set_action_output(RouteEntry.outPort, 0);
act_list.action_list.push_back(*act);
// set up new flow
boost::shared_array<uint8_t> of_raw;
size_t size = sizeof(ofp_flow_mod)+act_list.mem_size();
of_raw.reset(new uint8_t[size]);
of_flow_mod ofm;
ofm.header = openflow_pack::header(OFPT_FLOW_MOD, size);
ofm.match = flow.get_exact_match();
ofm.match.in_port = htons(ofm.match.in_port);
ofm.cookie = htonl(0);
ofm.command = htons(OFPFC_ADD);
ofm.flags = htons(0);
ofm.priority = htons(OFP_DEFAULT_PRIORITY);
ofm.idle_timeout = htons(5);
ofm.hard_timeout = htons(OFP_FLOW_PERMANENT);
ofm.buffer_id = buffer_id;
ofm.pack((ofp_flow_mod*) openflow_pack::get_pointer(of_raw));
act_list.pack(openflow_pack::get_pointer(of_raw,sizeof(ofp_flow_mod)));
lg.dbg("Install flow entry %s with %zu actions",
flow.to_string().c_str(), act_list.action_list.size());
send_openflow_command(datapath_id, of_raw, false);
OfmCache[datapath_id].push_back(ofm);
===============================================================================================================
// delete flow entry
for (ite = OfmCache[ited->first].begin(); ite !=
OfmCache[ited->first].end(); ite++)
{
if (ite->match.nw_proto == ip_::proto::TCP)
{
ite->command = htons(OFPFC_DELETE);
ite->out_port = OFPP_NONE;
(*ite).pack((ofp_flow_mod*)
openflow_pack::get_pointer(of_raw));
send_openflow_command(datapath_id, of_raw, false);
lg.dbg("Delete a flow entry which datapathid: %"PRIx64",
IP: %"PRIu32" -> %"PRIu32", Port: %"PRIu16" -> %"PRIu16", proto: %d.",
ited->first.as_host(), ite->match.nw_src,
ite->match.nw_dst,
ite->match.tp_src, ite->match.tp_dst,
ite->match.nw_proto);
ite = OfmCache[ited->first].erase(ite);
}
}
I am sure that command has been sent to openvswitch. But flow entry hasn't been
delete.
Thanks very much.
-- Tony Chen