blob: e40f0cff9cfeba8f3de94c3f00eada462bae8166 [file] [log] [blame]
Shad Ansari01b0e652018-04-05 21:02:53 +00001/*
nick7be062f2018-05-25 17:52:56 -04002 Copyright (C) 2018 Open Networking Foundation
Shad Ansari01b0e652018-04-05 21:02:53 +00003
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>.
16*/
17
18#include <iostream>
19#include <memory>
20#include <string>
nick7be062f2018-05-25 17:52:56 -040021#include <time.h>
Nicolas Palpacuer0f19b1a2018-06-07 17:29:31 -040022#include <pthread.h>
Shad Ansari01b0e652018-04-05 21:02:53 +000023
24#include "Queue.h"
25#include <iostream>
26#include <sstream>
27
28#include "server.h"
Shad Ansarib7b0ced2018-05-11 21:53:32 +000029#include "core.h"
Nicolas Palpacuer3cad49d2018-07-02 14:03:24 -040030#include "state.h"
Shad Ansari01b0e652018-04-05 21:02:53 +000031
Shad Ansarib7b0ced2018-05-11 21:53:32 +000032#include <grpc++/grpc++.h>
Shad Ansari01b0e652018-04-05 21:02:53 +000033#include <openolt.grpc.pb.h>
34
35using grpc::Server;
36using grpc::ServerBuilder;
37using grpc::ServerContext;
38using grpc::ServerWriter;
Shad Ansarib7b0ced2018-05-11 21:53:32 +000039using grpc::Status;
Shad Ansari01b0e652018-04-05 21:02:53 +000040
41const char *serverPort = "0.0.0.0:9191";
nick7be062f2018-05-25 17:52:56 -040042int signature;
Shad Ansari01b0e652018-04-05 21:02:53 +000043
Shad Ansari627b5782018-08-13 22:49:32 +000044Queue<openolt::Indication> oltIndQ;
45
Shad Ansari01b0e652018-04-05 21:02:53 +000046class OpenoltService final : public openolt::Openolt::Service {
47
Nicolas Palpacuere3fc0d22018-08-02 16:51:05 -040048 Status DisableOlt(
49 ServerContext* context,
50 const openolt::Empty* request,
51 openolt::Empty* response) override {
52 return Disable_();
53 }
54
55 Status ReenableOlt(
56 ServerContext* context,
57 const openolt::Empty* request,
58 openolt::Empty* response) override {
59 return Reenable_();
60 }
61
Shad Ansari01b0e652018-04-05 21:02:53 +000062 Status ActivateOnu(
63 ServerContext* context,
64 const openolt::Onu* request,
65 openolt::Empty* response) override {
66 return ActivateOnu_(
67 request->intf_id(),
68 request->onu_id(),
69 ((request->serial_number()).vendor_id()).c_str(),
Shad Ansari06101952018-07-25 00:22:09 +000070 ((request->serial_number()).vendor_specific()).c_str(),
Girish Gowdru0ffa48b2018-09-26 01:55:29 -070071 request->pir(), request->alloc_id());
Shad Ansari01b0e652018-04-05 21:02:53 +000072 }
73
Jonathan Davis70c21812018-07-19 15:32:10 -040074 Status DeactivateOnu(
75 ServerContext* context,
76 const openolt::Onu* request,
77 openolt::Empty* response) override {
78 return DeactivateOnu_(
79 request->intf_id(),
80 request->onu_id(),
81 ((request->serial_number()).vendor_id()).c_str(),
82 ((request->serial_number()).vendor_specific()).c_str());
83 }
84
85 Status DeleteOnu(
86 ServerContext* context,
87 const openolt::Onu* request,
88 openolt::Empty* response) override {
89 return DeleteOnu_(
90 request->intf_id(),
91 request->onu_id(),
92 ((request->serial_number()).vendor_id()).c_str(),
Girish Gowdru1cdf6ce2018-08-27 02:43:02 -070093 ((request->serial_number()).vendor_specific()).c_str(),
Girish Gowdru0ffa48b2018-09-26 01:55:29 -070094 request->alloc_id());
Jonathan Davis70c21812018-07-19 15:32:10 -040095 }
96
Shad Ansari01b0e652018-04-05 21:02:53 +000097 Status OmciMsgOut(
98 ServerContext* context,
99 const openolt::OmciMsg* request,
100 openolt::Empty* response) override {
101 return OmciMsgOut_(
102 request->intf_id(),
103 request->onu_id(),
104 request->pkt());
105 }
106
Shad Ansarif2e27a42018-04-26 22:37:38 +0000107 Status OnuPacketOut(
108 ServerContext* context,
109 const openolt::OnuPacket* request,
110 openolt::Empty* response) override {
111 return OnuPacketOut_(
112 request->intf_id(),
113 request->onu_id(),
114 request->pkt());
115 }
116
Nicolas Palpacuerb78def42018-06-07 12:55:26 -0400117 Status UplinkPacketOut(
118 ServerContext* context,
119 const openolt::UplinkPacket* request,
120 openolt::Empty* response) override {
121 return UplinkPacketOut_(
122 request->intf_id(),
123 request->pkt());
124 }
125
Shad Ansari01b0e652018-04-05 21:02:53 +0000126 Status FlowAdd(
127 ServerContext* context,
128 const openolt::Flow* request,
129 openolt::Empty* response) override {
130 return FlowAdd_(
131 request->onu_id(),
132 request->flow_id(),
133 request->flow_type(),
134 request->access_intf_id(),
135 request->network_intf_id(),
136 request->gemport_id(),
Girish Gowdru1cdf6ce2018-08-27 02:43:02 -0700137 request->alloc_id(),
Nicolas Palpacuerd6cf5aa2018-07-16 15:14:39 -0400138 request->priority(),
Shad Ansari01b0e652018-04-05 21:02:53 +0000139 request->classifier(),
140 request->action());
141 }
142
Nicolas Palpacueredfaa0c2018-07-05 15:05:27 -0400143 Status FlowRemove(
144 ServerContext* context,
145 const openolt::Flow* request,
146 openolt::Empty* response) override {
147 return FlowRemove_(
148 request->flow_id(),
149 request->flow_type());
150 }
151
Shad Ansari01b0e652018-04-05 21:02:53 +0000152 Status EnableIndication(
153 ServerContext* context,
154 const ::openolt::Empty* request,
155 ServerWriter<openolt::Indication>* writer) override {
Shad Ansariedef2132018-08-10 22:14:50 +0000156
nick7be062f2018-05-25 17:52:56 -0400157 std::cout << "Connection to Voltha established. Indications enabled"
158 << std::endl;
Nicolas Palpacuer3cad49d2018-07-02 14:03:24 -0400159
Nicolas Palpacuerfbc0d7d2018-08-23 14:46:42 -0400160 if (state.previsouly_connected()) {
161 // Reconciliation / recovery case
Nicolas Palpacuer135ce812018-08-30 09:04:34 -0400162 std::cout << "Reconciliation / Recovery case" << std::endl;
Nicolas Palpacuerfbc0d7d2018-08-23 14:46:42 -0400163 if (state.is_activated()){
164 // Adding extra olt indication of current state
165 openolt::Indication ind;
166 openolt::OltIndication* oltInd = new openolt::OltIndication();
167 if (state.is_activated()) {
168 oltInd->set_oper_state("up");
Nicolas Palpacuer135ce812018-08-30 09:04:34 -0400169 std::cout << "Extra OLT indication up" << std::endl;
Nicolas Palpacuerfbc0d7d2018-08-23 14:46:42 -0400170 } else {
171 oltInd->set_oper_state("down");
Nicolas Palpacuer135ce812018-08-30 09:04:34 -0400172 std::cout << "Extra OLT indication down" << std::endl;
Nicolas Palpacuerfbc0d7d2018-08-23 14:46:42 -0400173 }
174 ind.set_allocated_olt_ind(oltInd);
175 oltIndQ.push(ind);
176 }
177 }
178
Shad Ansariedef2132018-08-10 22:14:50 +0000179 state.connect();
180
181 while (state.is_connected()) {
182 std::pair<openolt::Indication, bool> ind = oltIndQ.pop(COLLECTION_PERIOD);
183 if (ind.second == false) {
184 /* timeout - do lower priority periodic stuff like stats */
185 stats_collection();
186 continue;
187 }
188 openolt::Indication oltInd = ind.first;
Nicolas Palpacuer3cad49d2018-07-02 14:03:24 -0400189 bool isConnected = writer->Write(oltInd);
Nicolas Palpacuer58d252c2018-06-06 11:19:04 -0400190 if (!isConnected) {
191 //Lost connectivity to this Voltha instance
192 //Put the indication back in the queue for next connecting instance
193 oltIndQ.push(oltInd);
Shad Ansariedef2132018-08-10 22:14:50 +0000194 state.disconnect();
Nicolas Palpacuer58d252c2018-06-06 11:19:04 -0400195 }
Shad Ansari01b0e652018-04-05 21:02:53 +0000196 //oltInd.release_olt_ind()
197 }
Nicolas Palpacuer3cad49d2018-07-02 14:03:24 -0400198
Shad Ansari01b0e652018-04-05 21:02:53 +0000199 return Status::OK;
200 }
nick7be062f2018-05-25 17:52:56 -0400201
202 Status HeartbeatCheck(
203 ServerContext* context,
204 const openolt::Empty* request,
205 openolt::Heartbeat* response) override {
206 response->set_heartbeat_signature(signature);
207
208 return Status::OK;
209 }
Nicolas Palpacuer0f19b1a2018-06-07 17:29:31 -0400210
Nicolas Palpacuer05ea0ea2018-07-06 11:47:21 -0400211 Status EnablePonIf(
212 ServerContext* context,
213 const openolt::Interface* request,
214 openolt::Empty* response) override {
215
216 return EnablePonIf_(request->intf_id());
217 }
218
219 Status DisablePonIf(
220 ServerContext* context,
221 const openolt::Interface* request,
222 openolt::Empty* response) override {
223
224 return DisablePonIf_(request->intf_id());
225 }
Nicolas Palpacuer0f19b1a2018-06-07 17:29:31 -0400226
Nicolas Palpacuer65d04472018-09-06 15:53:37 -0400227 Status CollectStatistics(
228 ServerContext* context,
229 const openolt::Empty* request,
230 openolt::Empty* response) override {
231
232 stats_collection();
233
234 return Status::OK;
235 }
236
Nicolas Palpacuer45180662018-08-02 14:01:51 -0400237 Status Reboot(
238 ServerContext* context,
239 const openolt::Empty* request,
240 openolt::Empty* response) override {
241
242 system("shutdown -r now");
243
244 return Status::OK;
245
246 }
247
Nicolas Palpacuerdff96792018-09-06 14:59:32 -0400248 Status GetDeviceInfo(
249 ServerContext* context,
250 const openolt::Empty* request,
251 openolt::DeviceInfo* response) override {
252
253 GetDeviceInfo_(response);
254
255 return Status::OK;
256
257 }
258
259
Nicolas Palpacuer45180662018-08-02 14:01:51 -0400260
Shad Ansari01b0e652018-04-05 21:02:53 +0000261};
262
263void RunServer() {
264 OpenoltService service;
265 std::string server_address(serverPort);
266 ServerBuilder builder;
267
268 builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
269 builder.RegisterService(&service);
270
271 std::unique_ptr<Server> server(builder.BuildAndStart());
272
nick7be062f2018-05-25 17:52:56 -0400273 time_t now;
274 time(&now);
275 signature = (int)now;
276
277 std::cout << "Server listening on " << server_address
278 << ", connection signature : " << signature << std::endl;
279
Shad Ansari01b0e652018-04-05 21:02:53 +0000280
281 server->Wait();
282}