Lines Matching refs:wsi

28 lws_wsi_tag(struct lws *wsi)
30 if (!wsi)
31 return "[null wsi]";
32 return lws_lc_tag(&wsi->lc);
36 void lwsi_set_role(struct lws *wsi, lws_wsi_state_t role)
38 wsi->wsistate = (wsi->wsistate & (~LWSI_ROLE_MASK)) | role;
40 lwsl_wsi_debug(wsi, "state 0x%lx", (unsigned long)wsi->wsistate);
43 void lwsi_set_state(struct lws *wsi, lws_wsi_state_t lrs)
45 lws_wsi_state_t old = wsi->wsistate;
47 wsi->wsistate = (old & (unsigned int)(~LRS_MASK)) | lrs;
49 lwsl_wsi_debug(wsi, "lwsi_set_state 0x%lx -> 0x%lx",
50 (unsigned long)old, (unsigned long)wsi->wsistate);
58 struct lws *wsi = (struct lws *)obj;
61 lws_wsi_tag(wsi));
65 lws_vhost_bind_wsi(struct lws_vhost *vh, struct lws *wsi)
67 if (wsi->a.vhost == vh)
71 wsi->a.vhost = vh;
75 lwsl_wsi_info(wsi, "in use");
83 lwsl_wsi_debug(wsi, "vh %s: wsi %s/%s, count_bound_wsi %d\n",
84 vh->name, wsi->role_ops ? wsi->role_ops->name : "none",
85 wsi->a.protocol ? wsi->a.protocol->name : "none",
87 assert(wsi->a.vhost->count_bound_wsi > 0);
93 __lws_vhost_unbind_wsi(struct lws *wsi)
95 struct lws_vhost *vh = wsi->a.vhost;
100 lws_context_assert_lock_held(wsi->a.context);
112 lwsl_wsi_debug(wsi, "vh %s: count_bound_wsi %d",
119 * We have closed all wsi that were bound to this vhost
120 * by any pt: nothing can be servicing any wsi belonging
127 wsi->a.vhost = NULL;
131 lws_get_network_wsi(struct lws *wsi)
133 if (!wsi)
137 if (!wsi->mux_substream
139 && !wsi->client_mux_substream
142 return wsi;
144 while (wsi->mux.parent_wsi)
145 wsi = wsi->mux.parent_wsi;
148 return wsi;
170 struct lws *wsi;
174 wsi = wsi_from_fd(context, pt->fds[n].fd);
175 if (!wsi)
177 if (wsi->a.protocol == protocol)
178 protocol->callback(wsi,
180 wsi->user_space, NULL, 0);
189 lws_evlib_wsi_to_evlib_pt(struct lws *wsi)
191 struct lws_context_per_thread *pt = &wsi->a.context->pt[(int)wsi->tsi];
212 struct lws *wsi;
216 wsi = wsi_from_fd(context, pt->fds[n].fd);
217 if (!wsi)
219 if (wsi->a.vhost == vh && (wsi->a.protocol == protocol ||
221 wsi->a.protocol->callback(wsi, (enum lws_callback_reasons)reason,
222 wsi->user_space, argp, len);
238 lws_callback_vhost_protocols(struct lws *wsi, int reason, void *in, size_t len)
242 for (n = 0; n < wsi->a.vhost->count_protocols; n++)
243 if (wsi->a.vhost->protocols[n].callback(wsi, (enum lws_callback_reasons)reason, NULL, in, len))
257 struct lws *wsi = lws_container_of(s, struct lws, sul_fault_timedclose);
259 lwsl_wsi_warn(wsi, "force-closing");
260 lws_wsi_close(wsi, LWS_TO_KILL_ASYNC);
266 lws_wsi_fault_timedclose(struct lws *wsi)
270 if (!lws_fi(&wsi->fic, "timedclose"))
273 if (lws_fi_range(&wsi->fic, "timedclose_ms", &u))
276 lwsl_wsi_warn(wsi, "injecting close in %ums", (unsigned int)u);
277 lws_sul_schedule(wsi->a.context, wsi->tsi, &wsi->sul_fault_timedclose,
294 struct lws *wsi;
304 wsi = lws_zalloc(s, __func__);
306 if (!wsi) {
312 wsi->lc.log_cx = log_cx_template;
314 wsi->lc.log_cx = context->log_cx;
317 wsi->evlib_wsi = (uint8_t *)wsi + sizeof(*wsi);
319 wsi->a.context = context;
320 lws_role_transition(wsi, 0, LRS_UNCONNECTED, ops);
321 wsi->pending_timeout = NO_PENDING_TIMEOUT;
322 wsi->a.protocol = NULL;
323 wsi->tsi = (char)tsi;
324 wsi->a.vhost = NULL;
325 wsi->desc.sockfd = LWS_SOCK_INVALID;
326 wsi->position_in_fds_table = LWS_NO_FDS_POS;
329 lws_xos_init(&wsi->fic.xos, lws_xos(&context->fic.xos));
332 lws_fi_inherit_copy(&wsi->fic, &context->fic, "wsi", NULL);
334 if (lws_fi(&wsi->fic, "createfail")) {
335 lws_fi_destroy(&wsi->fic);
336 lws_free(wsi);
340 return wsi;
344 lws_wsi_inject_to_loop(struct lws_context_per_thread *pt, struct lws *wsi)
351 if (pt->context->event_loop_ops->sock_accept(wsi))
354 if (__insert_wsi_socket_into_fds(pt->context, wsi))
366 * Take a copy of wsi->desc.sockfd before calling this, then close it
371 lws_wsi_extract_from_loop(struct lws *wsi)
373 if (lws_socket_is_valid(wsi->desc.sockfd))
374 __remove_wsi_socket_from_fds(wsi);
376 if (!wsi->a.context->event_loop_ops->destroy_wsi &&
377 wsi->a.context->event_loop_ops->wsi_logical_close) {
378 wsi->a.context->event_loop_ops->wsi_logical_close(wsi);
382 if (wsi->a.context->event_loop_ops->destroy_wsi)
383 wsi->a.context->event_loop_ops->destroy_wsi(wsi);
393 struct lws *wsi = lws_zalloc(sizeof(*wsi), "fake wsi");
395 if (!wsi)
398 wsi->a.context = vh->context;
399 lws_vhost_bind_wsi(vh, wsi);
401 for (n = 0; n < wsi->a.vhost->count_protocols; n++) {
402 wsi->a.protocol = &vh->protocols[n];
403 if (wsi->a.protocol->callback(wsi, (enum lws_callback_reasons)reason, NULL, in, len)) {
404 lws_free(wsi);
409 lws_free(wsi);
416 lws_rx_flow_control(struct lws *wsi, int _enable)
418 struct lws_context_per_thread *pt = &wsi->a.context->pt[(int)wsi->tsi];
422 if (lwsi_role_h2(wsi) || wsi->mux_substream ||
423 lwsi_role_h2_ENCAPSULATION(wsi))
426 lwsl_wsi_info(wsi, "0x%x", _enable);
442 wsi->rxflow_bitmap = (uint8_t)(wsi->rxflow_bitmap & ~(en & 0xff));
444 wsi->rxflow_bitmap = (uint8_t)(wsi->rxflow_bitmap | (en & 0xff));
446 if ((LWS_RXFLOW_PENDING_CHANGE | (!wsi->rxflow_bitmap)) ==
447 wsi->rxflow_change_to)
450 wsi->rxflow_change_to = LWS_RXFLOW_PENDING_CHANGE |
451 (!wsi->rxflow_bitmap);
453 lwsl_wsi_info(wsi, "bitmap 0x%x: en 0x%x, ch 0x%x",
454 wsi->rxflow_bitmap, en, wsi->rxflow_change_to);
457 !wsi->rxflow_will_be_applied) {
458 en = __lws_rx_flow_control(wsi);
475 struct lws *wsi;
480 wsi = wsi_from_fd(context, pt->fds[n].fd);
481 if (!wsi)
483 if (wsi->a.protocol == protocol)
484 lws_rx_flow_control(wsi, LWS_RXFLOW_ALLOW);
491 struct lws *wsi,
497 wsi->rxflow_will_be_applied = 1;
498 n = callback_function(wsi, reason, user, in, len);
499 wsi->rxflow_will_be_applied = 0;
501 n = __lws_rx_flow_control(wsi);
507 __lws_rx_flow_control(struct lws *wsi)
509 struct lws *wsic = wsi->child_list;
512 if (lwsi_role_h2(wsi) || wsi->mux_substream ||
513 lwsi_role_h2_ENCAPSULATION(wsi))
525 if (!(wsi->rxflow_change_to & LWS_RXFLOW_PENDING_CHANGE))
529 if (lws_buflist_next_segment_len(&wsi->buflist, NULL)) {
531 lws_callback_on_writable(wsi);
537 wsi->rxflow_change_to &= (~LWS_RXFLOW_PENDING_CHANGE) & 3;
539 lwsl_wsi_info(wsi, "rxflow: change_to %d",
540 wsi->rxflow_change_to & LWS_RXFLOW_ALLOW);
542 /* adjust the pollfd for this wsi */
544 if (wsi->rxflow_change_to & LWS_RXFLOW_ALLOW) {
545 lwsl_wsi_info(wsi, "reenable POLLIN");
546 // lws_buflist_describe(&wsi->buflist, NULL, __func__);
547 if (__lws_change_pollfd(wsi, 0, LWS_POLLIN)) {
548 lwsl_wsi_info(wsi, "fail");
552 if (__lws_change_pollfd(wsi, LWS_POLLIN, 0))
560 lws_get_protocol(struct lws *wsi)
562 return wsi->a.protocol;
567 lws_ensure_user_space(struct lws *wsi)
569 if (!wsi->a.protocol)
574 if (wsi->a.protocol->per_session_data_size && !wsi->user_space) {
575 wsi->user_space = lws_zalloc(
576 wsi->a.protocol->per_session_data_size, "user space");
577 if (wsi->user_space == NULL) {
578 lwsl_wsi_err(wsi, "OOM");
582 lwsl_wsi_debug(wsi, "protocol pss %lu, user_space=%p",
583 (long)wsi->a.protocol->per_session_data_size,
584 wsi->user_space);
589 lws_adjust_protocol_psds(struct lws *wsi, size_t new_size)
591 ((struct lws_protocols *)lws_get_protocol(wsi))->per_session_data_size =
594 if (lws_ensure_user_space(wsi))
597 return wsi->user_space;
601 lws_get_tsi(struct lws *wsi)
603 return (int)wsi->tsi;
607 lws_is_ssl(struct lws *wsi)
610 return wsi->tls.use_ssl & LCCSCF_USE_SSL;
612 (void)wsi;
619 lws_get_ssl(struct lws *wsi)
621 return wsi->tls.ssl;
626 lws_has_buffered_out(struct lws *wsi)
628 if (wsi->buflist_out)
633 struct lws *nwsi = lws_get_network_wsi(wsi);
644 lws_partial_buffered(struct lws *wsi)
646 return lws_has_buffered_out(wsi);
650 lws_get_peer_write_allowance(struct lws *wsi)
652 if (!lws_rops_fidx(wsi->role_ops, LWS_ROPS_tx_credit))
655 return lws_rops_func_fidx(wsi->role_ops, LWS_ROPS_tx_credit).
656 tx_credit(wsi, LWSTXCR_US_TO_PEER, 0);
660 lws_role_transition(struct lws *wsi, enum lwsi_role role, enum lwsi_state state,
666 wsi->wsistate = (unsigned int)role | (unsigned int)state;
668 wsi->role_ops = ops;
670 if (wsi->role_ops)
671 name = wsi->role_ops->name;
672 lwsl_wsi_debug(wsi, "wsistate 0x%lx, ops %s",
673 (unsigned long)wsi->wsistate, name);
734 lws_get_urlarg_by_name_safe(struct lws *wsi, const char *name, char *buf, int len)
739 fraglen = lws_hdr_copy_fragment(wsi, buf, len,
771 lws_get_urlarg_by_name(struct lws *wsi, const char *name, char *buf, int len)
773 int n = lws_get_urlarg_by_name_safe(wsi, name, buf, len);
789 struct lws *wsi,
795 (void)wsi;
805 lws_set_extension_option(struct lws *wsi, const char *ext_name,
813 lws_is_cgi(struct lws *wsi) {
815 return !!wsi->http.cgi;
864 plwsa->vhost = v; /* not a real bound wsi */
881 lws_wsi_user(struct lws *wsi)
883 return wsi->user_space;
887 lws_wsi_tsi(struct lws *wsi)
889 return wsi->tsi;
894 lws_set_wsi_user(struct lws *wsi, void *data)
896 if (!wsi->user_space_externally_allocated && wsi->user_space)
897 lws_free(wsi->user_space);
899 wsi->user_space_externally_allocated = 1;
900 wsi->user_space = data;
904 lws_get_parent(const struct lws *wsi)
906 return wsi->parent;
910 lws_get_child(const struct lws *wsi)
912 return wsi->child_list;
916 lws_get_opaque_parent_data(const struct lws *wsi)
918 return wsi->opaque_parent_data;
922 lws_set_opaque_parent_data(struct lws *wsi, void *data)
924 wsi->opaque_parent_data = data;
928 lws_get_opaque_user_data(const struct lws *wsi)
930 return wsi->a.opaque_user_data;
934 lws_set_opaque_user_data(struct lws *wsi, void *data)
936 wsi->a.opaque_user_data = data;
940 lws_get_child_pending_on_writable(const struct lws *wsi)
942 return wsi->parent_pending_cb_on_writable;
946 lws_clear_child_pending_on_writable(struct lws *wsi)
948 wsi->parent_pending_cb_on_writable = 0;
978 lws_get_socket_fd(struct lws *wsi)
980 if (!wsi)
982 return wsi->desc.sockfd;
987 lws_vhost_get(struct lws *wsi)
989 return wsi->a.vhost;
993 lws_get_vhost(struct lws *wsi)
995 return wsi->a.vhost;
999 lws_protocol_get(struct lws *wsi)
1001 return wsi->a.protocol;
1006 lws_get_udp(const struct lws *wsi)
1008 return wsi->udp;
1013 lws_get_context(const struct lws *wsi)
1015 return wsi->a.context;
1019 lwsl_wsi_get_cx(struct lws *wsi)
1021 if (!wsi)
1024 return wsi->lc.log_cx;
1031 struct lws *wnew, *wsi = *_wsi;
1040 if (lws_dll2_is_detached(&wsi->dll_cli_active_conns))
1047 * individual wsi and the action must take place in the correct wsi
1051 * of the wsi breaks down when dealing with queued POSTs otherwise; it's
1058 if (!wsi->dll2_cli_txn_queue_owner.head) {
1063 lwsl_wsi_info(wsi, "nothing pipelined waiting");
1064 lwsi_set_state(wsi, LRS_IDLING);
1066 lws_set_timeout(wsi, PENDING_TIMEOUT_CLIENT_CONN_IDLE,
1067 wsi->keep_warm_secs);
1073 * We have a queued child wsi we should bequeath our assets to, before
1078 lws_vhost_lock(wsi->a.vhost);
1080 wnew = lws_container_of(wsi->dll2_cli_txn_queue_owner.head, struct lws,
1083 assert(wsi != wnew);
1087 assert(lws_socket_is_valid(wsi->desc.sockfd));
1089 __lws_change_pollfd(wsi, LWS_POLLOUT | LWS_POLLIN, 0);
1092 wnew->desc = wsi->desc;
1096 /* disconnect the fd from association with old wsi */
1098 if (__remove_wsi_socket_from_fds(wsi))
1101 sanity_assert_no_wsi_traces(wsi->a.context, wsi);
1102 sanity_assert_no_sockfd_traces(wsi->a.context, wsi->desc.sockfd);
1103 wsi->desc.sockfd = LWS_SOCK_INVALID;
1105 __lws_wsi_remove_from_sul(wsi);
1109 * that has been active to a wsi that has not yet itself been active...
1115 if (wsi->a.context->event_loop_ops->destroy_wsi)
1116 wsi->a.context->event_loop_ops->destroy_wsi(wsi);
1117 if (wsi->a.context->event_loop_ops->sock_accept)
1118 wsi->a.context->event_loop_ops->sock_accept(wnew);
1125 if (__insert_wsi_socket_into_fds(wsi->a.context, wnew))
1131 wnew->tls = wsi->tls;
1132 wsi->tls.client_bio = NULL;
1133 wsi->tls.ssl = NULL;
1134 wsi->tls.use_ssl = 0;
1139 if (!wnew->cli_hostname_copy && wsi->cli_hostname_copy) {
1140 wnew->cli_hostname_copy = wsi->cli_hostname_copy;
1141 wsi->cli_hostname_copy = NULL;
1143 wnew->keep_warm_secs = wsi->keep_warm_secs;
1150 lws_dll2_remove(&wsi->dll_cli_active_conns);
1152 &wsi->a.vhost->dll_cli_active_conns_owner);
1157 wsi->dll2_cli_txn_queue_owner.head) {
1168 lws_vhost_unlock(wsi->a.vhost);
1176 wsi->already_did_cce = 1; /* so the close doesn't trigger a CCE */
1177 lws_set_timeout(wsi, 1, LWS_TO_KILL_ASYNC);
1182 lwsl_wsi_notice(wsi, " pipeline queue passed -> %s", lws_wsi_tag(wnew));
1191 lws_raw_transaction_completed(struct lws *wsi)
1193 if (lws_has_buffered_out(wsi)) {
1203 lwsl_wsi_debug(wsi, "deferring due to partial");
1204 wsi->close_when_buffered_out_drained = 1;
1205 lws_callback_on_writable(wsi);
1214 lws_bind_protocol(struct lws *wsi, const struct lws_protocols *p,
1217 // if (wsi->a.protocol == p)
1219 const struct lws_protocols *vp = wsi->a.vhost->protocols, *vpo;
1221 if (wsi->a.protocol && wsi->protocol_bind_balance) {
1222 wsi->a.protocol->callback(wsi,
1223 wsi->role_ops->protocol_unbind_cb[!!lwsi_role_server(wsi)],
1224 wsi->user_space, (void *)reason, 0);
1225 wsi->protocol_bind_balance = 0;
1227 if (!wsi->user_space_externally_allocated)
1228 lws_free_set_NULL(wsi->user_space);
1230 lws_same_vh_protocol_remove(wsi);
1232 wsi->a.protocol = p;
1236 if (lws_ensure_user_space(wsi))
1239 if (p > vp && p < &vp[wsi->a.vhost->count_protocols])
1240 lws_same_vh_protocol_insert(wsi, (int)(p - vp));
1242 int n = wsi->a.vhost->count_protocols;
1250 lws_same_vh_protocol_insert(wsi, (int)(vp - vpo));
1257 __func__, p, wsi->a.vhost->name);
1260 if (wsi->a.protocol->callback(wsi, wsi->role_ops->protocol_bind_cb[
1261 !!lwsi_role_server(wsi)],
1262 wsi->user_space, NULL, 0))
1265 wsi->protocol_bind_balance = 1;
1271 lws_http_close_immortal(struct lws *wsi)
1275 if (!wsi->mux_substream)
1278 assert(wsi->mux_stream_immortal);
1279 wsi->mux_stream_immortal = 0;
1281 nwsi = lws_get_network_wsi(wsi);
1282 lwsl_wsi_debug(wsi, "%s (%d)", lws_wsi_tag(nwsi),
1292 wsi->a.vhost->keepalive_timeout ?
1293 wsi->a.vhost->keepalive_timeout : 31);
1297 lws_mux_mark_immortal(struct lws *wsi)
1301 lws_set_timeout(wsi, NO_PENDING_TIMEOUT, 0);
1303 if (!wsi->mux_substream
1305 && !wsi->client_mux_substream
1308 lwsl_wsi_err(wsi, "not mux substream");
1312 if (wsi->mux_stream_immortal)
1313 /* only need to handle it once per child wsi */
1316 nwsi = lws_get_network_wsi(wsi);
1320 lwsl_wsi_debug(wsi, "%s (%d)\n", lws_wsi_tag(nwsi),
1323 wsi->mux_stream_immortal = 1;
1331 lws_http_mark_sse(struct lws *wsi)
1333 if (!wsi)
1336 lws_http_headers_detach(wsi);
1337 lws_mux_mark_immortal(wsi);
1339 if (wsi->mux_substream)
1340 wsi->h2_stream_carries_sse = 1;
1348 lws_wsi_client_stash_item(struct lws *wsi, int stash_idx, int hdr_idx)
1351 if (wsi->stash)
1352 return wsi->stash->cis[stash_idx];
1356 return lws_hdr_simple_ptr(wsi, (enum lws_token_indexes)hdr_idx);
1366 lws_wsi_mux_insert(struct lws *wsi, struct lws *parent_wsi, unsigned int sid)
1368 lwsl_wsi_info(wsi, "par %s: assign sid %d (curr %d)",
1369 lws_wsi_tag(parent_wsi), sid, wsi->mux.my_sid);
1371 if (wsi->mux.my_sid && wsi->mux.my_sid != (unsigned int)sid)
1374 wsi->mux.my_sid = sid;
1375 wsi->mux.parent_wsi = parent_wsi;
1376 wsi->role_ops = parent_wsi->role_ops;
1379 wsi->mux.sibling_list = parent_wsi->mux.child_list;
1382 parent_wsi->mux.child_list = wsi;
1390 lws_start_foreach_ll(struct lws *, wsi, parent_wsi->mux.child_list) {
1391 if (wsi->mux.my_sid == sid)
1392 return wsi;
1393 } lws_end_foreach_ll(wsi, mux.sibling_list);
1399 lws_wsi_mux_dump_children(struct lws *wsi)
1402 if (!wsi->mux.parent_wsi || !lwsl_visible(LLL_INFO))
1406 wsi->mux.parent_wsi->mux.child_list) {
1407 lwsl_wsi_info(wsi, " \\---- child %s %s\n",
1416 lws_wsi_mux_close_children(struct lws *wsi, int reason)
1421 if (!wsi->mux.child_list)
1424 w = &wsi->mux.child_list;
1439 lws_wsi_mux_sibling_disconnect(struct lws *wsi)
1444 wsi->mux.parent_wsi->mux.child_list) {
1447 if (*w == wsi) {
1451 lwsl_wsi_debug(wsi, " disentangled from sibling %s",
1456 wsi->mux.parent_wsi->mux.child_count--;
1458 wsi->mux.parent_wsi = NULL;
1462 lws_wsi_mux_dump_waiting_children(struct lws *wsi)
1466 __func__, lws_wsi_tag(wsi));
1468 wsi = wsi->mux.child_list;
1469 while (wsi) {
1470 lwsl_wsi_info(wsi, " %c sid %u: 0x%x %s %s",
1471 wsi->mux.requested_POLLOUT ? '*' : ' ',
1472 wsi->mux.my_sid, lwsi_state(wsi),
1473 wsi->role_ops->name,
1474 wsi->a.protocol ? wsi->a.protocol->name : "noprotocol");
1476 wsi = wsi->mux.sibling_list;
1482 lws_wsi_mux_mark_parents_needing_writeable(struct lws *wsi)
1484 struct lws /* *network_wsi = lws_get_network_wsi(wsi), */ *wsi2;
1489 wsi2 = wsi;
1538 lws_wsi_mux_action_pending_writeable_reqs(struct lws *wsi)
1540 struct lws *w = wsi->mux.child_list;
1544 if (lws_change_pollfd(wsi, 0, LWS_POLLOUT))
1551 if (lws_change_pollfd(wsi, LWS_POLLOUT, 0))
1596 lws_wsi_tx_credit(struct lws *wsi, char peer_to_us, int add)
1598 if (wsi->role_ops && lws_rops_fidx(wsi->role_ops, LWS_ROPS_tx_credit))
1599 return lws_rops_func_fidx(wsi->role_ops, LWS_ROPS_tx_credit).
1600 tx_credit(wsi, peer_to_us, add);
1611 lws_wsi_txc_report_manual_txcr_in(struct lws *wsi, int32_t bump)
1613 if (!wsi->txc.manual)
1620 return user_callback_handle_rxflow(wsi->a.protocol->callback,
1621 wsi, LWS_CALLBACK_WSI_TX_CREDIT_GET,
1622 wsi->user_space, NULL, (size_t)bump);
1628 lws_wsi_mux_apply_queue(struct lws *wsi)
1632 lws_context_lock(wsi->a.context, __func__); /* -------------- cx { */
1633 lws_vhost_lock(wsi->a.vhost);
1636 wsi->dll2_cli_txn_queue_owner.head) {
1641 if (lwsi_role_http(wsi) &&
1651 lws_wsi_h2_adopt(wsi, w);
1656 if (lwsi_role_mqtt(wsi) &&
1657 lwsi_state(wsi) == LRS_ESTABLISHED) {
1664 lws_wsi_mqtt_adopt(wsi, w);
1670 lws_vhost_unlock(wsi->a.vhost);
1671 lws_context_unlock(wsi->a.context); /* } cx -------------- */