OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
kstate_handler.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #include "kstate.h"
6 #include "interface_kstate.h"
7 #include "route_kstate.h"
8 #include "nh_kstate.h"
9 #include "mpls_kstate.h"
10 #include "flow_kstate.h"
11 #include "mirror_kstate.h"
12 #include "vxlan_kstate.h"
13 #include "vrf_assign_kstate.h"
14 #include "vrf_stats_kstate.h"
15 #include "drop_stats_kstate.h"
17 #include "qos_config_kstate.h"
18 #include "vrf_kstate.h"
19 
20 void KInterfaceReq::HandleRequest() const {
21  vr_interface_req req;
22  KInterfaceResp *resp = new KInterfaceResp();
23  resp->set_context(context());
24 
25  InterfaceKState *kstate = new InterfaceKState(resp, context(), req,
26  get_if_id());
27  kstate->EncodeAndSend(req);
28 }
29 
30 void KRouteReq::HandleRequest() const {
31  vr_route_req req;
32  int prefix_size, family_id;
33  std::string family = get_family();
34 
35  if(family == "inet6") {
36  prefix_size = 16;
37  family_id = AF_INET6;
38  } else if(family == "bridge") {
39  prefix_size = 6;
40  family_id = AF_BRIDGE;
41  } else if(family == "inet") {
42  prefix_size = 4;
43  family_id = AF_INET;
44  } else {
45  std::string msg("Allowed options for family are inet, inet6, bridge");
46  ErrResp *resp = new ErrResp();
47  resp->set_resp(msg);
48  resp->set_context(context());
49  resp->Response();
50  return;
51  }
52 
53  std::vector<int8_t> marker(prefix_size, 0);
54  if(family_id == AF_BRIDGE) {
55  req.set_rtr_mac(marker);
56  } else {
57  // rtr_prefix needs to be initialized
58  req.set_rtr_prefix(marker);
59  req.set_rtr_marker_plen(0);
60  }
61  req.set_rtr_marker(marker);
62  KRouteResp *resp = new KRouteResp();
63  resp->set_context(context());
64 
65  RouteKState *kstate = new RouteKState(resp, context(), req, get_vrf_id(), family_id, sandesh_op::DUMP, prefix_size);
66  kstate->EncodeAndSend(req);
67 }
68 
69 void KRouteGetReq::HandleRequest() const {
70  vr_route_req req;
71  int family_id, prefix_size;
72  boost::system::error_code ec;
73  IpAddress addr(IpAddress::from_string(get_prefix(), ec));
74 
75  if(addr.is_v4()) {
76  family_id = AF_INET;
77  prefix_size = 4;
78  Ip4Address::bytes_type bytes = addr.to_v4().to_bytes();
79  std::vector<int8_t> rtr_prefix(bytes.begin(), bytes.end());
80  req.set_rtr_prefix(rtr_prefix);
81  } else if(addr.is_v6()) {
82  family_id = AF_INET6;
83  prefix_size = 16;
84  Ip6Address::bytes_type bytes = addr.to_v6().to_bytes();
85  std::vector<int8_t> rtr_prefix(bytes.begin(), bytes.end());
86  req.set_rtr_prefix(rtr_prefix);
87  } else {
88  std::string msg("Allowed options for family are inet, inet6");
89  ErrResp *resp = new ErrResp();
90  resp->set_resp(msg);
91  resp->set_context(context());
92  resp->Response();
93  return;
94  }
95  std::vector<int8_t> marker(prefix_size, 0);
96  // rtr_prefix needs to be initialized
97  req.set_rtr_marker(marker);
98  req.set_rtr_marker_plen(0);
99  req.set_rtr_prefix_len(get_prefix_len());
100  KRouteResp *resp = new KRouteResp();
101  resp->set_context(context());
102 
103  RouteKState *kstate = new RouteKState(resp, context(), req, get_vrf_id(), family_id, sandesh_op::GET, 0);
104  kstate->EncodeAndSend(req);
105 }
106 
107 void KNHReq::HandleRequest() const {
108  vr_nexthop_req req;
109  KNHResp *resp = new KNHResp();
110  resp->set_context(context());
111 
112  NHKState *kstate = new NHKState(resp, context(), req, get_nh_id());
113  kstate->EncodeAndSend(req);
114 }
115 
116 void KMplsReq::HandleRequest() const {
117  vr_mpls_req req;
118  KMplsResp *resp = new KMplsResp();
119  resp->set_context(context());
120 
121  MplsKState *kstate = new MplsKState(resp, context(), req, get_mpls_label());
122  kstate->EncodeAndSend(req);
123 }
124 
125 void NextKFlowReq::HandleRequest() const {
126  FlowKState *task = new FlowKState(Agent::GetInstance(), context(),
127  get_flow_handle());
128  vector<string> tokens;
129  boost::split(tokens, get_flow_handle(), boost::is_any_of(" "));
130  if (tokens.size() == 2) {
131  task->set_evicted_flag(true);
132  }
134  scheduler->Enqueue(task);
135 }
136 
137 void KFlowReq::HandleRequest() const {
138  FlowKState *task = new FlowKState(Agent::GetInstance(), context(),
139  get_flow_idx());
140  task->set_evicted_flag(get_show_evicted());
142  scheduler->Enqueue(task);
143 }
144 
145 void KMirrorReq::HandleRequest() const {
146  vr_mirror_req req;
147  KMirrorResp *resp = new KMirrorResp();
148  resp->set_context(context());
149 
150  MirrorKState *kstate = new MirrorKState(resp, context(), req,
151  get_mirror_id());
152  kstate->EncodeAndSend(req);
153 }
154 
155 void KVrfAssignReq::HandleRequest() const {
156  vr_vrf_assign_req req;
157  KVrfAssignResp *resp = new KVrfAssignResp();
158  resp->set_context(context());
159 
160  VrfAssignKState *kstate = new VrfAssignKState(resp, context(), req,
161  get_vif_index());
162  kstate->EncodeAndSend(req);
163 }
164 
165 void KVrfReq::HandleRequest() const {
166  vr_vrf_req req;
167  KVrfResp *resp = new KVrfResp();
168  resp->set_context(context());
169 
170  VrfKState *kstate = new VrfKState(resp, context(), req,
171  get_vrf_idx());
172  kstate->EncodeAndSend(req);
173 }
174 
175 void KVrfStatsReq::HandleRequest() const {
176  vr_vrf_stats_req req;
177  KVrfStatsResp *resp = new KVrfStatsResp();
178  resp->set_context(context());
179 
180  VrfStatsKState *kstate = new VrfStatsKState(resp, context(), req,
181  get_vrf_index());
182  kstate->EncodeAndSend(req);
183 }
184 
185 void KDropStatsReq::HandleRequest() const {
186  vr_drop_stats_req req;
187  KDropStatsResp *resp = new KDropStatsResp();
188  resp->set_context(context());
189 
190  DropStatsKState *kstate = new DropStatsKState(resp, context(), req);
191  kstate->EncodeAndSend(req);
192 }
193 
194 void KVxLanReq::HandleRequest() const {
195  vr_vxlan_req req;
196  KVxLanResp *resp = new KVxLanResp();
197  resp->set_context(context());
198 
199  VxLanKState *kstate = new VxLanKState(resp, context(), req,
200  get_vxlan_label());
201  kstate->EncodeAndSend(req);
202 }
203 
204 void KQosConfigReq::HandleRequest() const {
205 
206  vr_qos_map_req req;
207  KQosConfigResp *resp = new KQosConfigResp();
208  resp->set_context(context());
209 
210  QosConfigKState *kstate = new QosConfigKState(resp, context(), req,
211  get_index());
212  kstate->EncodeAndSend(req);
213 }
214 
215 void KForwardingClassReq::HandleRequest() const {
216  vr_fc_map_req req;
217  KForwardingClassResp *resp = new KForwardingClassResp();
218  resp->set_context(context());
219 
220  ForwardingClassKState *kstate = new ForwardingClassKState(resp, context(),
221  req,
222  get_index());
223  kstate->EncodeAndSend(req);
224 }
static Agent * GetInstance()
Definition: agent.h:436
The TaskScheduler keeps track of what tasks are currently schedulable. When a task is enqueued it is ...
Definition: task.h:178
void set_evicted_flag(bool show_evicted)
Definition: flow_kstate.h:19
boost::asio::ip::address IpAddress
Definition: address.h:13
Definition: task_int.h:10
static TaskScheduler * GetInstance()
Definition: task.cc:547
void Enqueue(Task *task)
Enqueues a task for running. Starts task if all policy rules are met else puts task in waitq...
Definition: task.cc:636
void EncodeAndSend(Sandesh &encoder)
Definition: kstate.cc:63