esp_err_t esp_modem_setup_ppp(modem_dte_t *dte) { modem_dce_t *dce = dte->dce; MODEM_CHECK(dce, "DTE has not yet bind with DCE", err); esp_modem_dte_t *esp_dte = __containerof(dte, esp_modem_dte_t, parent); /* Set PDP Context */ MODEM_CHECK(dce->define_pdp_context(dce, 1, "IP", CONFIG_ESP_MODEM_APN) == ESP_OK, "set MODEM APN failed", err); /* Enter PPP mode */ MODEM_CHECK(dte->change_mode(dte, MODEM_PPP_MODE) == ESP_OK, "enter ppp mode failed", err); /* Create PPPoS interface */ esp_dte->ppp = pppapi_pppos_create(&(esp_dte->pppif), pppos_low_level_output, on_ppp_status_changed, dte); MODEM_CHECK(esp_dte->ppp, "create pppos interface failed", err); #if PPP_NOTIFY_PHASE ppp_set_notify_phase_callback(esp_dte->ppp, on_ppp_notify_phase); #endif /* Initiate PPP client connection */ /* Set default route */ MODEM_CHECK(pppapi_set_default(esp_dte->ppp) == ERR_OK, "set default route failed", err); /* Ask the peer for up to 2 DNS server addresses */ ppp_set_usepeerdns(esp_dte->ppp, 1); /* Auth configuration */ #if PAP_SUPPORT pppapi_set_auth(esp_dte->ppp, PPPAUTHTYPE_PAP, CONFIG_ESP_MODEM_PPP_AUTH_USERNAME, CONFIG_ESP_MODEM_PPP_AUTH_PASSWORD); #elif CHAP_SUPPORT pppapi_set_auth(esp_dte->ppp, PPPAUTHTYPE_CHAP, CONFIG_ESP_MODEM_PPP_AUTH_USERNAME, CONFIG_ESP_MODEM_PPP_AUTH_PASSWORD); #else #error "Unsupported AUTH Negotiation" #endif /* Initiate PPP negotiation, without waiting */ MODEM_CHECK(pppapi_connect(esp_dte->ppp, 0) == ERR_OK, "initiate ppp negotiation failed", err); esp_event_post_to(esp_dte->event_loop_hdl, ESP_MODEM_EVENT, MODEM_EVENT_PPP_START, NULL, 0, 0); return ESP_OK; err: return ESP_FAIL; }
/** * Call ppp_set_notify_phase_callback() inside the tcpip_thread context. */ static err_t pppapi_do_ppp_set_notify_phase_callback(struct tcpip_api_call_data *m) { /* cast through void* to silence alignment warnings. * We know it works because the structs have been instantiated as struct pppapi_msg */ struct pppapi_msg *msg = (struct pppapi_msg *)(void*)m; ppp_set_notify_phase_callback(msg->msg.ppp, msg->msg.msg.setnotifyphasecb.notify_phase_cb); return ERR_OK; }
/** * Call ppp_set_notify_phase_callback() inside the tcpip_thread context. */ static void pppapi_do_ppp_set_notify_phase_callback(struct pppapi_msg_msg *msg) { ppp_set_notify_phase_callback(msg->ppp, msg->msg.setnotifyphasecb.notify_phase_cb); TCPIP_PPPAPI_ACK(msg); }