OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
vrouter_interface.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2014 Juniper Networks, Inc. All rights reserved.
3  */
4 #ifndef vnsw_agent_pkt_vrouter_pkt_io_hpp
5 #define vnsw_agent_pkt_vrouter_pkt_io_hpp
6 
7 #include "control_interface.h"
8 #include "cmn/agent_stats.h"
9 #include "vr_types.h"
10 #include "vr_defs.h"
11 #include "vr_mpls.h"
12 
13 // VrouterControlInterface is implementation of ControlInterface for platforms
14 // using vrouter. This class assumes agent_hdr defined in
15 // vrouter/include/vr_defs.h is prepended with control information
17 public:
18  static const uint32_t kAgentHdrLen =
19  (sizeof(ether_header) + sizeof(struct agent_hdr));
20 
23  vr_cmd_list_.clear();
24  vr_cmd_params_list_.clear();
25  agent_cmd_list_.clear();
26  }
27 
28  virtual void InitControlInterface() {
29  // Init and populate vector for translating command types from vrouter
30  // to agent
31  vr_cmd_list_.insert(vr_cmd_list_.begin(), MAX_AGENT_HDR_COMMANDS,
33  vr_cmd_list_[AGENT_TRAP_ARP] = AgentHdr::TRAP_ARP;
34  vr_cmd_list_[AGENT_TRAP_L2_PROTOCOLS] = AgentHdr::TRAP_L2_PROTOCOL;
35  vr_cmd_list_[AGENT_TRAP_NEXTHOP] = AgentHdr::TRAP_NEXTHOP;
36  vr_cmd_list_[AGENT_TRAP_RESOLVE] = AgentHdr::TRAP_RESOLVE;
37  vr_cmd_list_[AGENT_TRAP_FLOW_MISS] = AgentHdr::TRAP_FLOW_MISS;
38  vr_cmd_list_[AGENT_TRAP_L3_PROTOCOLS] = AgentHdr::TRAP_L3_PROTOCOLS;
39  vr_cmd_list_[AGENT_TRAP_DIAG] = AgentHdr::TRAP_DIAG;
40  vr_cmd_list_[AGENT_TRAP_SOURCE_MISMATCH] =
42  vr_cmd_list_[AGENT_TRAP_HANDLE_DF] = AgentHdr::TRAP_HANDLE_DF;
43  vr_cmd_list_[AGENT_TRAP_ZERO_TTL] = AgentHdr::TRAP_ZERO_TTL;
44  vr_cmd_list_[AGENT_TRAP_ICMP_ERROR] = AgentHdr::TRAP_ICMP_ERROR;
45  vr_cmd_list_[AGENT_TRAP_FLOW_ACTION_HOLD] = AgentHdr::TRAP_FLOW_ACTION_HOLD;
46  vr_cmd_list_[AGENT_TRAP_TOR_CONTROL_PKT] = AgentHdr::TRAP_TOR_CONTROL_PKT;
47  vr_cmd_list_[AGENT_TRAP_FLOW_ACTION_HOLD] = AgentHdr::TRAP_FLOW_ACTION_HOLD;
48  vr_cmd_list_[AGENT_TRAP_ROUTER_ALERT] = AgentHdr::TRAP_ROUTER_ALERT;
49  vr_cmd_list_[AGENT_TRAP_MAC_LEARN] = AgentHdr::TRAP_MAC_LEARN;
50  vr_cmd_list_[AGENT_TRAP_MAC_MOVE] = AgentHdr::TRAP_MAC_MOVE;
51  vr_cmd_list_[AGENT_TRAP_MAC_IP_LEARNING] = AgentHdr::TRAP_MAC_IP_LEARNING;
52  vr_cmd_list_[AGENT_TRAP_BFD] = AgentHdr::TRAP_BFD;
53  // Init and populate vector for translating command params from vrouter
54  // to agent
55  vr_cmd_params_list_.insert(vr_cmd_params_list_.begin(), MAX_CMD_PARAMS,
59 
60  // Init and populate vector for translating command types from agent
61  // to vrouter
63  MAX_AGENT_HDR_COMMANDS);
64  agent_cmd_list_[AgentHdr::TX_SWITCH] = AGENT_CMD_SWITCH;
65  agent_cmd_list_[AgentHdr::TX_ROUTE] = AGENT_CMD_ROUTE;
66  }
67 
68  // Length of header added by implementation of VrouterControlInterface.
69  // Buffer passed in Send should reserve atleast EncapsulationLength() bytes
70  virtual uint32_t EncapsulationLength() const {
71  return kAgentHdrLen;
72  }
73 
74  int DecodeAgentHdr(AgentHdr *hdr, uint8_t *buff, uint32_t len) {
75  // Enusure sanity of the packet
76  if (len <= kAgentHdrLen) {
80  return 0;
81  }
82 
83  // Decode agent_hdr
84  agent_hdr *vr_agent_hdr =
85  (agent_hdr *) (buff + sizeof(ether_header));
86 
87  hdr->ifindex = ntohs(vr_agent_hdr->hdr_ifindex);
88  hdr->vrf = ntohs(vr_agent_hdr->hdr_vrf);
89  hdr->cmd = VrCmdToAgentCmd(ntohs(vr_agent_hdr->hdr_cmd));
90  hdr->cmd_param = ntohl(vr_agent_hdr->hdr_cmd_param);
91  hdr->nh = ntohl(vr_agent_hdr->hdr_cmd_param_1);
92  hdr->cmd_param_2 = ntohl(vr_agent_hdr->hdr_cmd_param_2);
93  hdr->cmd_param_3 = ntohl(vr_agent_hdr->hdr_cmd_param_3);
94  hdr->cmd_param_4 = ntohl(vr_agent_hdr->hdr_cmd_param_4);
95  hdr->cmd_param_5 = vr_agent_hdr->hdr_cmd_param_5;
96  if (hdr->cmd == AGENT_TRAP_HANDLE_DF) {
97  hdr->mtu = ntohl(vr_agent_hdr->hdr_cmd_param);
98  hdr->flow_index = ntohl(vr_agent_hdr->hdr_cmd_param_1);
99  }
100 
101  return kAgentHdrLen;
102  }
103 
104  // Handle packet received by VrouterControlInterface
105  // Format of packet trapped is OUTER_ETH - AGENT_HDR - PAYLOAD
106  bool Process(const PacketBufferPtr &pkt) {
107  AgentHdr hdr;
108  int agent_hdr_len = 0;
109 
110  agent_hdr_len = DecodeAgentHdr(&hdr, pkt->data(), pkt->data_len());
111  if (agent_hdr_len <= 0) {
112  return false;
113  }
114 
115  pkt->SetOffset(agent_hdr_len);
116  return ControlInterface::Process(hdr, pkt);
117  }
118 
119  int EncodeAgentHdr(uint8_t *buff, const AgentHdr &hdr) {
120  memset(buff, 0, sizeof(agent_hdr));
121 
122  // Add outer ethernet header
123  struct ether_header *eth = (struct ether_header *)buff;
124  eth->ether_shost[ETHER_ADDR_LEN - 1] = 1;
125  eth->ether_dhost[ETHER_ADDR_LEN - 1] = 2;
126  eth->ether_type = htons(ETHERTYPE_IP);
127 
128  // Fill agent_hdr
129  agent_hdr *vr_agent_hdr = (agent_hdr *) (eth + 1);
130  vr_agent_hdr->hdr_ifindex = htons(hdr.ifindex);
131  vr_agent_hdr->hdr_vrf = htons(hdr.vrf);
132  vr_agent_hdr->hdr_cmd = htons(hdr.cmd);
133  vr_agent_hdr->hdr_cmd_param = htonl(hdr.cmd_param);
134  vr_agent_hdr->hdr_cmd_param_1 = htonl(hdr.cmd_param_1);
135  return 0;
136  }
137 
138  // Transmit packet on VrouterControlInterface.
139  // Format of packet after encapsulation is OUTER_ETH - AGENT_HDR - PAYLOAD
140  virtual int Send(const AgentHdr &hdr, const PacketBufferPtr &pkt) {
141  uint16_t agent_hdr_len = kAgentHdrLen;
142  uint8_t *agent_hdr_buff = new uint8_t [agent_hdr_len];
143  EncodeAgentHdr(agent_hdr_buff, hdr);
144 
145  int ret = Send(agent_hdr_buff, agent_hdr_len, pkt);
146  if (ret <= 0)
147  return ret;
148 
149  return ret - sizeof(agent_hdr);
150  }
151 
152  virtual int Send(uint8_t *buff, uint16_t buf_len,
153  const PacketBufferPtr &pkt) = 0;
154 private:
157  if (vr_cmd < vr_cmd_list_.size()) {
158  cmd = vr_cmd_list_[vr_cmd];
159  }
160 
161  return cmd;
162  }
163 
166  if (param < vr_cmd_params_list_.size()) {
167  cmd = vr_cmd_params_list_[param];
168  }
169 
170  return cmd;
171  }
172 
173  uint16_t AgentCmdToVrCmd(AgentHdr::PktCommand agent_cmd) {
174  assert((uint32_t)agent_cmd < agent_cmd_list_.size());
175  return agent_cmd_list_[agent_cmd];
176  }
177 
178  std::vector<AgentHdr::PktCommand> vr_cmd_list_;
179  std::vector<AgentHdr::PktCommandParams> vr_cmd_params_list_;
180  std::vector<uint16_t> agent_cmd_list_;
181 
183 };
184 #endif // vnsw_agent_pkt_vrouter_pkt_io_hpp
boost::shared_ptr< PacketBuffer > PacketBufferPtr
Definition: packet_buffer.h:18
bool Process(const AgentHdr &hdr, const PacketBufferPtr &pkt)
uint32_t ifindex
Definition: pkt_handler.h:180
virtual int Send(const AgentHdr &hdr, const PacketBufferPtr &pkt)
void incr_pkt_exceptions()
Definition: agent_stats.h:128
std::vector< AgentHdr::PktCommand > vr_cmd_list_
AgentStats * stats() const
Definition: agent.cc:881
void incr_pkt_invalid_agent_hdr()
Definition: agent_stats.h:131
uint32_t cmd_param_4
Definition: pkt_handler.h:187
PktHandler * pkt_handler() const
uint8_t cmd_param_5
Definition: pkt_handler.h:188
uint32_t cmd_param_2
Definition: pkt_handler.h:185
void incr_pkt_dropped()
Definition: agent_stats.h:164
Agent * agent() const
Definition: pkt_handler.h:317
uint32_t flow_index
Definition: pkt_handler.h:190
virtual void InitControlInterface()
DISALLOW_COPY_AND_ASSIGN(VrouterControlInterface)
virtual uint32_t EncapsulationLength() const
uint32_t vrf
Definition: pkt_handler.h:181
uint32_t cmd_param_1
Definition: pkt_handler.h:184
uint32_t nh
Definition: pkt_handler.h:189
static const uint32_t kAgentHdrLen
std::vector< AgentHdr::PktCommandParams > vr_cmd_params_list_
int EncodeAgentHdr(uint8_t *buff, const AgentHdr &hdr)
uint16_t AgentCmdToVrCmd(AgentHdr::PktCommand agent_cmd)
AgentHdr::PktCommandParams VrCmdParamtoAgentCmdParam(uint16_t param)
bool Process(const PacketBufferPtr &pkt)
uint32_t cmd_param_3
Definition: pkt_handler.h:186
std::vector< uint16_t > agent_cmd_list_
uint32_t cmd_param
Definition: pkt_handler.h:183
AgentHdr::PktCommand VrCmdToAgentCmd(uint16_t vr_cmd)
uint16_t cmd
Definition: pkt_handler.h:182
uint16_t mtu
Definition: pkt_handler.h:191
int DecodeAgentHdr(AgentHdr *hdr, uint8_t *buff, uint32_t len)