152 lines
7.9 KiB
C
152 lines
7.9 KiB
C
/*
|
|
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership.
|
|
* The OpenAirInterface Software Alliance licenses this file to You under
|
|
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
|
* except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.openairinterface.org/?page_id=698
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*-------------------------------------------------------------------------------
|
|
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
|
* contact@openairinterface.org
|
|
*/
|
|
|
|
/*! \file common/utils/websrv/websrv.h
|
|
* \brief: implementation of web API
|
|
* \author Francois TABURET
|
|
* \date 2022
|
|
* \version 0.1
|
|
* \company NOKIA BellLabs France
|
|
* \email: francois.taburet@nokia-bell-labs.com
|
|
* \note
|
|
* \warning
|
|
*/
|
|
|
|
#ifndef WEBSRV_H
|
|
#define WEBSRV_H
|
|
|
|
#define WEBSRV_MODNAME "websrv"
|
|
|
|
#define WEBSRV_PORT 8090
|
|
|
|
/* websrv_params_t is an internal structure storing all the current parameters and */
|
|
/* global variables used by the web server */
|
|
typedef struct {
|
|
struct _u_instance instance; // ulfius (web server) instance
|
|
struct _websocket_manager *wm; // web socket instance
|
|
unsigned int dbglvl; // debug level of the server
|
|
int priority; // server running priority
|
|
unsigned int listenport; // ip port the telnet server is listening on
|
|
unsigned int listenaddr; // ip address the telnet server is listening on
|
|
unsigned int listenstdin; // enable command input from stdin
|
|
char *fpath; // directory where the server is looking for files (html...)
|
|
char *certfile; // cert file
|
|
char *keyfile; // key file
|
|
char *rootcafile; // root ca file
|
|
void *telnetparams; // pointer to telnet server parameters type is telnetsrv_params_t, don't want to enforce telnet include here
|
|
} websrv_params_t;
|
|
|
|
#define WEBSOCK_SRC_SCOPE 's'
|
|
typedef struct {
|
|
unsigned char src; // message source
|
|
unsigned char msgtype; // message type
|
|
unsigned char msgseg; // message segment number
|
|
unsigned char chartid; // identify chart (scope window)
|
|
unsigned char datasetid; // identify dataset in chart
|
|
unsigned char update; // should chart be updated
|
|
unsigned char hdr_unused[2]; // 2 unused char
|
|
} websrv_msg_hdr_t;
|
|
|
|
typedef struct {
|
|
websrv_msg_hdr_t header;
|
|
char data[1408]; // 64*22
|
|
} websrv_msg_t;
|
|
#define MAX_NIQ_WEBSOCKMSG 180000 // max number of 16 bits iq's in pre-allocated buffer
|
|
#define MAX_LLR_WEBSOCKMSG (MAX_NIQ_WEBSOCKMSG * 2) // max number of 8 bits llr's in pre-allocated buffer
|
|
|
|
typedef struct {
|
|
websrv_msg_hdr_t header;
|
|
int16_t data_xy[MAX_NIQ_WEBSOCKMSG * 2]; // data buffer
|
|
} websrv_scopedata_msg_t;
|
|
#define WEBSOCK_HEADSIZE (offsetof(websrv_msg_t, data))
|
|
|
|
#define SCOPE_STATUSMASK_UNKNOWN 0 // websocket initialized, no scope request received
|
|
#define SCOPE_STATUSMASK_AVAILABLE 1 // scope can be started (available in exec and not started with other if */
|
|
#define SCOPE_STATUSMASK_STARTED 2 // scope running
|
|
#define SCOPE_STATUSMASK_DATAACK 4 // wait for data message acknowledge before sending
|
|
#define SCOPE_STATUSMASK_DISABLED (1LL << 63) // scope disabled (running with xform interface or not implemented in exec)
|
|
|
|
/* values for websocket message type */
|
|
/* websocket softscope message: */
|
|
#define SCOPEMSG_TYPE_TIME 3 // time
|
|
#define SCOPEMSG_TYPE_DATA 10 // graph data
|
|
#define SCOPEMSG_TYPE_DATAACK 11 // graph data reception and processing acknowledge
|
|
#define SCOPEMSG_TYPE_DATAFLOW 12 // feedback to frontend of messages not sent
|
|
|
|
typedef struct {
|
|
uint64_t statusmask; //
|
|
uint32_t refrate; // in 100 ms
|
|
void *scopeform; // OAI_phy_scope_t pointer returned by create_phy_scope_xxx functions
|
|
void *scopedata; // scopeData_t pointer, filled at init time, contains pointers and functions to retrieve softmodem data
|
|
uint32_t selectedTarget; // index to UE/gNB
|
|
int xmin; // iq view data limit
|
|
int xmax;
|
|
int ymin;
|
|
int ymax;
|
|
int llr_ythresh; // llrview llr threshold
|
|
int llrxmin; // llr view x limits
|
|
int llrxmax;
|
|
uint64_t num_datamsg_max; // num_datamsg_xxxx are used to
|
|
uint64_t num_datamsg_sent; // control the data message flow to
|
|
uint64_t num_datamsg_ack; // the frontend, preventing data messages to be sent
|
|
uint64_t num_datamsg_skipped; // when date ack is requested and the the diff between sent and ack obove limit
|
|
} websrv_scope_params_t;
|
|
|
|
/*------------------------------------------------------------------------------------------------*/
|
|
/* web server utilities: */
|
|
|
|
extern void websrv_printjson(char *label, json_t *jsonobj, int dbglvl); // debug: dump a json object
|
|
extern void websrv_jbody(struct _u_response *response, json_t *jbody, int httpstatus, int dbglvl); // add a json body in a http response
|
|
|
|
extern void websrv_printf_start(struct _u_response *response, int buffsize, bool async); // start a printf, lock the buffer
|
|
extern void websrv_printf(const char *message, ...); // add characters in the printf locked buffer
|
|
extern void websrv_async_printf(const char *message, ...); // add characters in the printf locked buffer and terminate the print session
|
|
extern void websrv_printf_end(int httpstatus, int dbglvl); // add the printf buffer in the body of a http response, unlock the buffer
|
|
extern void websrv_dump_request(char *label, const struct _u_request *request, int dbglvl); // debug: dump a http request
|
|
extern int websrv_string_response(char *astring, struct _u_response *response, int httpstatus, int dbglvl); // add a string in a http response
|
|
extern void websrv_utils_build_hlpfiles(char *path); // build files to be downloade by the frontend which cannot be delivered at installation time
|
|
extern char *websrv_read_file(const char *filename); // map a file in a string variable
|
|
extern FILE *websrv_getfile(char *filename, struct _u_response *response); // answer a front-end file upload request
|
|
extern int websrv_utils_testhlp(char *dir, char *module, char *cmdtitle, char *coltitle); // test if a help file exists
|
|
/* webserver API: */
|
|
extern int websrv_init_websocket(websrv_params_t *websrvparams, char *module);
|
|
extern void websrv_websocket_send_message(char msg_src, char msg_type, char *msg_data, struct _websocket_manager *websocket_manager);
|
|
|
|
extern void websrv_websocket_process_scopemessage(char msg_type, char *msg_data, struct _websocket_manager *websocket_manager);
|
|
extern int websrv_callback_okset_softmodem_cmdvar(const struct _u_request *request, struct _u_response *response, void *user_data);
|
|
extern int websrv_add_endpoint(char **http_method,
|
|
int num_method,
|
|
const char *url_prefix,
|
|
const char *url_format,
|
|
int (*callback_function[])(const struct _u_request *request, struct _u_response *response, void *user_data),
|
|
void *user_data);
|
|
|
|
/* scope interface API: */
|
|
extern void websrv_init_scope(websrv_params_t *websrvparams);
|
|
extern void websrv_scope_ws_cb(void *user_data);
|
|
extern int websrv_scope_manager(uint64_t lcount, websrv_params_t *websrvparams);
|
|
extern void websrv_scope_senddata(int numd, int dsize, websrv_scopedata_msg_t *msg);
|
|
extern websrv_scope_params_t *websrv_scope_getparams(void);
|
|
extern void websrv_scope_stop(void);
|
|
|
|
/*-----------------------------------------------------------------------------------------------------------*/
|
|
#endif
|