1d4afb5ceSopenharmony_ci/* 2d4afb5ceSopenharmony_ci * lws-minimal-secure-streams-server 3d4afb5ceSopenharmony_ci * 4d4afb5ceSopenharmony_ci * Written in 2010-2020 by Andy Green <andy@warmcat.com> 5d4afb5ceSopenharmony_ci * 6d4afb5ceSopenharmony_ci * This file is made available under the Creative Commons CC0 1.0 7d4afb5ceSopenharmony_ci * Universal Public Domain Dedication. 8d4afb5ceSopenharmony_ci */ 9d4afb5ceSopenharmony_ci 10d4afb5ceSopenharmony_ci#include <libwebsockets.h> 11d4afb5ceSopenharmony_ci#include <assert.h> 12d4afb5ceSopenharmony_ci 13d4afb5ceSopenharmony_ciextern int interrupted, bad; 14d4afb5ceSopenharmony_ci 15d4afb5ceSopenharmony_citypedef struct myss { 16d4afb5ceSopenharmony_ci struct lws_ss_handle *ss; 17d4afb5ceSopenharmony_ci void *opaque_data; 18d4afb5ceSopenharmony_ci /* ... application specific state ... */ 19d4afb5ceSopenharmony_ci 20d4afb5ceSopenharmony_ci lws_sorted_usec_list_t sul; 21d4afb5ceSopenharmony_ci int count; 22d4afb5ceSopenharmony_ci char upgraded; 23d4afb5ceSopenharmony_ci 24d4afb5ceSopenharmony_ci} myss_srv_t; 25d4afb5ceSopenharmony_ci 26d4afb5ceSopenharmony_ci/* 27d4afb5ceSopenharmony_ci * This is the Secure Streams Server RX and TX 28d4afb5ceSopenharmony_ci */ 29d4afb5ceSopenharmony_ci 30d4afb5ceSopenharmony_cistatic lws_ss_state_return_t 31d4afb5ceSopenharmony_cimyss_raw_rx(void *userobj, const uint8_t *buf, size_t len, int flags) 32d4afb5ceSopenharmony_ci{ 33d4afb5ceSopenharmony_ci// myss_srv_t *m = (myss_srv_t *)userobj; 34d4afb5ceSopenharmony_ci 35d4afb5ceSopenharmony_ci lwsl_user("%s: len %d, flags: %d\n", __func__, (int)len, flags); 36d4afb5ceSopenharmony_ci lwsl_hexdump_info(buf, len); 37d4afb5ceSopenharmony_ci 38d4afb5ceSopenharmony_ci /* 39d4afb5ceSopenharmony_ci * If we received the whole message, for our example it means 40d4afb5ceSopenharmony_ci * we are done. 41d4afb5ceSopenharmony_ci */ 42d4afb5ceSopenharmony_ci if (flags & LWSSS_FLAG_EOM) { 43d4afb5ceSopenharmony_ci bad = 0; 44d4afb5ceSopenharmony_ci interrupted = 1; 45d4afb5ceSopenharmony_ci } 46d4afb5ceSopenharmony_ci 47d4afb5ceSopenharmony_ci return 0; 48d4afb5ceSopenharmony_ci} 49d4afb5ceSopenharmony_ci 50d4afb5ceSopenharmony_ci/* this is the callback that mediates sending the incrementing number */ 51d4afb5ceSopenharmony_ci 52d4afb5ceSopenharmony_cistatic void 53d4afb5ceSopenharmony_cispam_sul_cb(struct lws_sorted_usec_list *sul) 54d4afb5ceSopenharmony_ci{ 55d4afb5ceSopenharmony_ci myss_srv_t *m = lws_container_of(sul, myss_srv_t, sul); 56d4afb5ceSopenharmony_ci 57d4afb5ceSopenharmony_ci if (!lws_ss_request_tx(m->ss)) 58d4afb5ceSopenharmony_ci lws_sul_schedule(lws_ss_get_context(m->ss), 0, &m->sul, spam_sul_cb, 59d4afb5ceSopenharmony_ci 100 * LWS_US_PER_MS); 60d4afb5ceSopenharmony_ci} 61d4afb5ceSopenharmony_ci 62d4afb5ceSopenharmony_cistatic lws_ss_state_return_t 63d4afb5ceSopenharmony_cimyss_raw_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len, 64d4afb5ceSopenharmony_ci int *flags) 65d4afb5ceSopenharmony_ci{ 66d4afb5ceSopenharmony_ci myss_srv_t *m = (myss_srv_t *)userobj; 67d4afb5ceSopenharmony_ci 68d4afb5ceSopenharmony_ci *flags = LWSSS_FLAG_SOM | LWSSS_FLAG_EOM; 69d4afb5ceSopenharmony_ci 70d4afb5ceSopenharmony_ci *len = (unsigned int)lws_snprintf((char *)buf, *len, "hello from raw %d\n", m->count++); 71d4afb5ceSopenharmony_ci 72d4afb5ceSopenharmony_ci lws_sul_schedule(lws_ss_get_context(m->ss), 0, &m->sul, spam_sul_cb, 73d4afb5ceSopenharmony_ci 100 * LWS_US_PER_MS); 74d4afb5ceSopenharmony_ci 75d4afb5ceSopenharmony_ci return 0; 76d4afb5ceSopenharmony_ci} 77d4afb5ceSopenharmony_ci 78d4afb5ceSopenharmony_cistatic lws_ss_state_return_t 79d4afb5ceSopenharmony_cimyss_raw_state(void *userobj, void *sh, lws_ss_constate_t state, 80d4afb5ceSopenharmony_ci lws_ss_tx_ordinal_t ack) 81d4afb5ceSopenharmony_ci{ 82d4afb5ceSopenharmony_ci myss_srv_t *m = (myss_srv_t *)userobj; 83d4afb5ceSopenharmony_ci 84d4afb5ceSopenharmony_ci lwsl_user("%s: %p %s, ord 0x%x\n", __func__, m->ss, 85d4afb5ceSopenharmony_ci lws_ss_state_name((int)state), (unsigned int)ack); 86d4afb5ceSopenharmony_ci 87d4afb5ceSopenharmony_ci switch (state) { 88d4afb5ceSopenharmony_ci case LWSSSCS_DISCONNECTED: 89d4afb5ceSopenharmony_ci lws_sul_cancel(&m->sul); 90d4afb5ceSopenharmony_ci break; 91d4afb5ceSopenharmony_ci case LWSSSCS_CONNECTED: 92d4afb5ceSopenharmony_ci return lws_ss_request_tx(m->ss); 93d4afb5ceSopenharmony_ci 94d4afb5ceSopenharmony_ci default: 95d4afb5ceSopenharmony_ci break; 96d4afb5ceSopenharmony_ci } 97d4afb5ceSopenharmony_ci 98d4afb5ceSopenharmony_ci return 0; 99d4afb5ceSopenharmony_ci} 100d4afb5ceSopenharmony_ci 101d4afb5ceSopenharmony_ciconst lws_ss_info_t ssi_server = { 102d4afb5ceSopenharmony_ci .handle_offset = offsetof(myss_srv_t, ss), 103d4afb5ceSopenharmony_ci .opaque_user_data_offset = offsetof(myss_srv_t, opaque_data), 104d4afb5ceSopenharmony_ci .streamtype = "myrawserver", 105d4afb5ceSopenharmony_ci .rx = myss_raw_rx, 106d4afb5ceSopenharmony_ci .tx = myss_raw_tx, 107d4afb5ceSopenharmony_ci .state = myss_raw_state, 108d4afb5ceSopenharmony_ci .user_alloc = sizeof(myss_srv_t), 109d4afb5ceSopenharmony_ci}; 110