// rndis void vsfos_rndis_on_connect(void *param) { struct vsfos_rndis_t *rndis = (struct vsfos_rndis_t *)param; vsfsm_sem_init(&rndis->dhcpc.update_sem, 0, VSFSM_EVT_USER); vsfip_dhcpc_start(&rndis->param.netif, &rndis->dhcpc); }
static vsf_err_t vsfip_telnetd_thread(struct vsfsm_pt_t *pt, vsfsm_evt_t evt) { struct vsfip_telnetd_t *telnetd = (struct vsfip_telnetd_t *)pt->user_data; vsf_err_t err = VSFERR_NONE; int i; vsfsm_pt_begin(pt); telnetd->caller_pt.sm = pt->sm; telnetd->so = vsfip_socket(AF_INET, IPPROTO_TCP); if (NULL == telnetd->so) { return VSFERR_FAIL; } if ((vsfip_bind(telnetd->so, telnetd->port) != 0) || (vsfip_listen(telnetd->so, telnetd->session_num) != 0)) { err = VSFERR_FAIL; goto fail_socket_connect; } while (1) { telnetd->caller_pt.state = 0; vsfsm_pt_entry(pt); err = vsfip_tcp_accept(&telnetd->caller_pt, evt, telnetd->so, &telnetd->cur_session); if (err > 0) return err; else if (err < 0) { continue; } // get session for (i = 0; i < telnetd->session_num; i++) { if (!telnetd->sessions[i].connected) { struct vsfip_telnetd_session_t *session = &telnetd->sessions[i]; session->connected = true; session->disconnect = false; session->so = telnetd->cur_session; session->stream_rx->callback_tx.param = session; session->stream_rx->callback_tx.on_inout = vsfip_telnetd_session_stream_on_out; session->stream_tx->callback_rx.param = session; session->stream_tx->callback_rx.on_inout = vsfip_telnetd_session_stream_on_in; stream_connect_tx(session->stream_rx); stream_connect_rx(session->stream_tx); vsfsm_sem_init(&session->stream_tx_sem, 0, VSFIP_TELNETD_EVT_STREAM_IN); vsfsm_sem_init(&session->stream_rx_sem, 0, VSFIP_TELNETD_EVT_STREAM_OUT); session->txpt.thread = vsfip_telnetd_session_tx_thread; session->txpt.user_data = session; session->rxpt.thread = vsfip_telnetd_session_rx_thread; session->rxpt.user_data = session; vsfsm_pt_init(&session->txsm, &session->txpt); vsfsm_pt_init(&session->rxsm, &session->rxpt); break; } } if (i == telnetd->session_num) { telnetd->caller_pt.state = 0; vsfsm_pt_entry(pt); err = vsfip_tcp_close(&telnetd->caller_pt, evt, telnetd->cur_session); if (err > 0) return err; vsfip_close(telnetd->cur_session); } } fail_socket_connect: vsfip_close(telnetd->so); telnetd->so = NULL; vsfsm_pt_end(pt); return VSFERR_NONE; }