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