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

Reply via email to