Files
openairinterface5g/common/utils/websrv/websrv.h
T

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