PcapPlusPlus  Next
PcapFilter.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <string>
4 #include <vector>
5 #include <memory>
6 #include "ProtocolType.h"
7 #include <stdint.h>
8 #include "ArpLayer.h"
9 #include "RawPacket.h"
10 #include "DeprecationUtils.h"
11 
12 // Forward Declaration - used in GeneralFilter
13 struct bpf_program;
14 
32 
35 namespace pcpp
36 {
37  // Forward Declaration - used in GeneralFilter
38  class RawPacket;
39 
41  typedef enum
42  {
44  SRC,
46  DST,
50 
52  typedef enum
53  {
67 
68  namespace internal
69  {
73  {
74  void operator()(bpf_program* ptr) const noexcept;
75  };
76  } // namespace internal
77 
81  {
82  private:
83  using BpfProgramUPtr = std::unique_ptr<bpf_program, internal::BpfProgramDeleter>;
84 
85  std::string m_FilterStr;
86  mutable LinkLayerType m_CachedProgramLinkType = LinkLayerType::LINKTYPE_ETHERNET;
87  mutable BpfProgramUPtr m_CachedProgram;
88 
89  static BpfProgramUPtr compileFilter(std::string const& filter, LinkLayerType linkType);
90 
91  public:
93  BpfFilterWrapper() = default;
94 
95  BpfFilterWrapper(const BpfFilterWrapper& other);
96  BpfFilterWrapper(BpfFilterWrapper&&) noexcept = default;
97  BpfFilterWrapper& operator=(const BpfFilterWrapper& other);
98  BpfFilterWrapper& operator=(BpfFilterWrapper&&) noexcept = default;
99 
105  bool setFilter(const std::string& filter, LinkLayerType linkType = LINKTYPE_ETHERNET);
106 
114  PCPP_DEPRECATED("Prefer matches(...) overload.")
115  bool matchPacketWithFilter(const RawPacket* rawPacket) const;
116 
127  PCPP_DEPRECATED("Prefer matches(...) overload.")
128  bool matchPacketWithFilter(const uint8_t* packetData, uint32_t packetDataLength, timespec packetTimestamp,
129  uint16_t linkType) const;
130 
139  bool matches(const RawPacket& rawPacket) const;
140 
151  bool matches(const uint8_t* packetData, uint32_t packetDataLength, timespec timestamp, uint16_t linkType) const;
152  };
153 
159  {
160  private:
161  mutable BpfFilterWrapper m_BpfWrapper;
162  mutable bool m_CachedFilter = false;
163 
164  public:
165  GeneralFilter() = default;
166 
168  virtual ~GeneralFilter() = default;
169 
173  virtual void parseToString(std::string& result) const = 0;
174 
179  PCPP_DEPRECATED("Prefer matches(...) overload.")
180  bool matchPacketWithFilter(RawPacket* rawPacket) const;
181 
185  bool matches(RawPacket const& rawPacket) const;
186 
187  protected:
190  bool cacheFilter() const;
191 
193  void invalidateCache() const
194  {
195  m_CachedFilter = false;
196  };
197  };
198 
202  {
203  private:
204  const std::string m_FilterStr;
205 
206  public:
207  explicit BPFStringFilter(const std::string& filterStr) : m_FilterStr(filterStr)
208  {}
209 
210  virtual ~BPFStringFilter()
211  {}
212 
216  void parseToString(std::string& result) const override;
217 
220  bool verifyFilter();
221  };
222 
229  {
230  private:
231  Direction m_Dir;
232 
233  protected:
234  void parseDirection(std::string& directionAsString) const;
235  Direction getDir() const
236  {
237  return m_Dir;
238  }
239  explicit IFilterWithDirection(Direction dir)
240  {
241  m_Dir = dir;
242  }
243 
244  public:
248  {
249  m_Dir = dir;
250  invalidateCache();
251  }
252  };
253 
260  {
261  private:
262  FilterOperator m_Operator;
263 
264  protected:
265  std::string parseOperator() const;
266  FilterOperator getOperator() const
267  {
268  return m_Operator;
269  }
271  {
272  m_Operator = op;
273  }
274 
275  public:
279  {
280  m_Operator = op;
281  invalidateCache();
282  }
283  };
284 
290  {
291  private:
292  IPAddress m_Address;
293  IPNetwork m_Network;
294 
295  public:
301  IPFilter(const std::string& ipAddress, Direction dir) : IPFilter(IPAddress(ipAddress), dir)
302  {}
303 
307  IPFilter(const IPAddress& ipAddress, Direction dir)
308  : IFilterWithDirection(dir), m_Address(ipAddress), m_Network(ipAddress)
309  {}
310 
321  IPFilter(const std::string& ipAddress, Direction dir, const std::string& netmask)
322  : IPFilter(IPv4Address(ipAddress), dir, netmask)
323  {}
324 
334  IPFilter(const IPAddress& ipAddress, Direction dir, const std::string& netmask)
335  : IFilterWithDirection(dir), m_Address(ipAddress), m_Network(ipAddress, netmask)
336  {}
337 
348  IPFilter(const std::string& ipAddress, Direction dir, int len) : IPFilter(IPAddress(ipAddress), dir, len)
349  {}
350 
360  IPFilter(const IPAddress& ipAddress, Direction dir, int len)
361  : IFilterWithDirection(dir), m_Address(ipAddress), m_Network(ipAddress, len)
362  {}
363 
368  IPFilter(const IPNetwork& network, Direction dir)
369  : IFilterWithDirection(dir), m_Address(network.getNetworkPrefix()), m_Network(network)
370  {}
371 
372  void parseToString(std::string& result) const override;
373 
376  void setNetwork(const IPNetwork& network)
377  {
378  m_Network = network;
379  m_Address = m_Network.getNetworkPrefix();
380  invalidateCache();
381  }
382 
386  void setAddr(const std::string& ipAddress)
387  {
388  this->setAddr(IPAddress(ipAddress));
389  invalidateCache();
390  }
391 
397  void setAddr(const IPAddress& ipAddress)
398  {
399  m_Address = ipAddress;
400  uint8_t newPrefixLen = m_Network.getPrefixLen();
401  if (m_Address.isIPv4() && newPrefixLen > 32u)
402  {
403  newPrefixLen = 32u;
404  }
405 
406  m_Network = IPNetwork(m_Address, newPrefixLen);
407  invalidateCache();
408  }
409 
418  void setMask(const std::string& netmask)
419  {
420  m_Network = IPNetwork(m_Address, netmask);
421  invalidateCache();
422  }
423 
425  void clearMask()
426  {
427  this->clearLen();
428  invalidateCache();
429  }
430 
435  void setLen(const int len)
436  {
437  m_Network = IPNetwork(m_Address, len);
438  invalidateCache();
439  }
440 
442  void clearLen()
443  {
444  m_Network = IPNetwork(m_Address);
445  invalidateCache();
446  }
447  };
448 
455  {
456  private:
457  uint16_t m_IpID;
458 
459  public:
463  IPv4IDFilter(uint16_t ipID, FilterOperator op) : IFilterWithOperator(op), m_IpID(ipID)
464  {}
465 
466  void parseToString(std::string& result) const override;
467 
470  void setIpID(uint16_t ipID)
471  {
472  m_IpID = ipID;
473  invalidateCache();
474  }
475  };
476 
483  {
484  private:
485  uint16_t m_TotalLength;
486 
487  public:
491  IPv4TotalLengthFilter(uint16_t totalLength, FilterOperator op)
492  : IFilterWithOperator(op), m_TotalLength(totalLength)
493  {}
494 
495  void parseToString(std::string& result) const override;
496 
499  void setTotalLength(uint16_t totalLength)
500  {
501  m_TotalLength = totalLength;
502  invalidateCache();
503  }
504  };
505 
511  {
512  private:
513  std::string m_Port;
514  void portToString(uint16_t portAsInt);
515 
516  public:
520  PortFilter(uint16_t port, Direction dir);
521 
522  void parseToString(std::string& result) const override;
523 
526  void setPort(uint16_t port)
527  {
528  portToString(port);
529  invalidateCache();
530  }
531  };
532 
540  {
541  private:
542  uint16_t m_FromPort;
543  uint16_t m_ToPort;
544 
545  public:
550  PortRangeFilter(uint16_t fromPort, uint16_t toPort, Direction dir)
551  : IFilterWithDirection(dir), m_FromPort(fromPort), m_ToPort(toPort)
552  {}
553 
554  void parseToString(std::string& result) const override;
555 
558  void setFromPort(uint16_t fromPort)
559  {
560  m_FromPort = fromPort;
561  invalidateCache();
562  }
563 
566  void setToPort(uint16_t toPort)
567  {
568  m_ToPort = toPort;
569  invalidateCache();
570  }
571  };
572 
579  {
580  private:
581  MacAddress m_MacAddress;
582 
583  public:
587  MacAddressFilter(MacAddress const& address, Direction dir) : IFilterWithDirection(dir), m_MacAddress(address)
588  {}
589 
590  void parseToString(std::string& result) const override;
591 
594  void setMacAddress(MacAddress const& address)
595  {
596  m_MacAddress = address;
597  invalidateCache();
598  }
599  };
600 
607  {
608  private:
609  uint16_t m_EtherType;
610 
611  public:
614  explicit EtherTypeFilter(uint16_t etherType) : m_EtherType(etherType)
615  {}
616 
617  void parseToString(std::string& result) const override;
618 
621  void setEtherType(uint16_t etherType)
622  {
623  m_EtherType = etherType;
624  invalidateCache();
625  }
626  };
627 
634  {
635  protected:
636  std::vector<GeneralFilter*> m_FilterList;
637 
638  public:
640  CompositeFilter() = default;
641 
644  explicit CompositeFilter(const std::vector<GeneralFilter*>& filters);
645 
648  void addFilter(GeneralFilter* filter)
649  {
650  m_FilterList.push_back(filter);
651  invalidateCache();
652  }
653 
657 
660  void setFilters(const std::vector<GeneralFilter*>& filters);
661 
664  {
665  m_FilterList.clear();
666  invalidateCache();
667  }
668  };
669 
672  {
674  AND,
676  OR,
677  };
678 
679  namespace internal
680  {
681  // Could potentially be moved into CompositeLogicFilter as a private member function, with if constexpr when
682  // C++17 is the minimum supported standard.
683 
686  template <CompositeLogicFilterOp op> constexpr const char* getCompositeLogicOpDelimiter() = delete;
687  template <> constexpr const char* getCompositeLogicOpDelimiter<CompositeLogicFilterOp::AND>()
688  {
689  return " and ";
690  };
691  template <> constexpr const char* getCompositeLogicOpDelimiter<CompositeLogicFilterOp::OR>()
692  {
693  return " or ";
694  };
695  } // namespace internal
696 
701  template <CompositeLogicFilterOp op> class CompositeLogicFilter : public CompositeFilter
702  {
703  public:
705 
706  void parseToString(std::string& result) const override
707  {
708  result.clear();
709  for (auto it = m_FilterList.cbegin(); it != m_FilterList.cend(); ++it)
710  {
711  std::string innerFilter;
712  (*it)->parseToString(innerFilter);
713  result += '(' + innerFilter + ')';
714  if (m_FilterList.cend() - 1 != it)
715  {
716  result += internal::getCompositeLogicOpDelimiter<op>();
717  }
718  }
719  }
720  };
721 
730 
739 
744  class NotFilter : public GeneralFilter
745  {
746  private:
747  GeneralFilter* m_FilterToInverse;
748 
749  public:
752  explicit NotFilter(GeneralFilter* filterToInverse)
753  {
754  m_FilterToInverse = filterToInverse;
755  }
756 
757  void parseToString(std::string& result) const override;
758 
761  void setFilter(GeneralFilter* filterToInverse)
762  {
763  m_FilterToInverse = filterToInverse;
764  invalidateCache();
765  }
766  };
767 
777  class ProtoFilter : public GeneralFilter
778  {
779  private:
780  ProtocolTypeFamily m_ProtoFamily;
781 
782  public:
786  explicit ProtoFilter(ProtocolType proto) : m_ProtoFamily(proto)
787  {}
788 
792  explicit ProtoFilter(ProtocolTypeFamily protoFamily) : m_ProtoFamily(protoFamily)
793  {}
794 
795  void parseToString(std::string& result) const override;
796 
800  void setProto(ProtocolType proto)
801  {
802  m_ProtoFamily = proto;
803  invalidateCache();
804  }
805 
810  void setProto(ProtocolTypeFamily protoFamily)
811  {
812  m_ProtoFamily = protoFamily;
813  invalidateCache();
814  }
815  };
816 
822  class ArpFilter : public GeneralFilter
823  {
824  private:
825  ArpOpcode m_OpCode;
826 
827  public:
830  explicit ArpFilter(ArpOpcode opCode) : m_OpCode(opCode)
831  {}
832 
833  void parseToString(std::string& result) const override;
834 
837  void setOpCode(ArpOpcode opCode)
838  {
839  m_OpCode = opCode;
840  invalidateCache();
841  }
842  };
843 
849  class VlanFilter : public GeneralFilter
850  {
851  private:
852  uint16_t m_VlanID;
853 
854  public:
857  explicit VlanFilter(uint16_t vlanId) : m_VlanID(vlanId)
858  {}
859 
860  void parseToString(std::string& result) const override;
861 
864  void setVlanID(uint16_t vlanId)
865  {
866  m_VlanID = vlanId;
867  invalidateCache();
868  }
869  };
870 
876  {
877  public:
879  enum TcpFlags
880  {
882  tcpFin = 1,
884  tcpSyn = 2,
886  tcpRst = 4,
888  tcpPush = 8,
890  tcpAck = 16,
892  tcpUrg = 32
893  };
894 
898  {
902  MatchOneAtLeast
903  };
904 
905  private:
906  uint8_t m_TcpFlagsBitMask;
907  MatchOptions m_MatchOption;
908 
909  public:
916  TcpFlagsFilter(uint8_t tcpFlagBitMask, MatchOptions matchOption)
917  : m_TcpFlagsBitMask(tcpFlagBitMask), m_MatchOption(matchOption)
918  {}
919 
925  void setTcpFlagsBitMask(uint8_t tcpFlagBitMask, MatchOptions matchOption)
926  {
927  m_TcpFlagsBitMask = tcpFlagBitMask;
928  m_MatchOption = matchOption;
929  invalidateCache();
930  }
931 
932  void parseToString(std::string& result) const override;
933  };
934 
940  {
941  private:
942  uint16_t m_WindowSize;
943 
944  public:
949  TcpWindowSizeFilter(uint16_t windowSize, FilterOperator op) : IFilterWithOperator(op), m_WindowSize(windowSize)
950  {}
951 
952  void parseToString(std::string& result) const override;
953 
956  void setWindowSize(uint16_t windowSize)
957  {
958  m_WindowSize = windowSize;
959  invalidateCache();
960  }
961  };
962 
968  {
969  private:
970  uint16_t m_Length;
971 
972  public:
977  UdpLengthFilter(uint16_t length, FilterOperator op) : IFilterWithOperator(op), m_Length(length)
978  {}
979 
980  void parseToString(std::string& result) const override;
981 
984  void setLength(uint16_t length)
985  {
986  m_Length = length;
987  invalidateCache();
988  }
989  };
990 } // namespace pcpp
constexpr const char * getCompositeLogicOpDelimiter()=delete
Definition: PcapFilter.h:823
ArpFilter(ArpOpcode opCode)
Definition: PcapFilter.h:830
void setOpCode(ArpOpcode opCode)
Definition: PcapFilter.h:837
void parseToString(std::string &result) const override
Definition: PcapFilter.h:202
void parseToString(std::string &result) const override
Definition: PcapFilter.h:81
bool matches(const RawPacket &rawPacket) const
Match a packet with the filter stored in this object.
bool matchPacketWithFilter(const RawPacket *rawPacket) const
BpfFilterWrapper()=default
Creates a new instance with no filter.
bool setFilter(const std::string &filter, LinkLayerType linkType=LINKTYPE_ETHERNET)
Definition: PcapFilter.h:634
CompositeFilter()=default
An empty constructor for this class. Use addFilter() to add filters to the composite filter.
void removeFilter(GeneralFilter *filter)
void addFilter(GeneralFilter *filter)
Definition: PcapFilter.h:648
CompositeFilter(const std::vector< GeneralFilter * > &filters)
void setFilters(const std::vector< GeneralFilter * > &filters)
void clearAllFilters()
Remove all filters from the composite filter.
Definition: PcapFilter.h:663
Definition: PcapFilter.h:702
void parseToString(std::string &result) const override
Definition: PcapFilter.h:706
Definition: PcapFilter.h:607
EtherTypeFilter(uint16_t etherType)
Definition: PcapFilter.h:614
void setEtherType(uint16_t etherType)
Definition: PcapFilter.h:621
void parseToString(std::string &result) const override
Definition: PcapFilter.h:159
virtual void parseToString(std::string &result) const =0
virtual ~GeneralFilter()=default
Virtual destructor, frees the bpf program.
Definition: PcapFilter.h:229
void setDirection(Direction dir)
Definition: PcapFilter.h:247
Definition: PcapFilter.h:260
void setOperator(FilterOperator op)
Definition: PcapFilter.h:278
Definition: IpAddress.h:318
bool isIPv4() const
Definition: IpAddress.h:373
Definition: PcapFilter.h:290
void setMask(const std::string &netmask)
Definition: PcapFilter.h:418
void clearMask()
Clears the subnet mask.
Definition: PcapFilter.h:425
void setAddr(const std::string &ipAddress)
Definition: PcapFilter.h:386
void setLen(const int len)
Definition: PcapFilter.h:435
IPFilter(const IPAddress &ipAddress, Direction dir, int len)
Definition: PcapFilter.h:360
IPFilter(const std::string &ipAddress, Direction dir, const std::string &netmask)
Definition: PcapFilter.h:321
IPFilter(const IPNetwork &network, Direction dir)
Definition: PcapFilter.h:368
void setNetwork(const IPNetwork &network)
Definition: PcapFilter.h:376
IPFilter(const std::string &ipAddress, Direction dir, int len)
Definition: PcapFilter.h:348
void clearLen()
Clears the subnet mask length.
Definition: PcapFilter.h:442
IPFilter(const std::string &ipAddress, Direction dir)
Definition: PcapFilter.h:301
IPFilter(const IPAddress &ipAddress, Direction dir)
Definition: PcapFilter.h:307
IPFilter(const IPAddress &ipAddress, Direction dir, const std::string &netmask)
Definition: PcapFilter.h:334
void setAddr(const IPAddress &ipAddress)
Definition: PcapFilter.h:397
void parseToString(std::string &result) const override
Definition: IpAddress.h:651
IPAddress getNetworkPrefix() const
Definition: IpAddress.h:779
uint8_t getPrefixLen() const
Definition: IpAddress.h:753
Definition: IpAddress.h:30
Definition: PcapFilter.h:455
void parseToString(std::string &result) const override
IPv4IDFilter(uint16_t ipID, FilterOperator op)
Definition: PcapFilter.h:463
void setIpID(uint16_t ipID)
Definition: PcapFilter.h:470
Definition: PcapFilter.h:483
void setTotalLength(uint16_t totalLength)
Definition: PcapFilter.h:499
IPv4TotalLengthFilter(uint16_t totalLength, FilterOperator op)
Definition: PcapFilter.h:491
void parseToString(std::string &result) const override
Definition: PcapFilter.h:579
void setMacAddress(MacAddress const &address)
Definition: PcapFilter.h:594
MacAddressFilter(MacAddress const &address, Direction dir)
Definition: PcapFilter.h:587
void parseToString(std::string &result) const override
Definition: MacAddress.h:24
Definition: PcapFilter.h:745
void parseToString(std::string &result) const override
void setFilter(GeneralFilter *filterToInverse)
Definition: PcapFilter.h:761
NotFilter(GeneralFilter *filterToInverse)
Definition: PcapFilter.h:752
Definition: PcapFilter.h:511
PortFilter(uint16_t port, Direction dir)
void parseToString(std::string &result) const override
void setPort(uint16_t port)
Definition: PcapFilter.h:526
Definition: PcapFilter.h:540
PortRangeFilter(uint16_t fromPort, uint16_t toPort, Direction dir)
Definition: PcapFilter.h:550
void parseToString(std::string &result) const override
void setToPort(uint16_t toPort)
Definition: PcapFilter.h:566
void setFromPort(uint16_t fromPort)
Definition: PcapFilter.h:558
Definition: PcapFilter.h:778
void setProto(ProtocolType proto)
Definition: PcapFilter.h:800
ProtoFilter(ProtocolTypeFamily protoFamily)
Definition: PcapFilter.h:792
void setProto(ProtocolTypeFamily protoFamily)
Definition: PcapFilter.h:810
ProtoFilter(ProtocolType proto)
Definition: PcapFilter.h:786
void parseToString(std::string &result) const override
Definition: RawPacket.h:290
Definition: PcapFilter.h:876
TcpFlags
An enum of all TCP flags that can be use in the filter.
Definition: PcapFilter.h:880
void parseToString(std::string &result) const override
MatchOptions
Definition: PcapFilter.h:898
@ MatchAll
Match only packets that contain all flags defined in the filter.
Definition: PcapFilter.h:900
void setTcpFlagsBitMask(uint8_t tcpFlagBitMask, MatchOptions matchOption)
Definition: PcapFilter.h:925
TcpFlagsFilter(uint8_t tcpFlagBitMask, MatchOptions matchOption)
Definition: PcapFilter.h:916
Definition: PcapFilter.h:940
void setWindowSize(uint16_t windowSize)
Definition: PcapFilter.h:956
void parseToString(std::string &result) const override
TcpWindowSizeFilter(uint16_t windowSize, FilterOperator op)
Definition: PcapFilter.h:949
Definition: PcapFilter.h:968
void setLength(uint16_t length)
Definition: PcapFilter.h:984
void parseToString(std::string &result) const override
UdpLengthFilter(uint16_t length, FilterOperator op)
Definition: PcapFilter.h:977
Definition: PcapFilter.h:850
VlanFilter(uint16_t vlanId)
Definition: PcapFilter.h:857
void setVlanID(uint16_t vlanId)
Definition: PcapFilter.h:864
void parseToString(std::string &result) const override
uint8_t ProtocolType
Definition: ProtocolType.h:37
uint32_t ProtocolTypeFamily
Definition: ProtocolType.h:41
The main namespace for the PcapPlusPlus lib.
Definition: AssertionUtils.h:19
ArpOpcode
An enum for ARP message type.
Definition: ArpLayer.h:45
FilterOperator
Supported operators enum.
Definition: PcapFilter.h:53
@ GREATER_THAN
Greater than.
Definition: PcapFilter.h:59
@ EQUALS
Equals.
Definition: PcapFilter.h:55
@ GREATER_OR_EQUAL
Greater or equal.
Definition: PcapFilter.h:61
@ LESS_THAN
Less than.
Definition: PcapFilter.h:63
@ NOT_EQUALS
Not equals.
Definition: PcapFilter.h:57
@ LESS_OR_EQUAL
Less or equal.
Definition: PcapFilter.h:65
@ PCPP_DEPRECATED
Deprecated typo, use OsiModelSessionLayer instead.
Definition: ProtocolType.h:284
Direction
An enum that contains direction (source or destination)
Definition: PcapFilter.h:42
@ SRC_OR_DST
Source or destination.
Definition: PcapFilter.h:48
@ DST
Destination.
Definition: PcapFilter.h:46
@ SRC
Source.
Definition: PcapFilter.h:44
CompositeLogicFilterOp
Supported composite logic filter operators enum.
Definition: PcapFilter.h:672
@ OR
Logical OR operation.
@ AND
Logical AND operation.
LinkLayerType
An enum describing all known link layer type. Taken from: http://www.tcpdump.org/linktypes....
Definition: RawPacket.h:22
@ LINKTYPE_ETHERNET
IEEE 802.3 Ethernet.
Definition: RawPacket.h:26
Definition: PcapFilter.h:73