blob: 1277798ac2f187bf56d06559a3bde04dbaa4d560 [file] [log] [blame]
Shad Ansari7193ae22018-08-08 22:23:18 +00001/*
2 Copyright (C) 2018 Open Networking Foundation
3
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>
21#include <time.h>
22#include <pthread.h>
23
24#include "Queue.h"
25#include <iostream>
26#include <sstream>
27
28#include "server.h"
29#include "core.h"
30#include "state.h"
31
32#include <grpc++/grpc++.h>
33#include <openolt.grpc.pb.h>
34
35using grpc::Server;
36using grpc::ServerBuilder;
37using grpc::ServerContext;
38using grpc::ServerWriter;
39using grpc::Status;
40
41const char *serverPort = "0.0.0.0:9191";
42int signature;
43
44Queue<openolt::Indication> oltIndQ;
45
46class OpenoltService final : public openolt::Openolt::Service {
47
48 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
62 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(),
70 ((request->serial_number()).vendor_specific()).c_str(),
71 request->pir());
72 }
73
74 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(),
93 ((request->serial_number()).vendor_specific()).c_str());
94 }
95
96 Status OmciMsgOut(
97 ServerContext* context,
98 const openolt::OmciMsg* request,
99 openolt::Empty* response) override {
100 return OmciMsgOut_(
101 request->intf_id(),
102 request->onu_id(),
103 request->pkt());
104 }
105
106 Status OnuPacketOut(
107 ServerContext* context,
108 const openolt::OnuPacket* request,
109 openolt::Empty* response) override {
110 return OnuPacketOut_(
111 request->intf_id(),
112 request->onu_id(),
113 request->pkt());
114 }
115
116 Status UplinkPacketOut(
117 ServerContext* context,
118 const openolt::UplinkPacket* request,
119 openolt::Empty* response) override {
120 return UplinkPacketOut_(
121 request->intf_id(),
122 request->pkt());
123 }
124
125 Status FlowAdd(
126 ServerContext* context,
127 const openolt::Flow* request,
128 openolt::Empty* response) override {
129 return FlowAdd_(
130 request->onu_id(),
131 request->flow_id(),
132 request->flow_type(),
133 request->access_intf_id(),
134 request->network_intf_id(),
135 request->gemport_id(),
136 request->priority(),
137 request->classifier(),
138 request->action());
139 }
140
141 Status EnableIndication(
142 ServerContext* context,
143 const ::openolt::Empty* request,
144 ServerWriter<openolt::Indication>* writer) override {
145 std::cout << "Connection to Voltha established. Indications enabled"
146 << std::endl;
147 state::connect();
148
149 while (state::is_connected) {
150 auto oltInd = oltIndQ.pop();
151 bool isConnected = writer->Write(oltInd);
152 if (!isConnected) {
153 //Lost connectivity to this Voltha instance
154 //Put the indication back in the queue for next connecting instance
155 oltIndQ.push(oltInd);
156 state::disconnect();
157 }
158 //oltInd.release_olt_ind()
159 }
160
161 return Status::OK;
162 }
163
164 Status HeartbeatCheck(
165 ServerContext* context,
166 const openolt::Empty* request,
167 openolt::Heartbeat* response) override {
168 response->set_heartbeat_signature(signature);
169
170 return Status::OK;
171 }
172
173 Status EnablePonIf(
174 ServerContext* context,
175 const openolt::Interface* request,
176 openolt::Empty* response) override {
177
178 return EnablePonIf_(request->intf_id());
179 }
180
181 Status DisablePonIf(
182 ServerContext* context,
183 const openolt::Interface* request,
184 openolt::Empty* response) override {
185
186 return DisablePonIf_(request->intf_id());
187 }
188
189 Status Reboot(
190 ServerContext* context,
191 const openolt::Empty* request,
192 openolt::Empty* response) override {
193
194 //system("shutdown -r now");
195
196 return Status::OK;
197
198 }
199
200
201};
202
203void RunServer() {
204 OpenoltService service;
205 std::string server_address(serverPort);
206 ServerBuilder builder;
207
208 builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
209 builder.RegisterService(&service);
210
211 std::unique_ptr<Server> server(builder.BuildAndStart());
212
213 time_t now;
214 time(&now);
215 signature = (int)now;
216
217 std::cout << "Server listening on " << server_address
218 << ", connection signature : " << signature << std::endl;
219
220
221 server->Wait();
222}