Skip to content

Commit

Permalink
add ppp pap auth unit test
Browse files Browse the repository at this point in the history
  • Loading branch information
w180112 committed Nov 11, 2023
1 parent 4a313ec commit c9dfb40
Show file tree
Hide file tree
Showing 12 changed files with 295 additions and 130 deletions.
93 changes: 65 additions & 28 deletions src/dbg.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,6 @@
#define DBG_VRG_MSG_LEN 256
#define LOGGER_BUF_LEN 1024

char *PPP_state2str(U16 state);
char *DHCP_state2str(U16 state);

static VRG_t *vrg_ccb;

char *loglvl2str(U8 level)
Expand Down Expand Up @@ -55,22 +52,6 @@ U8 logstr2lvl(const char *log_str)
return LOGUNKNOWN;
}

void PPPLOGMSG(void *ccb, char *buf)
{
PPP_INFO_t *s_ppp_ccb = (PPP_INFO_t *)ccb;
if (s_ppp_ccb) {
sprintf(buf, "pppd> Session id [%x.%s] ", rte_be_to_cpu_16(s_ppp_ccb->session_id), PPP_state2str(s_ppp_ccb->ppp_phase[s_ppp_ccb->cp].state));
}
}

void DHCPLOGMSG(void *ccb, char *buf)
{
dhcp_ccb_t *dhcp_ccb = (dhcp_ccb_t *)ccb;
if (dhcp_ccb) {
sprintf(buf,"dhcpd> ip pool index, user index[%u, %u, %s] ", dhcp_ccb->cur_ip_pool_index, dhcp_ccb->cur_lan_user_index, DHCP_state2str(dhcp_ccb->lan_user_info[dhcp_ccb->cur_lan_user_index].state));
}
}

/*-------------------------------------------------------------------
* PPP_state2str
*
Expand All @@ -83,17 +64,17 @@ char *PPP_state2str(U16 state)
PPP_STATE state;
char str[20];
} ppp_state_desc_tbl[] = {
{ S_INIT, "INIT " },
{ S_STARTING, "STARTING " },
{ S_CLOSED, "CLOSED " },
{ S_STOPPED, "STOPPED " },
{ S_CLOSING, "CLOSING " },
{ S_STOPPING, "STOPPONG " },
{ S_INIT, "INIT" },
{ S_STARTING, "STARTING" },
{ S_CLOSED, "CLOSED" },
{ S_STOPPED, "STOPPED" },
{ S_CLOSING, "CLOSING" },
{ S_STOPPING, "STOPPONG" },
{ S_REQUEST_SENT, "REQUEST_SENT" },
{ S_ACK_RECEIVED, "ACK_RECEIVED" },
{ S_ACK_SENT, "ACK_SENT " },
{ S_OPENED, "OPENED " },
{ S_INVLD, "Unknwn " },
{ S_ACK_SENT, "ACK_SENT" },
{ S_OPENED, "OPENED" },
{ S_INVLD, "Unknwn" },
};

U8 i;
Expand All @@ -107,6 +88,46 @@ char *PPP_state2str(U16 state)
return ppp_state_desc_tbl[i].str;
}

/*-------------------------------------------------------------------
* PPP_event2str
*
* input : event
* return: string of corresponding event value
*------------------------------------------------------------------*/
char *PPP_event2str(U16 event)
{
static struct {
PPP_EVENT_TYPE event;
char str[64];
} ppp_event_desc_tbl[] = {
{ E_UP, "UP" },
{ E_DOWN, "DOWN" },
{ E_OPEN, "OPEN" },
{ E_CLOSE, "CLOSE" },
{ E_TIMEOUT_COUNTER_POSITIVE, "TIMEOUT_COUNTER_POSITIVE" },
{ E_TIMEOUT_COUNTER_EXPIRED, "TIMEOUT_COUNTER_EXPIRED" },
{ E_RECV_GOOD_CONFIG_REQUEST, "RECV_GOOD_CONFIG_REQUEST" },
{ E_RECV_BAD_CONFIG_REQUEST, "RECV_BAD_CONFIG_REQUEST" },
{ E_RECV_CONFIG_ACK, "RECV_CONFIG_ACK" },
{ E_RECV_CONFIG_NAK_REJ, "RECV_CONFIG_NAK_REJECT" },
{ E_RECV_TERMINATE_REQUEST, "RECV_TERMINATE_REQUEST" },
{ E_RECV_TERMINATE_ACK, "RECV_TERMINATE_ACK" },
{ E_RECV_UNKNOWN_CODE, "RECV_UNKNOWN_CODE" },
{ E_RECV_GOOD_CODE_PROTOCOL_REJECT, "RECV_GOOD_CODE_PROTOCOL_REJECT" },
{ E_RECV_BAD_CODE_PROTOCOL_REJECT, "RECV_BAD_CODE_PROTOCOL_REJECT" },
{ E_RECV_ECHO_REPLY_REQUEST_DISCARD_REQUEST, "RECV_ECHO_REPLY_REQUEST_DISCARD_REQUEST" },
{ E_UNKNOWN, "UNKNOWN" },
};

U8 i;

for(i=0; ppp_event_desc_tbl[i].event != E_UNKNOWN; i++) {
if (ppp_event_desc_tbl[i].event == event) break;
}

return ppp_event_desc_tbl[i].str;
}

/*-------------------------------------------------------------------
* DHCP_state2str
*
Expand Down Expand Up @@ -139,6 +160,22 @@ char *DHCP_state2str(U16 state)
return dhcp_state_desc_tbl[i].str;
}

void PPPLOGMSG(void *ccb, char *buf)
{
PPP_INFO_t *s_ppp_ccb = (PPP_INFO_t *)ccb;
if (s_ppp_ccb) {
sprintf(buf, "pppd> Session id [%x] ", rte_be_to_cpu_16(s_ppp_ccb->session_id));
}
}

void DHCPLOGMSG(void *ccb, char *buf)
{
dhcp_ccb_t *dhcp_ccb = (dhcp_ccb_t *)ccb;
if (dhcp_ccb) {
sprintf(buf,"dhcpd> ip pool index, user index[%u, %u, %s] ", dhcp_ccb->cur_ip_pool_index, dhcp_ccb->cur_lan_user_index, DHCP_state2str(dhcp_ccb->lan_user_info[dhcp_ccb->cur_lan_user_index].state));
}
}

/***************************************************
* LOGGER:
***************************************************/
Expand Down
5 changes: 3 additions & 2 deletions src/dbg.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,9 @@
#define LOGERR 4U
#define LOGUNKNOWN 0U

extern char *PPP_state2str(U16 state);
extern char *DHCP_state2str(U16 state);
char *PPP_state2str(U16 state);
char *PPP_event2str(U16 event);
char *DHCP_state2str(U16 state);

/* log level, logfile fp, log msg */
#define VRG_LOG(lvl, fp, ccb, ccb2str, ...) LOGGER(LOG ## lvl, __FILE__, __LINE__, fp, ccb, ccb2str, __VA_ARGS__)
Expand Down
154 changes: 76 additions & 78 deletions src/pppd/codec.c
Original file line number Diff line number Diff line change
Expand Up @@ -187,8 +187,8 @@ STATUS PPP_decode_frame(tVRG_MBX *mail, struct rte_ether_hdr *eth_hdr, vlan_head
else if (ppp_payload->ppp_protocol == rte_cpu_to_be_16(PAP_PROTOCOL)) {
if (s_ppp_ccb->phase != AUTH_PHASE)
return ERROR;
ppp_pap_ack_nak_t ppp_pap_ack_nak, *tmp_ppp_pap_ack_nak = (ppp_pap_ack_nak_t *)(tmp_ppp_hdr + 1);
rte_memcpy(&ppp_pap_ack_nak,tmp_ppp_pap_ack_nak,tmp_ppp_pap_ack_nak->msg_length + sizeof(U8));
//ppp_pap_ack_nak_t ppp_pap_ack_nak, *tmp_ppp_pap_ack_nak = (ppp_pap_ack_nak_t *)(tmp_ppp_hdr + 1);
//rte_memcpy(&ppp_pap_ack_nak,tmp_ppp_pap_ack_nak,tmp_ppp_pap_ack_nak->msg_length + sizeof(U8));
if (ppp_hdr->code == PAP_ACK) {
VRG_LOG(INFO, vrg_ccb->fp, s_ppp_ccb, PPPLOGMSG, "User %" PRIu16 " auth success.", s_ppp_ccb->user_num);
s_ppp_ccb->phase = IPCP_PHASE;
Expand All @@ -214,9 +214,8 @@ STATUS PPP_decode_frame(tVRG_MBX *mail, struct rte_ether_hdr *eth_hdr, vlan_head
tmp_s_ppp_ccb.ppp_phase[0].ppp_options = NULL;
tmp_s_ppp_ccb.cp = 0;
tmp_s_ppp_ccb.session_id = s_ppp_ccb->session_id;
if (build_auth_ack_pap(buffer, &tmp_s_ppp_ccb, &mulen) < 0)
return ERROR;


build_auth_ack_pap(buffer, &mulen, &tmp_s_ppp_ccb);
drv_xmit(vrg_ccb, buffer, mulen);
VRG_LOG(INFO, vrg_ccb->fp, s_ppp_ccb, PPPLOGMSG, "User %" PRIu16 " recv pap request.\n", s_ppp_ccb->user_num);
return TRUE;
Expand Down Expand Up @@ -992,105 +991,104 @@ STATUS build_code_reject(__attribute__((unused)) unsigned char* buffer, __attrib
/**
* build_auth_request_pap
*
* purpose: For PAP auth, send after LCP nego complete.
* input: *buffer - packet buffer,
* *s_ppp_ccb,
* *mulen - packet length
* output: TRUE/FALSE
* return: packet buffer
* @brief
* For PAP auth, send after LCP nego complete.
* @param buffer
* The buffer to be processed by the codec.
* @param s_ppp_ccb
* The ppp ccb.
* @param len
* The length of the buffer.
* @return
* void
*/
STATUS build_auth_request_pap(unsigned char* buffer, PPP_INFO_t *s_ppp_ccb, U16 *mulen)
void build_auth_request_pap(unsigned char* buffer, U16 *mulen, PPP_INFO_t *s_ppp_ccb)
{
ppp_header_t ppp_pap_header;
U8 peer_id_length = strlen((const char *)(s_ppp_ccb->ppp_user_id));
U8 peer_passwd_length = strlen((const char *)(s_ppp_ccb->ppp_passwd));
struct rte_ether_hdr *eth_hdr = s_ppp_ccb->ppp_phase[s_ppp_ccb->cp].eth_hdr;
vlan_header_t *vlan_header = s_ppp_ccb->ppp_phase[s_ppp_ccb->cp].vlan_header;
pppoe_header_t *pppoe_header = s_ppp_ccb->ppp_phase[s_ppp_ccb->cp].pppoe_header;
ppp_payload_t *ppp_payload = s_ppp_ccb->ppp_phase[s_ppp_ccb->cp].ppp_payload;
ppp_header_t *ppp_hdr = s_ppp_ccb->ppp_phase[s_ppp_ccb->cp].ppp_hdr;
struct rte_ether_hdr *eth_hdr = (struct rte_ether_hdr *)buffer;
vlan_header_t *vlan_header = (vlan_header_t *)(eth_hdr + 1);
pppoe_header_t *pppoe_header = (pppoe_header_t *)(vlan_header + 1);
ppp_payload_t *ppp_payload = (ppp_payload_t *)(pppoe_header + 1);
ppp_header_t *ppp_pap_header = (ppp_header_t *)(ppp_payload + 1);
U8 peer_id_length = strlen((const char *)(s_ppp_ccb->ppp_user_id));
U8 peer_passwd_length = strlen((const char *)(s_ppp_ccb->ppp_passwd));
U8 *pap_account = (U8 *)(ppp_pap_header + 1);
U8 *pap_password = pap_account + peer_id_length + sizeof(U8)/* pap account length field */;

s_ppp_ccb->phase = AUTH_PHASE;

rte_ether_addr_copy(&vrg_ccb->nic_info.hsi_wan_src_mac, &eth_hdr->src_addr);
rte_ether_addr_copy(&s_ppp_ccb->PPP_dst_mac, &eth_hdr->dst_addr);
eth_hdr->ether_type = rte_cpu_to_be_16(VLAN);

*vlan_header = *(s_ppp_ccb->ppp_phase[s_ppp_ccb->cp].vlan_header);
*pppoe_header = *(s_ppp_ccb->ppp_phase[s_ppp_ccb->cp].pppoe_header);
ppp_payload->ppp_protocol = rte_cpu_to_be_16(PAP_PROTOCOL);

ppp_payload->ppp_protocol = rte_cpu_to_be_16(PAP_PROTOCOL);
ppp_pap_header.code = PAP_REQUEST;
ppp_pap_header.identifier = ppp_hdr->identifier;
ppp_pap_header->code = PAP_REQUEST;
ppp_pap_header->identifier = s_ppp_ccb->identifier;

ppp_pap_header.length = 2 * sizeof(U8) + peer_id_length + peer_passwd_length + sizeof(ppp_header_t);
pppoe_header->length = ppp_pap_header.length + sizeof(ppp_payload_t);
ppp_pap_header.length = rte_cpu_to_be_16(ppp_pap_header.length);
*(U8 *)pap_account = peer_id_length;
rte_memcpy(pap_account + sizeof(U8), s_ppp_ccb->ppp_user_id, peer_id_length);
*(U8 *)pap_password = peer_passwd_length;
rte_memcpy(pap_password + sizeof(U8), s_ppp_ccb->ppp_passwd, peer_passwd_length);

ppp_pap_header->length = 2 * sizeof(U8)/* for pap account length and pap password length */
+ peer_id_length + peer_passwd_length + sizeof(ppp_header_t);
pppoe_header->length = ppp_pap_header->length + sizeof(ppp_payload_t);
ppp_pap_header->length = rte_cpu_to_be_16(ppp_pap_header->length);
pppoe_header->length = rte_cpu_to_be_16(pppoe_header->length);

*mulen = ntohs(pppoe_header->length) + sizeof(struct rte_ether_hdr) + sizeof(pppoe_header_t) + sizeof(vlan_header_t);

memset(buffer,0,MSG_BUF);
rte_memcpy(buffer,eth_hdr,sizeof(struct rte_ether_hdr));
rte_memcpy(buffer+sizeof(struct rte_ether_hdr),vlan_header,sizeof(vlan_header_t));
rte_memcpy(buffer+sizeof(struct rte_ether_hdr)+sizeof(vlan_header_t),pppoe_header,sizeof(pppoe_header_t));
rte_memcpy(buffer+sizeof(struct rte_ether_hdr)+sizeof(vlan_header_t)+sizeof(pppoe_header_t),ppp_payload,sizeof(ppp_payload_t));
rte_memcpy(buffer+sizeof(struct rte_ether_hdr)+sizeof(vlan_header_t)+sizeof(pppoe_header_t)+sizeof(ppp_payload_t),&ppp_pap_header,sizeof(ppp_header_t));
rte_memcpy(buffer+sizeof(struct rte_ether_hdr)+sizeof(vlan_header_t)+sizeof(pppoe_header_t)+sizeof(ppp_payload_t)+sizeof(ppp_header_t),&peer_id_length,sizeof(U8));
rte_memcpy(buffer+sizeof(struct rte_ether_hdr)+sizeof(vlan_header_t)+sizeof(pppoe_header_t)+sizeof(ppp_payload_t)+sizeof(ppp_header_t)+sizeof(U8),s_ppp_ccb->ppp_user_id,peer_id_length);
rte_memcpy(buffer+sizeof(struct rte_ether_hdr)+sizeof(vlan_header_t)+sizeof(pppoe_header_t)+sizeof(ppp_payload_t)+sizeof(ppp_header_t)+sizeof(U8)+peer_id_length,&peer_passwd_length,sizeof(U8));
rte_memcpy(buffer+sizeof(struct rte_ether_hdr)+sizeof(vlan_header_t)+sizeof(pppoe_header_t)+sizeof(ppp_payload_t)+sizeof(ppp_header_t)+sizeof(U8)+peer_id_length+sizeof(U8),s_ppp_ccb->ppp_passwd,peer_passwd_length);

VRG_LOG(DBG, vrg_ccb->fp, s_ppp_ccb, PPPLOGMSG, "User %" PRIu16 " pap request built.", s_ppp_ccb->user_num);
return TRUE;
}

/**
* build_auth_ack_pap
*
* purpose: For Spirent test center, in pap, we will receive pap request packet.
* input: *buffer - packet buffer,
* *s_ppp_ccb,
* *mulen - packet length
* output: TRUE/FALSE
* return: packet buffer
* @brief
* For Spirent test center, in pap, we will receive pap request packet.
* @param buffer
* The buffer to be processed by the codec.
* @param s_ppp_ccb
* The ppp ccb.
* @param len
* The length of the buffer.
* @return
* void
*/
STATUS build_auth_ack_pap(unsigned char *buffer, PPP_INFO_t *s_ppp_ccb, U16 *mulen)
void build_auth_ack_pap(unsigned char *buffer, U16 *mulen, PPP_INFO_t *s_ppp_ccb)
{
ppp_header_t ppp_pap_header;
const char *login_msg = "Login ok";
ppp_pap_ack_nak_t ppp_pap_ack_nak;
struct rte_ether_addr tmp_mac;
struct rte_ether_hdr *eth_hdr = s_ppp_ccb->ppp_phase[s_ppp_ccb->cp].eth_hdr;
vlan_header_t *vlan_header = s_ppp_ccb->ppp_phase[s_ppp_ccb->cp].vlan_header;
pppoe_header_t *pppoe_header = s_ppp_ccb->ppp_phase[s_ppp_ccb->cp].pppoe_header;
ppp_payload_t *ppp_payload = s_ppp_ccb->ppp_phase[s_ppp_ccb->cp].ppp_payload;
ppp_header_t *ppp_hdr = s_ppp_ccb->ppp_phase[s_ppp_ccb->cp].ppp_hdr;

rte_ether_addr_copy(&eth_hdr->src_addr, &tmp_mac);
rte_ether_addr_copy(&eth_hdr->dst_addr, &eth_hdr->src_addr);
rte_ether_addr_copy(&tmp_mac, &eth_hdr->dst_addr);

ppp_payload->ppp_protocol = rte_cpu_to_be_16(PAP_PROTOCOL);
ppp_pap_header.code = PAP_ACK;
ppp_pap_header.identifier = ppp_hdr->identifier;

ppp_pap_ack_nak.msg_length = strlen(login_msg);
ppp_pap_ack_nak.msg = (U8 *)login_msg;

ppp_pap_header.length = sizeof(ppp_header_t) + ppp_pap_ack_nak.msg_length + sizeof(ppp_pap_ack_nak.msg_length);
pppoe_header->length = ppp_pap_header.length + sizeof(ppp_payload_t);
ppp_pap_header.length = rte_cpu_to_be_16(ppp_pap_header.length);
pppoe_header->length = rte_cpu_to_be_16(pppoe_header->length);
struct rte_ether_hdr *eth_hdr = (struct rte_ether_hdr *)buffer;
vlan_header_t *vlan_header = (vlan_header_t *)(eth_hdr + 1);
pppoe_header_t *pppoe_header = (pppoe_header_t *)(vlan_header + 1);
ppp_payload_t *ppp_payload = (ppp_payload_t *)(pppoe_header + 1);
ppp_header_t *ppp_pap_header = (ppp_header_t *)(ppp_payload + 1);
ppp_pap_ack_nak_t *ppp_pap_ack_nak = (ppp_pap_ack_nak_t *)(ppp_pap_header + 1);

rte_ether_addr_copy(&vrg_ccb->nic_info.hsi_wan_src_mac, &eth_hdr->src_addr);
rte_ether_addr_copy(&s_ppp_ccb->PPP_dst_mac, &eth_hdr->dst_addr);
eth_hdr->ether_type = rte_cpu_to_be_16(VLAN);

*mulen = ntohs(pppoe_header->length) + sizeof(struct rte_ether_hdr) + sizeof(pppoe_header_t) + sizeof(vlan_header_t);
*vlan_header = *(s_ppp_ccb->ppp_phase[s_ppp_ccb->cp].vlan_header);
*pppoe_header = *(s_ppp_ccb->ppp_phase[s_ppp_ccb->cp].pppoe_header);
ppp_payload->ppp_protocol = rte_cpu_to_be_16(PAP_PROTOCOL);

ppp_pap_header->code = PAP_ACK;
ppp_pap_header->identifier = s_ppp_ccb->identifier;

memset(buffer,0,MSG_BUF);
rte_memcpy(buffer,eth_hdr,sizeof(struct rte_ether_hdr));
rte_memcpy(buffer+14,vlan_header,sizeof(vlan_header_t));
rte_memcpy(buffer+14+sizeof(vlan_header_t),pppoe_header,sizeof(pppoe_header_t));
rte_memcpy(buffer+14+sizeof(vlan_header_t)+sizeof(pppoe_header_t),ppp_payload,sizeof(ppp_payload_t));
rte_memcpy(buffer+14+sizeof(vlan_header_t)+sizeof(pppoe_header_t)+sizeof(ppp_payload_t),&ppp_pap_header,sizeof(ppp_header_t));
rte_memcpy(buffer+14+sizeof(vlan_header_t)+sizeof(pppoe_header_t)+sizeof(ppp_payload_t)+sizeof(ppp_header_t),&ppp_pap_ack_nak,sizeof(ppp_pap_ack_nak.msg_length)+ppp_pap_ack_nak.msg_length);
ppp_pap_ack_nak->msg_length = strlen(login_msg);
rte_memcpy(ppp_pap_ack_nak->msg, login_msg, ppp_pap_ack_nak->msg_length);

ppp_pap_header->length = sizeof(ppp_header_t) + ppp_pap_ack_nak->msg_length + sizeof(ppp_pap_ack_nak->msg_length);
pppoe_header->length = ppp_pap_header->length + sizeof(ppp_payload_t);
*mulen = pppoe_header->length + sizeof(struct rte_ether_hdr) + sizeof(pppoe_header_t) + sizeof(vlan_header_t);

ppp_pap_header->length = rte_cpu_to_be_16(ppp_pap_header->length);
pppoe_header->length = rte_cpu_to_be_16(pppoe_header->length);

VRG_LOG(DBG, vrg_ccb->fp, s_ppp_ccb, PPPLOGMSG, "User %" PRIu16 " pap ack built.", s_ppp_ccb->user_num);
return TRUE;
}

/* TODO: not yet tested */
Expand Down
8 changes: 4 additions & 4 deletions src/pppd/codec.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,15 @@ void build_config_request(U8 *buffer, U16 *mulen, PPP_INFO_t *s_ppp_ccb);
void build_config_ack(U8 *buffer, U16 *mulen, PPP_INFO_t *s_ppp_ccb);
void build_config_nak_rej(U8 *buffer, U16 *mulen, PPP_INFO_t *s_ppp_ccb);
void build_terminate_ack(U8 *buffer, U16 *mulen, PPP_INFO_t *s_ppp_ccb);
extern STATUS build_code_reject(unsigned char *buffer, PPP_INFO_t *s_ppp_ccb, U16 *mulen);
extern STATUS build_code_reject(U8 *buffer, PPP_INFO_t *s_ppp_ccb, U16 *mulen);
void build_terminate_request(U8 *buffer, U16 *mulen, PPP_INFO_t *s_ppp_ccb);
void build_echo_reply(U8 *buffer, U16 *mulen, PPP_INFO_t *s_ppp_ccb);
extern STATUS build_auth_request_pap(unsigned char *buffer, PPP_INFO_t *s_ppp_ccb, U16 *mulen);
extern STATUS build_auth_ack_pap(unsigned char *buffer, PPP_INFO_t *s_ppp_ccb, U16 *mulen);
void build_auth_request_pap(U8 *buffer, U16 *mulen, PPP_INFO_t *s_ppp_ccb);
void build_auth_ack_pap(U8 *buffer, U16 *mulen, PPP_INFO_t *s_ppp_ccb);
STATUS build_auth_response_chap(U8 *buffer, PPP_INFO_t *s_ppp_ccb, U16 *mulen, ppp_chap_data_t *ppp_chap_data);

STATUS check_nak_reject(U8 flag, pppoe_header_t *pppoe_header, ppp_payload_t *ppp_payload, ppp_header_t *ppp_hdr, ppp_options_t *ppp_options, U16 total_lcp_length);
STATUS check_ipcp_nak_rej(U8 flag, pppoe_header_t *pppoe_header, ppp_payload_t *ppp_payload, ppp_header_t *ppp_hdr, ppp_options_t *ppp_options, U16 total_lcp_length);
STATUS build_auth_response_chap(unsigned char* buffer, PPP_INFO_t *s_ppp_ccb, U16 *mulen, ppp_chap_data_t *ppp_chap_data);

STATUS build_padi(U8 *buffer, U16 *mulen, PPP_INFO_t *s_ppp_ccb);
STATUS build_padr(U8 *buffer, U16 *mulen, PPP_INFO_t *s_ppp_ccb);
Expand Down
Loading

0 comments on commit c9dfb40

Please sign in to comment.