ppp: use default ACCM when sending LCP codes 1-7

According to the spec, you must transmit all Link Configuration,
Termination, and Code-Reject packets as if no options had been
negotiated.  This requires that when encoding we use the
default ACCM of 0xffffffff when sending these types of packets.
This commit is contained in:
Kristen Carlson Accardi 2010-04-26 11:44:36 -07:00 committed by Denis Kenzior
parent fce78feb54
commit a9c0be7339
3 changed files with 20 additions and 0 deletions

View File

@ -124,6 +124,7 @@ static struct frame_buffer *ppp_encode(GAtPPP *ppp, guint8 *data, int len)
int i = 0;
guint16 fcs = PPPINITFCS16;
guint16 proto = get_host_short(data);
guint8 code;
gboolean lcp = (proto == LCP_PROTOCOL);
guint8 *frame;
struct frame_buffer *fb =
@ -133,6 +134,15 @@ static struct frame_buffer *ppp_encode(GAtPPP *ppp, guint8 *data, int len)
return NULL;
frame = fb->bytes;
/*
* all LCP Link Configuration, Link Termination, and Code-Reject
* packets must be sent with the default sending ACCM
*/
if (lcp) {
code = pppcp_get_code(data);
lcp = code > 0 && code < 8;
}
/* copy in the HDLC framing */
frame[pos++] = PPP_FLAG_SEQ;

View File

@ -267,6 +267,14 @@ const guint8 *ppp_option_iter_get_data(struct ppp_option_iter *iter)
return iter->option_data;
}
guint8 pppcp_get_code(const guint8 *data)
{
struct ppp_header *ppp_packet = (struct ppp_header *) data;
struct pppcp_packet *packet = (struct pppcp_packet *) ppp_packet->info;
return packet->code;
}
static gboolean pppcp_timeout(gpointer user_data)
{
struct pppcp_timer_data *timer_data = user_data;

View File

@ -110,6 +110,8 @@ void pppcp_set_data(struct pppcp_data *pppcp, gpointer data);
gpointer pppcp_get_data(struct pppcp_data *pppcp);
GAtPPP *pppcp_get_ppp(struct pppcp_data *pppcp);
guint8 pppcp_get_code(const guint8 *data);
void pppcp_set_local_options(struct pppcp_data *data,
const guint8 *options,
guint16 len);