#include #include #include #include "eos.h" #include "net.h" #include "cell.h" void eos_cell_pdp_handler(unsigned char _mtype, EOSMessage *msg, uint16_t len) { unsigned char mtype; unsigned char *buffer = msg->buffer; if (len < 1) return; mtype = buffer[0] & ~EOS_CELL_MTYPE_MASK; switch (mtype) { case EOS_CELL_MTYPE_PDP_SET_APN: case EOS_CELL_MTYPE_PDP_SET_USR: case EOS_CELL_MTYPE_PDP_SET_PWD: { char arg[EOS_CELL_PDP_SIZE_ARG + 1]; buffer++; len--; if (len > EOS_CELL_PDP_SIZE_ARG) break; memcpy(arg, buffer, len); arg[len] = '\0'; switch (mtype) { case EOS_CELL_MTYPE_PDP_SET_APN: { eos_ppp_set_apn(arg); break; } case EOS_CELL_MTYPE_PDP_SET_USR: { eos_ppp_set_usr(arg); break; } case EOS_CELL_MTYPE_PDP_SET_PWD: { eos_ppp_set_pwd(arg); break; } } break; } case EOS_CELL_MTYPE_PDP_GET_APN: case EOS_CELL_MTYPE_PDP_GET_USR: case EOS_CELL_MTYPE_PDP_GET_PWD: { char arg[EOS_CELL_PDP_SIZE_ARG + 1]; if (!(eos_msg_flags(msg) & EOS_MSG_FLAG_RPLY_REQ)) break; if (msg->size < EOS_CELL_PDP_SIZE_ARG + 1) break; buffer[0] = EOS_CELL_MTYPE_PDP | mtype; switch (mtype) { case EOS_CELL_MTYPE_PDP_GET_APN: { eos_ppp_get_apn(arg); break; } case EOS_CELL_MTYPE_PDP_GET_USR: { eos_ppp_get_usr(arg); break; } case EOS_CELL_MTYPE_PDP_GET_PWD: { eos_ppp_get_pwd(arg); break; } } memcpy(buffer + 1, arg, strlen(arg)); eos_net_reply(EOS_NET_MTYPE_CELL, msg, strlen(arg) + 1); break; } case EOS_CELL_MTYPE_PDP_CONNECT: { eos_ppp_connect(); break; } case EOS_CELL_MTYPE_PDP_DISCONNECT: { eos_ppp_disconnect(); break; } } }