OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
flow_entry.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef __AGENT_PKT_FLOW_ENTRY_H__
6 #define __AGENT_PKT_FLOW_ENTRY_H__
7 
8 #include <boost/uuid/uuid_io.hpp>
9 #include <boost/intrusive_ptr.hpp>
10 #include <boost/intrusive/list.hpp>
11 #include <tbb/atomic.h>
12 #include <tbb/mutex.h>
13 #include <tbb/recursive_mutex.h>
14 #include <base/util.h>
15 #include <base/address.h>
16 #include <db/db_table_walker.h>
17 #include <cmn/agent_cmn.h>
18 #include <oper/mirror_table.h>
19 #include <filter/traffic_action.h>
20 #include <filter/acl_entry.h>
21 #include <filter/acl.h>
22 #include <pkt/pkt_types.h>
23 #include <pkt/pkt_handler.h>
24 #include <pkt/pkt_init.h>
25 #include <pkt/pkt_flow_info.h>
26 #include <pkt/flow_token.h>
27 #include <sandesh/sandesh_trace.h>
28 #include <oper/global_vrouter.h>
29 #include <oper/vn.h>
30 #include <oper/vm.h>
31 #include <oper/interface_common.h>
32 #include <oper/nexthop.h>
33 #include <oper/route_common.h>
34 #include <oper/sg.h>
35 #include <oper/vrf.h>
36 #include <filter/acl.h>
37 #include <sandesh/common/flow_types.h>
38 
40 class FlowEntry;
41 class FlowExportInfo;
42 class FlowStatsCollector;
43 class Token;
44 class FlowMgmtRequest;
45 class FlowEntryInfo;
46 struct FlowUveFwPolicyInfo;
48 typedef std::unique_ptr<FlowEntryInfo> FlowMgmtEntryInfoPtr;
49 
51 // This is helper struct to carry parameters of reverse-flow. When flow is
52 // being deleted, the relationship between forward and reverse flows are
53 // broken. However, some info of reverse flow is needed during export of flows
54 // for FlowStatsCollector. This information of reverse flow is carried in the
55 // following struct.
61  std::string vmi_uuid_;
62  std::string sg_uuid_;
63  std::string vm_cfg_name_;
64  uint16_t drop_reason_;
65  std::string nw_ace_uuid_;
67 
71  }
72 
74  const boost::uuids::uuid &rev_egress_uuid,
75  IpAddress sip,
76  const std::string &vmi_uuid,
77  const std::string &sg_uuid,
78  const std::string &vm_cfg_name,
79  uint16_t &drop_reason,
80  std::string &nw_ace_uuid,
81  FlowAction &action_info) : rev_uuid_(rev_uuid),
82  rev_egress_uuid_(rev_egress_uuid), sip_(sip), vmi_uuid_(vmi_uuid),
83  sg_uuid_(sg_uuid), vm_cfg_name_(vm_cfg_name),
84  drop_reason_(drop_reason), nw_ace_uuid_(nw_ace_uuid),
85  action_info_(action_info) {
86  }
87 };
88 
90 // Helper class to manage following,
91 // 1. VM referred by the flow
92 // 2. Per VM flow counters to apply per-vm flow limits
93 // - Number of flows for a VM
94 // - Number of linklocal flows for a VM
95 // 3. socket opened for linklocal flows
97 class VmFlowRef {
98 public:
99  static const int kInvalidFd=-1;
100  VmFlowRef();
101  VmFlowRef(const VmFlowRef &rhs);
102  ~VmFlowRef();
103 
104  void Init(FlowEntry *flow);
105  void operator=(const VmFlowRef &rhs);
106  void Reset(bool reset_flow);
107  void FreeRef();
108  void FreeFd();
109  void SetVm(const VmEntry *vm);
110  bool AllocateFd(Agent *agent, uint8_t l3_proto);
111  void Move(VmFlowRef *rhs);
112 
113  int fd() const { return fd_; }
114  uint16_t port() const { return port_; }
115  const VmEntry *vm() const { return vm_.get(); }
116 private:
117  // IMPORTANT: Keep this structure assignable. Assignment operator is used in
118  // FlowEntry::Copy() on this structure
120  int fd_;
121  uint16_t port_;
123 };
124 
125 typedef boost::intrusive_ptr<FlowEntry> FlowEntryPtr;
126 
127 struct FlowKey {
129  family(Address::UNSPEC), nh(0), src_addr(Ip4Address(0)),
130  dst_addr(Ip4Address(0)), protocol(0),
131  src_port(0), dst_port(0){
132  }
133 
134  FlowKey(uint32_t nh_p, const Ip4Address &sip_p, const Ip4Address &dip_p,
135  uint8_t proto_p, uint16_t sport_p, uint16_t dport_p)
136  : family(Address::INET), nh(nh_p), src_addr(sip_p), dst_addr(dip_p),
137  protocol(proto_p), src_port(sport_p), dst_port(dport_p) {
138  }
139 
140  FlowKey(uint32_t nh_p, const IpAddress &sip_p, const IpAddress &dip_p,
141  uint8_t proto_p, uint16_t sport_p, uint16_t dport_p)
142  : family(sip_p.is_v4() ? Address::INET : Address::INET6), nh(nh_p),
143  src_addr(sip_p), dst_addr(dip_p), protocol(proto_p), src_port(sport_p),
144  dst_port(dport_p) {
145  }
146 
147  FlowKey(const FlowKey &key) :
148  family(key.family), nh(key.nh), src_addr(key.src_addr),
150  dst_port(key.dst_port) {
151  }
152 
153  // Comparator for the flow-entry
154  bool IsLess(const FlowKey &key) const {
155  if (family != key.family)
156  return family < key.family;
157 
158  if (nh != key.nh)
159  return nh < key.nh;
160 
161  if (src_addr != key.src_addr)
162  return src_addr < key.src_addr;
163 
164  if (dst_addr != key.dst_addr)
165  return dst_addr < key.dst_addr;
166 
167  if (protocol != key.protocol)
168  return protocol < key.protocol;
169 
170  if (src_port != key.src_port)
171  return src_port < key.src_port;
172 
173  return dst_port < key.dst_port;
174  }
175 
176  bool IsEqual(const FlowKey &key) const {
177  if (family != key.family)
178  return false;
179 
180  if (nh != key.nh)
181  return false;
182 
183  if (src_addr != key.src_addr)
184  return false;
185 
186  if (dst_addr != key.dst_addr)
187  return false;
188 
189  if (protocol != key.protocol)
190  return false;
191 
192  if (src_port != key.src_port)
193  return false;
194 
195  if (dst_port != key.dst_port)
196  return false;
197 
198  return true;
199  }
200 
201  void Reset() {
203  nh = -1;
204  src_addr = Ip4Address(0);
205  dst_addr = Ip4Address(0);
206  protocol = -1;
207  src_port = -1;
208  dst_port = -1;
209  }
210 
212  uint32_t nh;
215  uint8_t protocol;
216  uint16_t src_port;
217  uint16_t dst_port;
218 };
219 
220 typedef std::list<MatchAclParams> MatchAclParamsList;
221 
223  void Reset();
224  void ResetAction();
225  void ResetPolicy();
226  void ResetRuleMatchInfo();
227 
230  uint32_t action;
231 
234  uint32_t out_action;
235 
238  uint32_t reverse_action;
239 
243 
244  std::string rule_uuid_;
245  std::string acl_name_;
246  uint32_t action_summary;
247 };
248 
249 // IMPORTANT: Keep this structure assignable. Assignment operator is used in
250 // FlowEntry::Copy() on this structure
251 struct MatchPolicy {
252  MatchPolicy();
253  ~MatchPolicy();
254 
255  void Reset();
256 
257  // IMPORTANT: Keep this structure assignable.
259  uint32_t policy_action;
260 
263 
267 
269  uint32_t mirror_action;
270 
273 
276 
278 };
279 
280 // IMPORTANT: Keep this structure assignable. Assignment operator is used in
281 // FlowEntry::Copy() on this structure
282 struct FlowData {
283  FlowData();
284  ~FlowData();
285 
286  void Reset();
287  std::vector<std::string> SourceVnList() const;
288  std::vector<std::string> DestinationVnList() const;
289  std::vector<std::string> OriginVnSrcList() const;
290  std::vector<std::string> OriginVnDstList() const;
291 
294  std::string source_vn_match;
295  std::string dest_vn_match;
296  std::string origin_vn_src;
297  std::string origin_vn_dst;
306  uint32_t flow_source_vrf;
307  uint32_t flow_dest_vrf;
308 
315  uint32_t vrf;
316  uint32_t mirror_vrf;
317  uint32_t dest_vrf;
322  uint32_t ttl;
323  // In case of policy on fabric, the forwarding happens in
324  // agent_->fabric_vrf(), but policy processing must happen in
325  // agent_->fabric_policy_vrf(). Storing the route infor for
326  // fabric_policy_vrf() for tracking purpose
327  uint32_t src_policy_vrf;
328  uint32_t src_policy_plen;
329  uint32_t dst_policy_vrf;
330  uint32_t dst_policy_plen;
331 
332  // Stats
333  uint8_t source_plen;
334  uint8_t dest_plen;
335  uint16_t drop_reason;
337  uint32_t if_index_info;
339  // map for references to the routes which were ignored due to more specific
340  // route this will be used to trigger flow re-compute to use more specific
341  // on route add. key for the map is vrf and data is prefix length
344 
345  // RPF related
347  // RPF NH for the flow
349  // When RPF is derived from a INET route, flow-management uses VRF and plen
350  // below to track the route for any NH change
351  // rpf_vrf will be VrfEntry::kInvalidIndex if flow uses l2-route for RPF
352  uint32_t rpf_vrf;
353  uint8_t rpf_plen;
354 
355  bool disable_validation; // ignore RPF on specific flows (like BFD health check)
356 
357  std::string vm_cfg_name;
359  uint32_t qos_config_idx;
360  uint16_t allocated_port_;
362  // IMPORTANT: Keep this structure assignable. Assignment operator is used in
363  // FlowEntry::Copy() on this structure
364 };
365 
366 struct FlowEventLog {
367  enum Event {
375  };
376 
377  FlowEventLog();
378  ~FlowEventLog();
379 
380  uint64_t time_;
382  uint32_t flow_handle_;
383  uint8_t flow_gen_id_;
385  uint32_t hash_id_;
386  uint8_t gen_id_;
389 };
390 
391 // There are 4 actions supported,
392 // Flow recomputation goes thru 2 stages of processing,
393 //
394 // - recompute_dbentry_ : In this stage, flow is enqueued to flow-update-queue
395 // as a result of db-entry add/delete/change.
396 // - recompute_ : In this stage, flow is enqueued to flow-event-queue
397 // for recomputation of flow
398 // - delete_ : Specifies that delete action is pending on flow.
399 // - recompute_ : Specifies that flow is enqueued into flow-event-queue
400 // for recomputation.
401 //
402 // The actions have a priority, the higher priorty action overrides lower
403 // priority actions. The priority in decreasing order is,
404 // - delete_
405 // - recompute_
406 // - recompute_dbentry_
407 // - revaluate_
408 //
409 // The flags are also used for state-compression of objects. The state
410 // compression is acheived with,
411 //
412 // - Before Event Enqueue :
413 // Before enqueuing an event, the FlowEvent module checks if the
414 // corresponding action or higher priority action is pending. If so, the
415 // event is ignored.
416 // Note, if the lower priority event is pending, the higher priority event
417 // is still enqueued. The lower priority event is ignored later as given below
418 //
419 // - On Event dequeue :
420 // After dequeuing an event, FlowEvent module checks if a higher priority
421 // event is pending. If so, the current event is ignored.
422 //
423 // - Post Event processing:
424 // Once the event is processed, the corresponding action is cleared for both
425 // forward and reverse flows. Clearing an action also clears lower priority
426 // actions
428 public:
431 
432  void Reset();
433 
434  bool CanDelete();
435  bool SetDelete();
436  void ResetDelete();
437 
438  bool CanRecompute();
439  bool SetRecompute();
440  void ResetRecompute();
441 
442  bool CanRecomputeDBEntry();
443  bool SetRecomputeDBEntry();
444  void ResetRecomputeDBEntry();
445 
446  bool CanRevaluate();
447  bool SetRevaluate();
448  void ResetRevaluate();
449 private:
450  // delete pending
451  bool delete_;
452  // Flow pending complete recompute
454  // Flow pending recompute-dbentry
456  // Flow pending revaluation due to change in interface, vn, acl and nh
458 };
459 
460 class FlowEntry {
461  public:
463  /* Please update FlowEntry::FlowDropReasonStr whenever entries are added
464  * to the below enum */
488  };
489 
491  /* Please update FlowEntry::FlowDropReasonStr whenever entries are added
492  * to the below enum */
508  };
509 
512  IMPLICIT_ALLOW, /* Due to No Acl rules */
514  DEFAULT_GW_ICMP_OR_DNS, /* DNS/ICMP pkt to/from default gateway */
515  LINKLOCAL_FLOW, /* No policy applied for linklocal flow */
516  MULTICAST_FLOW, /* No policy applied for multicast flow */
517  BGPROUTERSERVICE_FLOW, /* No policy applied for bgp router service flow */
518  NON_IP_FLOW, /* Flow due to bridging */
519  };
520 
521  static const uint32_t kInvalidFlowHandle=0xFFFFFFFF;
522  static const uint8_t kMaxMirrorsPerFlow=0x2;
523  static const std::map<FlowPolicyState, const char*> FlowPolicyStateStr;
524  static const std::map<uint16_t, const char*> FlowDropReasonStr;
525  static const uint32_t kFlowRetryAttempts = 5;
526  // Don't go beyond PCAP_END, pcap type is one byte
527  enum PcapType {
533  };
534 
536  NatFlow = 1 << 0,
537  LocalFlow = 1 << 1,
538  ShortFlow = 1 << 2,
539  LinkLocalFlow = 1 << 3,
540  ReverseFlow = 1 << 4,
541  EcmpFlow = 1 << 5,
542  IngressDir = 1 << 6,
543  Trap = 1 << 7,
544  Multicast = 1 << 8,
545  // a local port bind is done (used as as src port for linklocal nat)
547  TcpAckFlow = 1 << 10,
549  BgpRouterService = 1 << 12,
550  AliasIpFlow = 1 << 13,
551  FabricControlFlow = 1 << 14,
552  FabricFlow = 1 << 15,
553  HbfFlow = 1 << 16
554  };
555 
560  };
561 
563  virtual ~FlowEntry();
564 
565  void Reset(const FlowKey &k);
566  void Reset();
567 
568  // Copy data fields from rhs
569  void Copy(FlowEntry *rhs, bool update);
570 
571  void InitFwdFlow(const PktFlowInfo *info, const PktInfo *pkt,
572  const PktControlInfo *ctrl,
573  const PktControlInfo *rev_ctrl, FlowEntry *rflow,
574  Agent *agent);
575  void InitRevFlow(const PktFlowInfo *info, const PktInfo *pkt,
576  const PktControlInfo *ctrl,
577  const PktControlInfo *rev_ctrl, FlowEntry *rflow,
578  Agent *agent);
579  void InitAuditFlow(uint32_t flow_idx, uint8_t gen_id);
580  static void Init();
581 
582  static AgentRoute *GetL2Route(const VrfEntry *entry, const MacAddress &mac);
583  static AgentRoute *GetUcRoute(const VrfEntry *entry, const IpAddress &addr);
584  static AgentRoute *GetEvpnRoute(const VrfEntry *entry, const MacAddress &mac,
585  const IpAddress &addr, uint32_t ethernet_tag);
587  return default_sg_list_;
588  }
589  static FlowEntry *Allocate(const FlowKey &key, FlowTable *flow_table);
590  static bool ShouldDrop(uint32_t action);
591 
592  // Flow accessor routines
593  int GetRefCount() { return refcount_; }
594  const FlowKey &key() const { return key_;}
595  FlowData &data() { return data_;}
596  const FlowData &data() const { return data_;}
597  FlowTable *flow_table() const { return flow_table_; }
598  bool l3_flow() const { return l3_flow_; }
599  uint8_t gen_id() const { return gen_id_; }
600  uint32_t flow_handle() const { return flow_handle_; }
601  void set_flow_handle(uint32_t flow_handle, uint8_t gen_id);
603  uint32_t flags() const { return flags_; }
604  const FlowEntry *reverse_flow_entry() const {
605  return reverse_flow_entry_.get();
606  }
609  }
610  bool is_flags_set(const FlowEntryFlags &flags) const {
611  return (flags_ & flags);
612  }
614  void reset_flags(const FlowEntryFlags &flags) { flags_ &= ~flags; }
616  data_.source_sg_id_l = sg_l;
617  }
619  data_.dest_sg_id_l = sg_l;
620  }
621  int linklocal_src_port() const { return data_.in_vm_entry.port(); }
622  int linklocal_src_port_fd() const { return data_.in_vm_entry.fd(); }
623  const std::string& acl_assigned_vrf() const;
625  uint32_t acl_assigned_vrf_index() const;
626  uint32_t fip() const { return fip_; }
627  VmInterfaceKey fip_vmi() const { return fip_vmi_; }
628  uint32_t reverse_flow_fip() const;
630  void UpdateFipStatsInfo(uint32_t fip, uint32_t id, Agent *agent);
631  const boost::uuids::uuid &uuid() const { return uuid_; }
632  const boost::uuids::uuid &egress_uuid() const { return egress_uuid_;}
633  const std::string &sg_rule_uuid() const {
635  }
636  const std::string &nw_ace_uuid() const { return nw_ace_uuid_; }
637  const std::string fw_policy_name_uuid() const;
638  const std::string fw_policy_uuid() const;
639  const std::string RemotePrefix() const;
640  const TagList &remote_tagset() const;
641  const TagList &local_tagset() const;
642  const std::string &peer_vrouter() const { return peer_vrouter_; }
643  TunnelType tunnel_type() const { return tunnel_type_; }
644 
645  uint16_t short_flow_reason() const { return short_flow_reason_; }
646  const MacAddress &smac() const { return data_.smac; }
647  const MacAddress &dmac() const { return data_.dmac; }
648  bool on_tree() const { return on_tree_; }
649  void set_on_tree() { on_tree_ = true; }
650  tbb::mutex &mutex() { return mutex_; }
651 
652  const Interface *intf_entry() const { return data_.intf_entry.get(); }
653  const VnEntry *vn_entry() const { return data_.vn_entry.get(); }
655  const VmEntry *in_vm_entry() const { return data_.in_vm_entry.vm(); }
656  const VmEntry *out_vm_entry() const { return data_.out_vm_entry.vm(); }
657  const NextHop *src_ip_nh() const { return data_.src_ip_nh.get(); }
658  const NextHop *rpf_nh() const { return data_.rpf_nh.get(); }
659  uint32_t GetEcmpIndex() const { return data_.component_nh_idx; }
660  const uint32_t bgp_as_a_service_sport() const {
663  return 0;
664  }
665  const uint32_t bgp_as_a_service_dport() const {
668  return 0;
669  }
670  const MatchPolicy &match_p() const { return data_.match_p; }
671 
672  bool ActionSet(TrafficAction::Action action) const {
673  return ((data_.match_p.action_info.action &
674  (1 << action)) ? true : false);
675  }
676  bool ImplicitDenyFlow() const {
677  return ((data_.match_p.action_info.action &
678  (1 << TrafficAction::IMPLICIT_DENY)) ? true : false);
679  }
680  bool deleted() { return deleted_; }
681 
683  bool IsEcmpFlow() const { return is_flags_set(FlowEntry::EcmpFlow); }
684  bool IsNatFlow() const { return is_flags_set(FlowEntry::NatFlow); }
686  // Flow action routines
687  void ResyncFlow();
688  void RpfUpdate();
689  bool ActionRecompute();
690  bool DoPolicy();
691  void MakeShortFlow(FlowShortReason reason);
692  void SetMirrorVrfFromAction();
693  void SetHbsInfofromAction();
694  void SetVrfAssignEntry();
695  void ComputeReflexiveAction();
696  uint32_t MatchAcl(const PacketHeader &hdr,
697  MatchAclParamsList &acl, bool add_implicit_deny,
698  bool add_implicit_allow, FlowPolicyInfo *info);
699  void ResetPolicy();
700 
701  void FillFlowInfo(FlowInfo &info) const;
702  void GetPolicyInfo(const VnEntry *vn, const FlowEntry *rflow);
703  void GetPolicyInfo(const FlowEntry *rflow);
704  void GetPolicyInfo(const VnEntry *vn);
705  void GetPolicyInfo();
706  void UpdateL2RouteInfo();
707  void GetVrfAssignAcl();
708  void SetMirrorVrf(const uint32_t id) {data_.mirror_vrf = id;}
709 
710  void GetPolicy(const VnEntry *vn, const FlowEntry *rflow);
711  void GetNonLocalFlowSgList(const VmInterface *vm_port);
712  void GetLocalFlowSgList(const VmInterface *vm_port,
713  const VmInterface *reverse_vm_port);
714  void GetSgList(const Interface *intf);
715  void GetApplicationPolicySet(const Interface *intf,
716  const FlowEntry *rflow);
717  void SetPacketHeader(PacketHeader *hdr);
718  void SetOutPacketHeader(PacketHeader *hdr);
720  void SetAclAction(std::vector<AclAction> &acl_action_l) const;
721  void UpdateReflexiveAction();
722  bool IsFabricControlFlow() const;
723  void SetAclFlowSandeshData(const AclDBEntry *acl,
724  FlowSandeshData &fe_sandesh_data,
725  Agent *agent) const;
726  uint32_t InterfaceKeyToId(Agent *agent, const VmInterfaceKey &key);
729  return fsc_;
730  }
731 
733  fsc_ = fsc;
734  }
735  static std::string DropReasonStr(uint16_t reason);
736  std::string KeyString() const;
737  void SetEventSandeshData(SandeshFlowIndexInfo *info);
739  uint32_t flow_handle, uint8_t gen_id);
740  void RevFlowDepInfo(RevFlowDepParams *params);
741  uint32_t last_event() const { return last_event_; }
742  void set_last_event(uint32_t event) {
743  last_event_ = event;
745  }
750  void SetUnResolvedList(bool added){ is_flow_on_unresolved_list = added;}
752  bool trace() const { return trace_; }
753  void set_trace(bool val) { trace_ = val; }
754 
757  flow_mgmt_request_ = req;
758  }
759 
760  FlowEntryInfo *flow_mgmt_info() const { return flow_mgmt_info_.get(); }
761  void set_flow_mgmt_info(FlowEntryInfo *info);
762  void FillUveFwStatsInfo(FlowUveFwPolicyInfo *info, bool added) const;
763  void FillUveVnAceInfo(FlowUveVnAcePolicyInfo *info) const;
764  bool IsClientFlow();
765  bool IsServerFlow();
766  uint16_t allocated_port() {
767  return data_.allocated_port_;
768  }
770  uint32_t GetTransactionId() {return transaction_id_;}
771  void SetHbsInterface (HbsInterface intf) { hbs_intf_ = intf; }
773 private:
774  friend class FlowTable;
775  friend class FlowEntryFreeList;
776  friend class FlowStatsCollector;
777  friend class KSyncFlowIndexManager;
778 
779  friend void intrusive_ptr_add_ref(FlowEntry *fe);
780  friend void intrusive_ptr_release(FlowEntry *fe);
781 
782  void FillUveLocalRevFlowStatsInfo(FlowUveFwPolicyInfo *info, bool added)
783  const;
784  void FillUveFwdFlowStatsInfo(FlowUveFwPolicyInfo *info, bool added) const;
785  void RpfInit(const AgentRoute *rt, const IpAddress &sip);
786  void RpfSetRpfNhFields(const NextHop *rpf_nh);
787  void RpfSetRpfNhFields(const AgentRoute *rt, const NextHop *rpf_nh);
788  void RpfSetSrcIpNhFields(const AgentRoute *rt, const NextHop *src_ip_nh);
789  bool RpfFromSrcIpNh() const;
790  void RpfComputeEgress();
791  void RpfComputeIngress();
792 
793  bool InitFlowCmn(const PktFlowInfo *info, const PktControlInfo *ctrl,
794  const PktControlInfo *rev_ctrl, FlowEntry *rflow);
795  VmInterfaceKey InterfaceIdToKey(Agent *agent, uint32_t id);
796  void GetSourceRouteInfo(const AgentRoute *rt);
797  void GetDestRouteInfo(const AgentRoute *rt);
798  const std::string InterfaceIdToVmCfgName(Agent *agent, uint32_t id);
799  const VrfEntry *GetDestinationVrf() const;
800  bool SetQosConfigIndex();
801  void SetAclInfo(SessionPolicy *sp, SessionPolicy *rsp,
802  const FlowPolicyInfo &fwd_flow_info,
803  const FlowPolicyInfo &rev_flow_info, bool tcp_rev,
804  bool is_sg);
805  void SessionMatch(SessionPolicy *sp, SessionPolicy *rsp, bool is_sg);
807  const std::string BuildRemotePrefix(const FlowRouteRefMap &rt_list,
808  uint32_t vr, const IpAddress &ip) const;
809  uint8_t GetUnderlayGwIndex(uint32_t intf_in, const IpAddress &sip,
810  const IpAddress &dip, uint8_t proto, uint16_t sport,
811  uint16_t dport) const;
812 
816  bool l3_flow_;
817  uint8_t gen_id_;
818  uint32_t flow_handle_;
820  static tbb::atomic<int> alloc_count_;
821  bool deleted_;
822  uint32_t flags_;
826  std::string sg_rule_uuid_;
827  std::string nw_ace_uuid_;
828  //IP address of the src vrouter for egress flows and dst vrouter for
829  //ingress flows. Used only during flow-export
830  std::string peer_vrouter_;
831  //Underlay IP protocol type. Used only during flow-export
833  // Is flow-entry on the tree
834  bool on_tree_;
835  // Following fields are required for FIP stats accounting
836  uint32_t fip_;
838  // Ksync entry for the flow
840  // atomic refcount
841  tbb::atomic<int> refcount_;
842  tbb::mutex mutex_;
843  boost::intrusive::list_member_hook<> free_list_node_;
845  uint32_t last_event_;
846  bool trace_;
847  boost::scoped_array<FlowEventLog> event_logs_;
853  // flow_mgmt_request used for compressing events to flow-mgmt queue.
854  // flow_mgmt_request_ is set when flow is enqueued to flow-mgmt queue. No
855  // subsequent enqueues are done till this field is set. The request can be
856  // updated with new values to reflect latest state
858 
859  // Field used by flow-mgmt module. Its stored here to optimize flow-mgmt
860  // and avoid lookups
862  const std::string fw_policy_;
863  // Transaction id is used to detect old/stale vrouter add-ack response for
864  // reverse flow handle allocation requests. It can happen if flow are
865  // evicted from vrouter just after add-ack response sent to agent
866  // and same flows are created before add-ack response gets processed
867  // in agent.
868  // transaction id should not be copied, it is incremented when flow entry
869  // is reused.
870  uint32_t transaction_id_;
872  public:
874  idx_ = 0;
875  for (uint32_t i = 0; i < size_; i++) {
876  last_events_[i] = 0;
877  }
878  }
879 
880  void UpdateEvtHistory( uint32_t event ) {
881  last_events_[idx_] = event;
882  idx_ = (idx_+1) % size_;
883  }
884 
885  private:
886  static const uint32_t size_ = 5;
887  uint32_t last_events_[size_];
888  uint32_t idx_;
889  };
890  // Not modifying on Reset and Copy to retain the history
893  // IMPORTANT: Remember to update Reset() routine if new fields are added
894  // IMPORTANT: Remember to update Copy() routine if new fields are added
895 };
896 
899 
900 //A bound source port could be reused across different
901 //destination IP address, Port class holds a list of
902 //destination IP which have used this particular source
903 //port
904 class Port {
905 public:
906  Port() :
907  port_(0) {}
908  Port(uint16_t port) : port_(port) {}
909  ~Port() {}
910 
911  uint16_t port() const {
912  return port_;
913  }
914 
915  virtual uint16_t Bind() = 0;
916 protected:
917  uint16_t port_;
918 };
919 
920 class TcpPort : public Port {
921 public:
922  TcpPort(boost::asio::io_context &io, uint16_t port):
923  Port(port), socket_(io) {}
924  virtual ~TcpPort();
925 
926  virtual uint16_t Bind();
927 private:
928  boost::asio::ip::tcp::socket socket_;
929 };
930 
931 class UdpPort : public Port {
932 public:
933  UdpPort(boost::asio::io_context &io, uint16_t port):
934  Port(port), socket_(io) {}
935  virtual ~UdpPort();
936 
937  virtual uint16_t Bind();
938 private:
939  boost::asio::ip::udp::socket socket_;
940 };
941 
942 //Given a flow key gives the port used
943 //This would fail on first attempt or if the
944 //flow has been idle for long time
946 public:
948  const uint16_t port):
949  key_(key), port_(port), stale_(false) {}
950 
951  const FlowKey& key() const {
952  return key_;
953  }
954 
955  uint16_t port() const {
956  return port_;
957  }
958 
959  void set_stale(bool stale) const {
960  stale_ = stale;
961  }
962 
963  void MarkDelete() const;
964  bool operator<(const PortCacheEntry &rhs) const;
965  bool CanBeAged(uint64_t current_time, uint64_t timeout) const;
966 private:
968  uint16_t port_;
969  mutable bool stale_;
970  mutable uint64_t delete_time_;
971 };
972 
973 class PortTable;
974 
975 //Maintain a cache table which would be used to check
976 //if a flow prexisted and reuse the port if yes
978 public:
979  static const uint64_t kCacheAging = 1000;
980  static const uint64_t kAgingTimeout = 1000 * 1000 * 600; //10 minutes
981 
982  typedef std::set<PortCacheEntry> PortCacheEntryList;
983  typedef std::map<uint16_t , PortCacheEntryList> PortCacheTree;
984 
985  PortCacheTable(PortTable *table);
986  ~PortCacheTable();
987 
988  void Add(const PortCacheEntry &cache_entry);
989  void Delete(const PortCacheEntry &cache_entry);
990  const PortCacheEntry* Find(const FlowKey &key) const;
991  void MarkDelete(const PortCacheEntry &cache_entry);
992 
993  void set_timeout(uint64_t timeout) {
994  timeout_ = timeout;
995  }
996 
997 private:
998  void StartTimer();
999  void StopTimer();
1000  bool Age();
1001 
1005  uint16_t hash_;
1006  uint64_t timeout_;
1007 };
1008 
1009 //Per protocol table to manage port allocation
1010 class PortTable {
1011 public:
1012  const static uint8_t kInvalidPort = 0;
1013 
1014  typedef boost::shared_ptr<Port> PortPtr;
1016 
1017  typedef std::map<uint16_t, uint16_t> PortToBitIndexMap;
1018  typedef std::pair<uint16_t, uint16_t> PortToBitIndexPair;
1019 
1021  typedef boost::shared_ptr<PortBitMap> PortBitMapPtr;
1022  typedef std::vector<PortBitMapPtr> PortHashTable;
1023 
1024  PortTable(Agent *agent, uint32_t bucket_size, uint8_t protocol);
1025  ~PortTable();
1026 
1027  uint16_t Allocate(const FlowKey &key);
1028  void Free(const FlowKey &key, uint16_t port, bool release);
1029  uint16_t HashFlowKey(const FlowKey &key);
1030 
1032  return agent_;
1033  }
1034 
1035  uint16_t port_count() const {
1036  return port_config_.port_count;
1037  }
1038 
1039  void set_timeout(uint64_t timeout) {
1040  cache_.set_timeout(timeout);
1041  }
1042 
1043  tbb::recursive_mutex& mutex() {
1044  return mutex_;
1045  }
1046 
1048 
1049  uint16_t GetPortIndex(uint16_t port) const;
1050  const PortConfig* port_config() const {
1051  return &port_config_;
1052  }
1053 
1054  std::vector<uint16_t> GetPortList() const {
1055  tbb::recursive_mutex::scoped_lock lock(mutex_);
1056  std::vector<uint16_t> port_list;
1057  PortToBitIndexMap::const_iterator it = port_to_bit_index_.begin();
1058  for(; it != port_to_bit_index_.end(); it++) {
1059  port_list.push_back(it->first);
1060  }
1061  return port_list;
1062  }
1063 
1064  void GetFlowKeyList(uint16_t port, std::vector<FlowKey> &key) const;
1065 private:
1067  PortPtr CreatePortEntry(uint16_t port_no);
1068  //Create a port with given port_no
1069  void AddPort(uint16_t port_no);
1070  void DeletePort(uint16_t port_no);
1071  void Relocate(uint16_t port_no);
1072  bool IsValidPort(uint16_t port, uint16_t count);
1073  void DeleteAllFlow(uint16_t port, uint16_t index);
1074  bool HandlePortConfig(const PortConfig &pc);
1075 
1076  uint8_t protocol_;
1077  //Holds freed bit entry in table for while so that
1078  //flow could be re-established after aging
1080 
1081  //Max no of hash entries, higher the number
1082  //lesser the chance of clash. Hash would be derived based on
1083  //destination IP and port
1085 
1086  //A Given a hash holds a list of used port numbers
1087  //Free Bit index is to be used in Port tree to get actual port value
1089 
1090  //Mapping from bit vector offset to actual port number
1092 
1093  //Mapping from port to bit index for easier auditing on config
1094  //change
1096 
1097  //Number of port that agent can bind on
1099  mutable tbb::recursive_mutex mutex_;
1100  std::unique_ptr<TaskTrigger> task_trigger_;
1101 };
1102 
1104 public:
1105  typedef boost::shared_ptr<PortTable> PortTablePtr;
1106  PortTableManager(Agent *agent, uint16_t hash_table_size);
1108 
1109  uint16_t Allocate(const FlowKey &key);
1110  void Free(const FlowKey &key, uint16_t port, bool release);
1111 
1112  void UpdatePortConfig(uint8_t protocol, const PortConfig *config);
1113  static void PortConfigHandler(Agent *agent, uint8_t protocol,
1114  const PortConfig *pc);
1115  const PortTable* GetPortTable(uint8_t proto) {
1116  return port_table_list_[proto].get();
1117  }
1118 private:
1121 };
1122 #endif // __AGENT_PKT_FLOW_ENTRY_H__
bool InitFlowCmn(const PktFlowInfo *info, const PktControlInfo *ctrl, const PktControlInfo *rev_ctrl, FlowEntry *rflow)
Definition: flow_entry.cc:611
bool AllocateFd(Agent *agent, uint8_t l3_proto)
Definition: flow_entry.cc:218
boost::uuids::uuid bgp_health_check_uuid
Definition: flow_entry.h:321
FlowData data_
Definition: flow_entry.h:815
static tbb::atomic< int > alloc_count_
Definition: flow_entry.h:820
void Delete(const PortCacheEntry &cache_entry)
Definition: flow_entry.cc:3840
bool is_flow_on_unresolved_list
Definition: flow_entry.h:852
uint16_t drop_reason_
Definition: flow_entry.h:64
void Move(VmFlowRef *rhs)
Definition: flow_entry.cc:152
VmInterfaceKey reverse_flow_vmi() const
Definition: flow_entry.cc:1024
VnListType source_vn_list
Definition: flow_entry.h:298
int intrusive_ptr_add_ref(const AsPath *cpath)
Definition: bgp_aspath.h:147
std::string acl_name_
Definition: flow_entry.h:245
FlowStatsCollector * fsc_
Definition: flow_entry.h:844
VnListType origin_vn_dst_list
Definition: flow_entry.h:301
void SetVm(const VmEntry *vm)
Definition: flow_entry.cc:200
void GetSourceRouteInfo(const AgentRoute *rt)
Definition: flow_entry.cc:1489
void set_trace(bool val)
Definition: flow_entry.h:753
bool operator<(const PortCacheEntry &rhs) const
Definition: flow_entry.cc:3750
uint16_t short_flow_reason_
Definition: flow_entry.h:823
void LogFlow(FlowEventLog::Event event, FlowTableKSyncEntry *ksync, uint32_t flow_handle, uint8_t gen_id)
Definition: flow_entry.cc:3464
IpAddress src_addr
Definition: flow_entry.h:213
const TagList & local_tagset() const
Definition: flow_entry.cc:3502
void FillUveLocalRevFlowStatsInfo(FlowUveFwPolicyInfo *info, bool added) const
Definition: flow_entry.cc:3556
boost::asio::ip::udp::socket socket_
Definition: flow_entry.h:939
uint32_t dst_policy_plen
Definition: flow_entry.h:330
MatchAclParamsList m_reverse_acl_l
Definition: flow_entry.h:236
uint16_t HashFlowKey(const FlowKey &key)
Definition: flow_entry.cc:3879
PortList port_list_
Definition: flow_entry.h:1091
const std::string BuildRemotePrefix(const FlowRouteRefMap &rt_list, uint32_t vr, const IpAddress &ip) const
Definition: flow_entry.cc:3516
std::string rule_uuid_
Definition: flow_entry.h:244
Definition: vrf.h:86
uint32_t mirror_vrf
Definition: flow_entry.h:316
uint32_t src_policy_vrf
Definition: flow_entry.h:327
VmInterfaceKey InterfaceIdToKey(Agent *agent, uint32_t id)
Definition: flow_entry.cc:1627
void ResetRecomputeDBEntry()
Definition: flow_entry.cc:2981
void SetUnResolvedList(bool added)
Definition: flow_entry.h:750
TcpPort(boost::asio::io_context &io, uint16_t port)
Definition: flow_entry.h:922
std::string sg_uuid_
Definition: flow_entry.h:62
void set_fsc(FlowStatsCollector *fsc)
Definition: flow_entry.h:732
bool IsLess(const FlowKey &key) const
Definition: flow_entry.h:154
uint16_t allocated_port_
Definition: flow_entry.h:360
uint8_t vrouter_gen_id_
Definition: flow_entry.h:388
void SetAclAction(std::vector< AclAction > &acl_action_l) const
Definition: flow_entry.cc:3070
const std::string fw_policy_name_uuid() const
Definition: flow_entry.cc:3634
std::string dest_vn_match
Definition: flow_entry.h:295
void SetAclInfo(SessionPolicy *sp, SessionPolicy *rsp, const FlowPolicyInfo &fwd_flow_info, const FlowPolicyInfo &rev_flow_info, bool tcp_rev, bool is_sg)
Definition: flow_entry.cc:2352
FlowKey(uint32_t nh_p, const Ip4Address &sip_p, const Ip4Address &dip_p, uint8_t proto_p, uint16_t sport_p, uint16_t dport_p)
Definition: flow_entry.h:134
Agent * agent_
Definition: flow_entry.h:1066
uint32_t GetEcmpIndex() const
Definition: flow_entry.h:659
uint16_t port_count() const
Definition: flow_entry.h:1035
FlowTable * flow_table() const
Definition: flow_entry.h:597
uint32_t bgp_as_a_service_dport
Definition: flow_entry.h:320
void set_timeout(uint64_t timeout)
Definition: flow_entry.h:993
boost::shared_ptr< PortBitMap > PortBitMapPtr
Definition: flow_entry.h:1021
uint32_t GetTransactionId()
Definition: flow_entry.h:770
MatchAclParamsList m_vrf_assign_acl_l
Definition: flow_entry.h:274
tbb::atomic< int > refcount_
Definition: flow_entry.h:841
uint32_t component_nh_idx
Definition: flow_entry.h:318
void Add(const PortCacheEntry &cache_entry)
Definition: flow_entry.cc:3831
IpAddress dst_addr
Definition: flow_entry.h:214
const VmEntry * in_vm_entry() const
Definition: flow_entry.h:655
std::string source_vn_match
Definition: flow_entry.h:294
void Reset()
Definition: flow_entry.cc:365
void DeleteAllFlow(uint16_t port, uint16_t index)
Definition: flow_entry.cc:4004
const MacAddress & dmac() const
Definition: flow_entry.h:647
static const uint32_t size_
Definition: flow_entry.h:886
FlowEntryEventHistory e_history_
Definition: flow_entry.h:891
std::string vm_cfg_name_
Definition: flow_entry.h:63
uint32_t dst_policy_vrf
Definition: flow_entry.h:329
uint32_t vrf_assign_acl_action
Definition: flow_entry.h:275
MatchAclParamsList m_acl_l
Definition: flow_entry.h:258
void GetPolicyInfo()
Definition: flow_entry.cc:1721
Family
Definition: address.h:24
MacAddress dmac
Definition: flow_entry.h:293
boost::intrusive_ptr< const VmEntry > VmEntryConstRef
Definition: agent.h:60
FlowPendingAction * GetPendingAction()
Definition: flow_entry.h:751
friend void intrusive_ptr_release(FlowEntry *fe)
Definition: flow_entry.cc:570
int linklocal_src_port() const
Definition: flow_entry.h:621
uint32_t reverse_flow_fip() const
Definition: flow_entry.cc:1016
uint32_t acl_assigned_vrf_index_
Definition: flow_entry.h:358
boost::asio::ip::address IpAddress
Definition: address.h:13
uint8_t rpf_plen
Definition: flow_entry.h:353
bool l3_flow_
Definition: flow_entry.h:816
uint32_t flow_dest_vrf
Definition: flow_entry.h:307
Definition: vm.h:32
uint64_t delete_time_
Definition: flow_entry.h:970
void reset_flags(const FlowEntryFlags &flags)
Definition: flow_entry.h:614
uint8_t underlay_gw_index_
Definition: flow_entry.h:361
FlowEntryInfo * flow_mgmt_info() const
Definition: flow_entry.h:760
std::vector< int > SecurityGroupList
Definition: agent.h:201
uint16_t port_count
void set_flow_mgmt_request(FlowMgmtRequest *req)
Definition: flow_entry.h:756
boost::uuids::uuid egress_uuid_
Definition: flow_entry.h:825
uint32_t InterfaceKeyToId(Agent *agent, const VmInterfaceKey &key)
Definition: flow_entry.cc:1638
uint8_t flow_retry_attempts_
Definition: flow_entry.h:851
static bool ShouldDrop(uint32_t action)
Definition: flow_entry.cc:1112
static const uint64_t kAgingTimeout
Definition: flow_entry.h:980
MatchPolicy match_p
Definition: flow_entry.h:309
std::vector< std::string > SourceVnList() const
Definition: flow_entry.cc:339
uint32_t flags() const
Definition: flow_entry.h:603
void FillUveFwdFlowStatsInfo(FlowUveFwPolicyInfo *info, bool added) const
Definition: flow_entry.cc:3576
uint64_t timeout_
Definition: flow_entry.h:1006
void SetMirrorVrfFromAction()
Definition: flow_entry.cc:2849
uint16_t port_
Definition: flow_entry.h:917
std::pair< uint16_t, uint16_t > PortToBitIndexPair
Definition: flow_entry.h:1018
boost::uuids::uuid uuid
SessionPolicy aps_policy
Definition: flow_entry.h:265
void Init(FlowEntry *flow)
Definition: flow_entry.cc:136
PortCacheTable(PortTable *table)
Definition: flow_entry.cc:3768
uint16_t event_log_index_
Definition: flow_entry.h:848
bool trace_
Definition: flow_entry.h:846
uint32_t action
Definition: acl.h:44
void SetHbsInfofromAction()
Definition: flow_entry.cc:2112
boost::shared_ptr< PortTable > PortTablePtr
Definition: flow_entry.h:1105
std::string vmi_uuid_
Definition: flow_entry.h:61
FlowKey key_
Definition: flow_entry.h:813
static const uint64_t kCacheAging
Definition: flow_entry.h:979
static AgentRoute * GetEvpnRoute(const VrfEntry *entry, const MacAddress &mac, const IpAddress &addr, uint32_t ethernet_tag)
Definition: flow_entry.cc:1005
static AgentRoute * GetL2Route(const VrfEntry *entry, const MacAddress &mac)
Definition: flow_entry.cc:982
std::vector< std::string > OriginVnDstList() const
Definition: flow_entry.cc:351
virtual ~UdpPort()
Definition: flow_entry.cc:3735
void FillUveFwStatsInfo(FlowUveFwPolicyInfo *info, bool added) const
Definition: flow_entry.cc:3602
uint32_t out_action
Definition: flow_entry.h:234
uint8_t protocol
Definition: flow_entry.h:215
uint32_t bgp_as_a_service_sport
Definition: flow_entry.h:319
bool CanRecomputeDBEntry()
Definition: flow_entry.cc:2986
void set_source_sg_id_l(const SecurityGroupList &sg_l)
Definition: flow_entry.h:615
bool IsFabricControlFlow() const
Definition: flow_entry.cc:893
bool RpfFromSrcIpNh() const
Definition: flow_entry.cc:1310
FlowTableKSyncEntry * ksync_entry()
Definition: flow_entry.h:727
uint16_t hash_table_size_
Definition: flow_entry.h:1084
void RpfInit(const AgentRoute *rt, const IpAddress &sip)
Definition: flow_entry.cc:1249
HbsInterface GetHbsInterface()
Definition: flow_entry.h:772
static void PortConfigHandler(Agent *agent, uint8_t protocol, const PortConfig *pc)
Definition: flow_entry.cc:4163
uint16_t port_
Definition: flow_entry.h:121
tbb::recursive_mutex & mutex()
Definition: flow_entry.h:1043
void set_timeout(uint64_t timeout)
Definition: flow_entry.h:1039
FlowPendingAction pending_actions_
Definition: flow_entry.h:849
FlowRouteRefMap flow_source_plen_map
Definition: flow_entry.h:342
boost::shared_ptr< Port > PortPtr
Definition: flow_entry.h:1014
~Port()
Definition: flow_entry.h:909
static FlowEntry * Allocate(const FlowKey &key, FlowTable *flow_table)
Definition: flow_entry.cc:514
Base class for all Route entries in agent.
Definition: agent_route.h:224
VmFlowRef * in_vm_flow_ref()
Definition: flow_entry.h:654
FlowEntryPtr reverse_flow_entry_
Definition: flow_entry.h:819
uint32_t out_mirror_action
Definition: flow_entry.h:272
uint16_t allocated_port()
Definition: flow_entry.h:766
static const int kInvalidFd
Definition: flow_entry.h:99
void InitRevFlow(const PktFlowInfo *info, const PktInfo *pkt, const PktControlInfo *ctrl, const PktControlInfo *rev_ctrl, FlowEntry *rflow, Agent *agent)
Definition: flow_entry.cc:779
const std::string & sg_rule_uuid() const
Definition: flow_entry.h:633
const VmEntry * vm() const
Definition: flow_entry.h:115
uint16_t Allocate(const FlowKey &key)
Definition: flow_entry.cc:4139
uint32_t rpf_vrf
Definition: flow_entry.h:352
boost::asio::ip::tcp::socket socket_
Definition: flow_entry.h:928
const std::string & peer_vrouter() const
Definition: flow_entry.h:642
void UpdatePortConfig(const PortConfig *port_config)
Definition: flow_entry.cc:4048
FlowMgmtRequest * flow_mgmt_request() const
Definition: flow_entry.h:755
void RpfUpdate()
Definition: flow_entry.cc:1393
Agent * agent()
Definition: flow_entry.h:1031
void InitFwdFlow(const PktFlowInfo *info, const PktInfo *pkt, const PktControlInfo *ctrl, const PktControlInfo *rev_ctrl, FlowEntry *rflow, Agent *agent)
Definition: flow_entry.cc:685
uint32_t action
Definition: flow_entry.h:230
static const SecurityGroupList & default_sg_list()
Definition: flow_entry.h:586
std::string nw_ace_uuid_
Definition: flow_entry.h:65
bool on_tree_
Definition: flow_entry.h:834
MatchAclParamsList m_out_mirror_acl_l
Definition: flow_entry.h:271
TunnelType tunnel_type() const
Definition: flow_entry.h:643
const FlowKey & key() const
Definition: flow_entry.h:594
void SetVrfAssignEntry()
Definition: flow_entry.cc:2178
const std::string fw_policy_
Definition: flow_entry.h:862
static const uint32_t kFlowRetryAttempts
Definition: flow_entry.h:525
static const uint8_t kInvalidPort
Definition: flow_entry.h:1012
void SetOutPacketHeader(PacketHeader *hdr)
Definition: flow_entry.cc:2327
void operator=(const VmFlowRef &rhs)
Definition: flow_entry.cc:140
FlowRouteRefMap flow_dest_plen_map
Definition: flow_entry.h:343
void MarkDelete(const PortCacheEntry &cache_entry)
Definition: flow_entry.cc:3852
bool reverse_rule_present
Definition: flow_entry.h:237
PortCacheTable cache_
Definition: flow_entry.h:1079
bool ActionRecompute()
Definition: flow_entry.cc:2746
IndexVector< FlowKey > PortBitMap
Definition: flow_entry.h:1020
NextHopConstRef rpf_nh
Definition: flow_entry.h:348
uint32_t transaction_id_
Definition: flow_entry.h:870
std::vector< std::string > OriginVnSrcList() const
Definition: flow_entry.cc:347
static SecurityGroupList default_sg_list_
Definition: flow_entry.h:850
VnListType dest_vn_list
Definition: flow_entry.h:299
void SetHbsInterface(HbsInterface intf)
Definition: flow_entry.h:771
uint32_t flow_handle_
Definition: flow_entry.h:382
void ComputeReflexiveAction()
FlowKey(uint32_t nh_p, const IpAddress &sip_p, const IpAddress &dip_p, uint8_t proto_p, uint16_t sport_p, uint16_t dport_p)
Definition: flow_entry.h:140
uint32_t policy_action
Definition: flow_entry.h:259
VmFlowRef out_vm_entry
Definition: flow_entry.h:313
PortTable(Agent *agent, uint32_t bucket_size, uint8_t protocol)
Definition: flow_entry.cc:3887
std::map< uint16_t, uint16_t > PortToBitIndexMap
Definition: flow_entry.h:1017
bool is_flags_set(const FlowEntryFlags &flags) const
Definition: flow_entry.h:610
HbsInterface hbs_intf_
Definition: flow_entry.h:892
bool IsEqual(const FlowKey &key) const
Definition: flow_entry.h:176
std::map< uint16_t, PortCacheEntryList > PortCacheTree
Definition: flow_entry.h:983
void FreeFd()
Definition: flow_entry.cc:185
Definition: agent.h:358
void SetMirrorVrf(const uint32_t id)
Definition: flow_entry.h:708
Port()
Definition: flow_entry.h:906
void ResyncFlow()
Definition: flow_entry.cc:2643
bool ActionSet(TrafficAction::Action action) const
Definition: flow_entry.h:672
PortToBitIndexMap port_to_bit_index_
Definition: flow_entry.h:1095
void set_dest_sg_id_l(const SecurityGroupList &sg_l)
Definition: flow_entry.h:618
const FlowKey & key() const
Definition: flow_entry.h:951
void RevFlowDepInfo(RevFlowDepParams *params)
Definition: flow_entry.cc:1077
uint16_t port_
Definition: flow_entry.h:968
bool reverse_out_rule_present
Definition: flow_entry.h:241
const std::string fw_policy_uuid() const
Definition: flow_entry.cc:3630
std::vector< PortBitMapPtr > PortHashTable
Definition: flow_entry.h:1022
uint32_t vrf
Definition: flow_entry.h:315
std::string peer_vrouter_
Definition: flow_entry.h:830
void UpdateReflexiveAction()
Definition: flow_entry.cc:2881
void IncrementTransactionId()
Definition: flow_entry.h:769
const FlowEntry * reverse_flow_entry() const
Definition: flow_entry.h:604
void Copy(FlowEntry *rhs, bool update)
Definition: flow_entry.cc:531
const boost::uuids::uuid & uuid() const
Definition: flow_entry.h:631
int linklocal_src_port_fd() const
Definition: flow_entry.h:622
SessionPolicy fwaas_policy
Definition: flow_entry.h:266
bool CanBeAged(uint64_t current_time, uint64_t timeout) const
Definition: flow_entry.cc:3759
void set_deleted(bool deleted)
Definition: flow_entry.h:719
std::set< PortCacheEntry > PortCacheEntryList
Definition: flow_entry.h:982
boost::uuids::uuid uuid_
Definition: flow_entry.h:824
void InitAuditFlow(uint32_t flow_idx, uint8_t gen_id)
Definition: flow_entry.cc:871
bool IsClientFlow()
Definition: flow_entry.cc:1421
map< int, int > FlowRouteRefMap
Definition: pkt_flow_info.h:16
uint32_t flow_handle_
Definition: flow_entry.h:818
const uint32_t bgp_as_a_service_sport() const
Definition: flow_entry.h:660
MatchAclParamsList m_acl_l
Definition: flow_entry.h:228
uint16_t port() const
Definition: flow_entry.h:911
MatchAclParamsList m_reverse_out_acl_l
Definition: flow_entry.h:240
PortConfig port_config_
Definition: flow_entry.h:1098
VmInterfaceKey fip_vmi() const
Definition: flow_entry.h:627
const boost::uuids::uuid & egress_uuid() const
Definition: flow_entry.h:632
VmInterfaceKey fip_vmi_
Definition: flow_entry.h:837
FlowTableKSyncEntry * ksync_entry_
Definition: flow_entry.h:384
const VmEntry * out_vm_entry() const
Definition: flow_entry.h:656
bool IsEcmpFlow() const
Definition: flow_entry.h:683
VnEntryConstRef vn_entry
Definition: flow_entry.h:310
RevFlowDepParams(const boost::uuids::uuid &rev_uuid, const boost::uuids::uuid &rev_egress_uuid, IpAddress sip, const std::string &vmi_uuid, const std::string &sg_uuid, const std::string &vm_cfg_name, uint16_t &drop_reason, std::string &nw_ace_uuid, FlowAction &action_info)
Definition: flow_entry.h:73
FlowEntry * flow_
Definition: flow_entry.h:122
const FlowData & data() const
Definition: flow_entry.h:596
uint32_t out_policy_action
Definition: flow_entry.h:262
PortCacheTree tree_
Definition: flow_entry.h:1002
void set_last_event(uint32_t event)
Definition: flow_entry.h:742
bool vrf_assign_evaluated
Definition: flow_entry.h:336
uint64_t time_
Definition: flow_entry.h:380
MacAddress smac
Definition: flow_entry.h:292
bool IsValidPort(uint16_t port, uint16_t count)
Definition: flow_entry.cc:4031
void set_reverse_flow_entry(FlowEntry *reverse_flow_entry)
Definition: flow_entry.h:607
static std::string DropReasonStr(uint16_t reason)
Definition: flow_entry.cc:1477
void Reset(bool reset_flow)
Definition: flow_entry.cc:167
boost::intrusive_ptr< const Interface > InterfaceConstRef
Definition: agent.h:51
uint16_t hash_
Definition: flow_entry.h:1005
void set_flags(const FlowEntryFlags &flags)
Definition: flow_entry.h:613
uint32_t if_index_info
Definition: flow_entry.h:337
uint32_t flags_
Definition: flow_entry.h:822
void Free(const FlowKey &key, uint16_t port, bool release)
Definition: flow_entry.cc:3949
uint16_t port() const
Definition: flow_entry.h:955
FlowTableKSyncEntry * ksync_entry_
Definition: flow_entry.h:839
void GetDestRouteInfo(const AgentRoute *rt)
Definition: flow_entry.cc:1558
TunnelType tunnel_type_
Definition: flow_entry.h:832
void RpfComputeIngress()
Definition: flow_entry.cc:1335
tbb::mutex & mutex()
Definition: flow_entry.h:650
void MakeShortFlow(FlowShortReason reason)
Definition: flow_entry.cc:2869
static AgentRoute * GetUcRoute(const VrfEntry *entry, const IpAddress &addr)
Definition: flow_entry.cc:989
bool ImplicitDenyFlow() const
Definition: flow_entry.h:676
std::string origin_vn_src
Definition: flow_entry.h:296
tbb::mutex mutex_
Definition: flow_entry.h:842
const PortConfig * port_config() const
Definition: flow_entry.h:1050
bool trace() const
Definition: flow_entry.h:752
void set_stale(bool stale) const
Definition: flow_entry.h:959
uint32_t fip() const
Definition: flow_entry.h:626
void set_acl_assigned_vrf_index()
Definition: flow_entry.cc:1049
std::set< std::string > VnListType
Definition: agent.h:212
uint16_t drop_reason
Definition: flow_entry.h:335
uint32_t last_event_
Definition: flow_entry.h:845
FlowAction action_info
Definition: flow_entry.h:277
bool HandlePortConfig(const PortConfig &pc)
Definition: flow_entry.cc:4062
void RpfSetSrcIpNhFields(const AgentRoute *rt, const NextHop *src_ip_nh)
Definition: flow_entry.cc:1224
const PortTable * GetPortTable(uint8_t proto)
Definition: flow_entry.h:1115
PortTablePtr port_table_list_[IPPROTO_MAX]
Definition: flow_entry.h:1120
void RpfSetRpfNhFields(const NextHop *rpf_nh)
Definition: flow_entry.cc:1231
boost::asio::ip::address_v4 Ip4Address
Definition: address.h:14
void GetPolicy(const VnEntry *vn, const FlowEntry *rflow)
Definition: flow_entry.cc:1733
uint32_t flow_source_vrf
Definition: flow_entry.h:306
const uint32_t bgp_as_a_service_dport() const
Definition: flow_entry.h:665
Definition: vn.h:151
void SessionMatch(SessionPolicy *sp, SessionPolicy *rsp, bool is_sg)
Definition: flow_entry.cc:2421
void SetPacketHeader(PacketHeader *hdr)
Definition: flow_entry.cc:2305
const MacAddress & smac() const
Definition: flow_entry.h:646
const Interface * intf_entry() const
Definition: flow_entry.h:652
std::string origin_vn_dst
Definition: flow_entry.h:297
uint16_t src_port
Definition: flow_entry.h:216
bool l3_flow() const
Definition: flow_entry.h:598
FlowMgmtRequest * flow_mgmt_request_
Definition: flow_entry.h:857
const TagList & remote_tagset() const
Definition: flow_entry.cc:3509
friend void intrusive_ptr_add_ref(FlowEntry *fe)
Definition: flow_entry.cc:566
uint16_t Allocate(const FlowKey &key)
Definition: flow_entry.cc:3901
std::unique_ptr< FlowEntryInfo > FlowMgmtEntryInfoPtr
Definition: flow_entry.h:47
uint16_t GetPortIndex(uint16_t port) const
Definition: flow_entry.cc:4103
uint8_t gen_id_
Definition: flow_entry.h:817
SecurityGroupList dest_sg_id_l
Definition: flow_entry.h:303
PortTable * port_table_
Definition: flow_entry.h:1003
virtual ~FlowEntry()
Definition: flow_entry.cc:459
uint8_t source_plen
Definition: flow_entry.h:333
std::string vm_cfg_name
Definition: flow_entry.h:357
uint32_t last_event() const
Definition: flow_entry.h:741
MatchAclParamsList m_mirror_acl_l
Definition: flow_entry.h:268
bool rule_present
Definition: flow_entry.h:229
void ResetPolicy()
Definition: flow_entry.cc:1664
uint16_t port() const
Definition: flow_entry.h:114
boost::scoped_array< FlowEventLog > event_logs_
Definition: flow_entry.h:847
Timer * timer_
Definition: flow_entry.h:1004
void GetVrfAssignAcl()
Definition: flow_entry.cc:1792
virtual uint16_t Bind()
Definition: flow_entry.cc:3739
void set_on_tree()
Definition: flow_entry.h:649
Address::Family family
Definition: flow_entry.h:211
void Reset()
Definition: flow_entry.h:201
bool DoPolicy()
Definition: flow_entry.cc:2549
void Relocate(uint16_t port_no)
Definition: flow_entry.cc:3976
uint8_t protocol_
Definition: flow_entry.h:1076
bool IsNatFlow() const
Definition: flow_entry.h:684
uint32_t flow_handle() const
Definition: flow_entry.h:600
void Reset()
Definition: flow_entry.cc:465
TunnelInfo tunnel_info
Definition: flow_entry.h:338
MatchAclParamsList m_out_acl_l
Definition: flow_entry.h:261
bool out_rule_present
Definition: flow_entry.h:233
const VnEntry * vn_entry() const
Definition: flow_entry.h:653
MatchAclParamsList m_out_acl_l
Definition: flow_entry.h:232
static const std::map< uint16_t, const char * > FlowDropReasonStr
Definition: flow_entry.h:524
void MarkDelete() const
Definition: flow_entry.cc:3754
uint8_t GetUnderlayGwIndex(uint32_t intf_in, const IpAddress &sip, const IpAddress &dip, uint8_t proto, uint16_t sport, uint16_t dport) const
Definition: flow_entry.cc:3648
const PortCacheEntry * Find(const FlowKey &key) const
Definition: flow_entry.cc:3862
bool SetQosConfigIndex()
Definition: flow_entry.cc:2674
static const uint8_t kMaxMirrorsPerFlow
Definition: flow_entry.h:522
void GetApplicationPolicySet(const Interface *intf, const FlowEntry *rflow)
Definition: flow_entry.cc:1888
virtual uint16_t Bind()=0
uint16_t dst_port
Definition: flow_entry.h:217
boost::uuids::uuid rev_uuid_
Definition: flow_entry.h:58
uint32_t hash_id_
Definition: flow_entry.h:385
boost::intrusive_ptr< const NextHop > NextHopConstRef
Definition: agent.h:126
bool deleted_
Definition: flow_entry.h:821
boost::intrusive::list_member_hook free_list_node_
Definition: flow_entry.h:843
void ResetPolicy()
Definition: flow_entry.cc:417
void SetAclFlowSandeshData(const AclDBEntry *acl, FlowSandeshData &fe_sandesh_data, Agent *agent) const
Definition: flow_entry.cc:3290
uint32_t fip_
Definition: flow_entry.h:836
static const uint32_t kInvalidFlowHandle
Definition: flow_entry.h:521
void ResetRetryCount()
Definition: flow_entry.h:748
bool IsOnUnresolvedList()
Definition: flow_entry.h:749
FlowEntry * reverse_flow_entry()
Definition: flow_entry.h:602
static const std::map< FlowPolicyState, const char * > FlowPolicyStateStr
Definition: flow_entry.h:523
void set_flow_handle(uint32_t flow_handle, uint8_t gen_id)
Definition: flow_entry.cc:1037
void DeletePort(uint16_t port_no)
Definition: flow_entry.cc:4017
void AddPort(uint16_t port_no)
Definition: flow_entry.cc:3986
void RpfComputeEgress()
Definition: flow_entry.cc:1357
void FillUveVnAceInfo(FlowUveVnAcePolicyInfo *info) const
Definition: flow_entry.cc:3547
uint8_t GetMaxRetryAttempts()
Definition: flow_entry.h:746
std::list< MatchAclParams > MatchAclParamsList
Definition: flow_entry.h:220
void Free(const FlowKey &key, uint16_t port, bool release)
Definition: flow_entry.cc:4147
void GetNonLocalFlowSgList(const VmInterface *vm_port)
Definition: flow_entry.cc:2045
std::vector< uint16_t > GetPortList() const
Definition: flow_entry.h:1054
bool IsShortFlow() const
Definition: flow_entry.h:682
void intrusive_ptr_release(const AsPath *cpath)
Definition: bgp_aspath.h:155
virtual uint16_t Bind()
Definition: flow_entry.cc:3724
void set_flow_mgmt_info(FlowEntryInfo *info)
Definition: flow_entry.cc:3644
uint16_t short_flow_reason() const
Definition: flow_entry.h:645
const std::string RemotePrefix() const
Definition: flow_entry.cc:3535
const VrfEntry * GetDestinationVrf() const
Definition: flow_entry.cc:2661
bool SetRecomputeDBEntry()
Definition: flow_entry.cc:2973
uint32_t reverse_action
Definition: flow_entry.h:238
void ResetAction()
Definition: flow_entry.cc:409
FlowData & data()
Definition: flow_entry.h:595
uint8_t dest_plen
Definition: flow_entry.h:334
PortPtr CreatePortEntry(uint16_t port_no)
Definition: flow_entry.cc:3935
virtual ~TcpPort()
Definition: flow_entry.cc:3720
void FreeRef()
Definition: flow_entry.cc:175
bool enable_rpf
Definition: flow_entry.h:346
uint8_t gen_id_
Definition: flow_entry.h:386
std::string KeyString() const
Definition: flow_entry.cc:3391
void UpdatePortConfig(uint8_t protocol, const PortConfig *config)
Definition: flow_entry.cc:4155
uint32_t action_summary
Definition: flow_entry.h:246
const std::string & nw_ace_uuid() const
Definition: flow_entry.h:636
boost::uuids::uuid rev_egress_uuid_
Definition: flow_entry.h:59
void Reset()
Definition: flow_entry.cc:278
uint32_t qos_config_idx
Definition: flow_entry.h:359
bool deleted()
Definition: flow_entry.h:680
bool disable_validation
Definition: flow_entry.h:355
void UpdateL2RouteInfo()
Definition: flow_entry.cc:2076
uint32_t vrouter_flow_handle_
Definition: flow_entry.h:387
FlowAction action_info_
Definition: flow_entry.h:66
std::string sg_rule_uuid_
Definition: flow_entry.h:826
std::string nw_ace_uuid_
Definition: flow_entry.h:827
void IncrementRetrycount()
Definition: flow_entry.h:747
Definition: acl.h:35
void GetLocalFlowSgList(const VmInterface *vm_port, const VmInterface *reverse_vm_port)
Definition: flow_entry.cc:2008
void UpdateFipStatsInfo(uint32_t fip, uint32_t id, Agent *agent)
Definition: flow_entry.cc:1032
const NextHop * src_ip_nh() const
Definition: flow_entry.h:657
Definition: timer.h:54
Port(uint16_t port)
Definition: flow_entry.h:908
bool IsServerFlow()
Definition: flow_entry.cc:1448
void GetSgList(const Interface *intf)
Definition: flow_entry.cc:1834
uint8_t gen_id() const
Definition: flow_entry.h:599
void ResetRuleMatchInfo()
Definition: flow_entry.cc:404
UdpPort(boost::asio::io_context &io, uint16_t port)
Definition: flow_entry.h:933
PortTableManager(Agent *agent, uint16_t hash_table_size)
Definition: flow_entry.cc:4125
VmEntryConstRef vm_
Definition: flow_entry.h:119
VmFlowRef in_vm_entry
Definition: flow_entry.h:312
uint32_t nh
Definition: flow_entry.h:212
boost::intrusive_ptr< const VnEntry > VnEntryConstRef
Definition: agent.h:70
uint32_t reverse_out_action
Definition: flow_entry.h:242
const NextHop * rpf_nh() const
Definition: flow_entry.h:658
FlowKey(const FlowKey &key)
Definition: flow_entry.h:147
uint32_t dest_vrf
Definition: flow_entry.h:317
FlowTable * flow_table_
Definition: flow_entry.h:814
uint32_t MatchAcl(const PacketHeader &hdr, MatchAclParamsList &acl, bool add_implicit_deny, bool add_implicit_allow, FlowPolicyInfo *info)
Definition: flow_entry.cc:2221
const std::string & acl_assigned_vrf() const
Definition: flow_entry.cc:1045
SecurityGroupList source_sg_id_l
Definition: flow_entry.h:302
SessionPolicy sg_policy
Definition: flow_entry.h:264
uint8_t flow_gen_id_
Definition: flow_entry.h:383
PortHashTable hash_table_
Definition: flow_entry.h:1088
uint32_t src_policy_plen
Definition: flow_entry.h:328
std::vector< std::string > DestinationVnList() const
Definition: flow_entry.cc:343
uint32_t ttl
Definition: flow_entry.h:322
IpAddress sip_
Definition: flow_entry.h:60
void FillFlowInfo(FlowInfo &info) const
Definition: flow_entry.cc:3134
tbb::recursive_mutex mutex_
Definition: flow_entry.h:1099
IndexVector< PortPtr > PortList
Definition: flow_entry.h:1015
FlowMgmtEntryInfoPtr flow_mgmt_info_
Definition: flow_entry.h:861
const MatchPolicy & match_p() const
Definition: flow_entry.h:670
const std::string InterfaceIdToVmCfgName(Agent *agent, uint32_t id)
Definition: flow_entry.cc:1647
InterfaceConstRef intf_entry
Definition: flow_entry.h:311
PortCacheEntry(const FlowKey &key, const uint16_t port)
Definition: flow_entry.h:947
bool on_tree() const
Definition: flow_entry.h:648
Event event_
Definition: flow_entry.h:381
int fd() const
Definition: flow_entry.h:113
Definition: acl.h:92
bool IsIngressFlow() const
Definition: flow_entry.h:685
VnListType origin_vn_src_list
Definition: flow_entry.h:300
void GetFlowKeyList(uint16_t port, std::vector< FlowKey > &key) const
Definition: flow_entry.cc:4109
uint32_t acl_assigned_vrf_index() const
Definition: flow_entry.cc:1073
FlowEntry(FlowTable *flow_table)
Definition: flow_entry.cc:447
static void Init()
Definition: flow_entry.cc:510
FlowStatsCollector * fsc() const
Definition: flow_entry.h:728
TagList source_tag_id_l
Definition: flow_entry.h:304
boost::intrusive_ptr< FlowEntry > FlowEntryPtr
Definition: flow_entry.h:125
int GetRefCount()
Definition: flow_entry.h:593
void SetEventSandeshData(SandeshFlowIndexInfo *info)
Definition: flow_entry.cc:3433
NextHopConstRef src_ip_nh
Definition: flow_entry.h:314
FlowKey key_
Definition: flow_entry.h:967
std::vector< int > TagList
Definition: agent.h:202
void UpdateEvtHistory(uint32_t event)
Definition: flow_entry.h:880
std::unique_ptr< TaskTrigger > task_trigger_
Definition: flow_entry.h:1100
uint32_t mirror_action
Definition: flow_entry.h:269
TagList dest_tag_id_l
Definition: flow_entry.h:305