OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
igmp_proto.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef vnsw_agent_igmp_proto_hpp
6 #define vnsw_agent_igmp_proto_hpp
7 
8 #include "pkt/proto.h"
10 
12 
13 #define IGMP_UNDEFINED 0x10
14 #define IGMP_MEMBERSHIP_QUERY 0x11
15 #define IGMP_V1_MEMBERSHIP_REPORT 0x12
16 #define IGMP_PROTO_DVMRP 0x13
17 #define IGMP_PROTO_PIM 0x14
18 #define IGMP_CISCO_TRACE 0x15
19 #define IGMP_V2_MEMBERSHIP_REPORT 0x16
20 #define IGMP_GROUP_LEAVE 0x17
21 #define IGMP_MTRACE_RESPONSE 0x1e
22 #define IGMP_MTRACE_REQUEST 0x1f
23 #define IGMP_DWR 0x21
24 #define IGMP_V3_MEMBERSHIP_REPORT 0x22
25 #define IGMP_MAX_TYPE IGMP_V3_MEMBERSHIP_REPORT
26 #define IGMP_MIN_PACKET_LENGTH 8
27 
28 #define IGMP_PKT_TRACE(obj, arg) \
29 do { \
30  std::ostringstream _str; \
31  _str << arg; \
32  Igmp##obj::TraceMsg(IgmpTraceBuf, __FILE__, __LINE__, _str.str()); \
33 } while (false) \
34 
35 class Timer;
36 class Interface;
37 
38 namespace IgmpInfo {
39 struct IgmpItfStats {
41  void Reset() {
42  rx_unknown = 0;
43  memset(rx_badpacket, 0x00, sizeof(uint32_t)*IGMP_MAX_TYPE);
44  memset(rx_okpacket, 0x00, sizeof(uint32_t)*IGMP_MAX_TYPE);
45  tx_packet = 0;
46  tx_drop_packet = 0;
47  }
48  uint32_t rx_unknown;
51  uint32_t tx_packet;
52  uint32_t tx_drop_packet;
53 };
54 
56 public:
58  }
59  virtual ~IgmpSubnetState() {}
60 
61  void IncrRxUnknown() {
63  }
64  uint32_t GetRxUnknown() {
65  return stats_.rx_unknown;
66  }
67  void IncrRxBadPkt(unsigned long index) {
68  stats_.rx_badpacket[index-1]++;
69  }
70  uint32_t GetRxBadPkt(unsigned long index) {
71  return stats_.rx_badpacket[index-1];
72  }
73  void IncrRxOkPkt(unsigned long index) {
74  stats_.rx_okpacket[index-1]++;
75  }
76  uint32_t GetRxOkPkt(unsigned long index) {
77  return stats_.rx_okpacket[index-1];
78  }
79  void IncrTxPkt() {
80  stats_.tx_packet++;
81  }
82  uint32_t GetTxPkt() {
83  return stats_.tx_packet;
84  }
85  void IncrTxDropPkt() {
87  }
88  uint32_t GetTxDropPkt() {
89  return stats_.tx_drop_packet;
90  }
91 
92  const IgmpInfo::IgmpItfStats &GetItfStats() const { return stats_; }
93  void ClearItfStats() { stats_.Reset(); }
94 
96 };
97 
98 struct VnIgmpDBState : public DBState {
99 public:
101  }
103 
104  typedef std::map<IpAddress, IgmpSubnetState*> IgmpSubnetStateMap;
106 };
107 
108 struct VmiIgmpDBState : public DBState {
110  }
112 
113  std::string vrf_name_;
114 };
115 }
116 
117 class IgmpProto : public Proto {
118 public:
119 
120  struct IgmpStats {
121  IgmpStats() { Reset(); }
122  void Reset() {
125  }
126 
127  uint32_t bad_length;
128  uint32_t bad_cksum;
129  uint32_t bad_interface;
130  uint32_t not_local;
131  uint32_t rx_unknown;
132  uint32_t rejected_pkt;
133  uint32_t ip_pkt_len;
134  };
135 
136  void Shutdown();
137  IgmpProto(Agent *agent, boost::asio::io_context &io);
138  virtual ~IgmpProto();
139  ProtoHandler *AllocProtoHandler(boost::shared_ptr<PktInfo> info,
140  boost::asio::io_context &io);
141 
142  void IgmpProtoInit(void);
143 
151  const IgmpStats &GetStats() const { return stats_; }
152  void ClearStats() { stats_.Reset(); }
154  bool SendIgmpPacket(const VrfEntry *vrf, IpAddress gmp_addr, GmpPacket *packet);
155  const bool GetItfStats(const VnEntry *vn, IpAddress gateway,
156  IgmpInfo::IgmpItfStats &stats);
157  void ClearItfStats(const VnEntry *vn, IpAddress gateway);
158  void IncrSendStats(const VmInterface *vm_itf, bool tx_done);
159 
161 
162 private:
163  void VnNotify(DBTablePartBase *part, DBEntryBase *entry);
165 
166  void AsyncRead();
167  void ReadHandler(const boost::system::error_code &error, std::size_t len);
168 
169  const std::string task_name_;
170  boost::asio::io_context &io_;
171 
173 
176 
178 };
179 
180 #endif // vnsw_agent_igmp_proto_hpp
Definition: vrf.h:86
DBTableBase::ListenerId vn_listener_id_
Definition: igmp_proto.h:172
void Shutdown()
Definition: igmp_proto.cc:42
bool SendIgmpPacket(const VrfEntry *vrf, IpAddress gmp_addr, GmpPacket *packet)
Definition: igmp_proto.cc:161
boost::asio::ip::address IpAddress
Definition: address.h:13
int ListenerId
Definition: db_table.h:62
boost::asio::io_context & io_
Definition: igmp_proto.h:170
uint32_t rx_okpacket[IGMP_MAX_TYPE]
Definition: igmp_proto.h:50
uint32_t GetRxOkPkt(unsigned long index)
Definition: igmp_proto.h:76
void VnNotify(DBTablePartBase *part, DBEntryBase *entry)
Definition: igmp_proto.cc:57
void AsyncRead()
void ClearStats()
Definition: igmp_proto.h:152
const std::string task_name_
Definition: igmp_proto.h:169
const IgmpStats & GetStats() const
Definition: igmp_proto.h:151
IgmpSubnetStateMap igmp_state_map_
Definition: igmp_proto.h:105
void IncrStatsRxUnknown()
Definition: igmp_proto.h:148
Definition: agent.h:358
void IncrStatsBadLength()
Definition: igmp_proto.h:144
GmpProto * gmp_proto_
Definition: igmp_proto.h:174
virtual ~IgmpProto()
Definition: igmp_proto.cc:19
void IncrSendStats(const VmInterface *vm_itf, bool tx_done)
Definition: igmp_proto.cc:233
uint32_t bad_interface
Definition: igmp_proto.h:129
void IncrRxOkPkt(unsigned long index)
Definition: igmp_proto.h:73
void IncrStatsBadInterface()
Definition: igmp_proto.h:146
void IncrStatsBadCksum()
Definition: igmp_proto.h:145
void ReadHandler(const boost::system::error_code &error, std::size_t len)
Definition: vn.h:151
const bool GetItfStats(const VnEntry *vn, IpAddress gateway, IgmpInfo::IgmpItfStats &stats)
Definition: igmp_proto.cc:265
IgmpProto(Agent *agent, boost::asio::io_context &io)
Definition: igmp_proto.cc:12
uint32_t rx_badpacket[IGMP_MAX_TYPE]
Definition: igmp_proto.h:49
void IncrStatsRejectedPkt()
Definition: igmp_proto.h:149
void Inet4McRouteTableNotify(DBTablePartBase *part, DBEntryBase *entry)
IgmpInfo::IgmpItfStats stats_
Definition: igmp_proto.h:95
uint32_t GetRxBadPkt(unsigned long index)
Definition: igmp_proto.h:70
void ClearItfStats(const VnEntry *vn, IpAddress gateway)
Definition: igmp_proto.cc:293
ProtoHandler * AllocProtoHandler(boost::shared_ptr< PktInfo > info, boost::asio::io_context &io)
Definition: igmp_proto.cc:52
void IgmpProtoInit(void)
Definition: igmp_proto.cc:22
void IncrStatsIpPktLen()
Definition: igmp_proto.h:150
Definition: timer.h:54
void IncrStatsNotLocal()
Definition: igmp_proto.h:147
DISALLOW_COPY_AND_ASSIGN(IgmpProto)
const IgmpInfo::IgmpItfStats & GetItfStats() const
Definition: igmp_proto.h:92
DBTableBase::ListenerId vn_listener_id()
Definition: igmp_proto.cc:156
IgmpStats stats_
Definition: igmp_proto.h:175
std::map< IpAddress, IgmpSubnetState * > IgmpSubnetStateMap
Definition: igmp_proto.h:104
#define IGMP_MAX_TYPE
Definition: igmp_proto.h:25
void IncrRxBadPkt(unsigned long index)
Definition: igmp_proto.h:67
GmpProto * GetGmpProto()
Definition: igmp_proto.h:153