* [PATCH_v2 0/2] ACFC and PFC options implementation @ 2011-06-27 16:15 Guillaume Zajac 2011-06-27 16:15 ` [PATCH_v2 1/2] GAtPPP: Add ACFC option support Guillaume Zajac 2011-06-27 16:15 ` [PATCH_v2 2/2] GAtPPP: Add PFC " Guillaume Zajac 0 siblings, 2 replies; 5+ messages in thread From: Guillaume Zajac @ 2011-06-27 16:15 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 529 bytes --] Hi, Change log from v2 is: - make compression options application independant from sending or receiving frames - add an option into GAtPPP to disable completely ACFC and PFC Guillaume Zajac (2): GAtPPP: Add ACFC option support GAtPPP: Add PFC option support gatchat/gatppp.c | 145 +++++++++++++++++++++++++++++++++++++++++++++++++---- gatchat/gatppp.h | 3 + gatchat/ppp.h | 12 ++++ gatchat/ppp_lcp.c | 49 ++++++++++++++++-- 4 files changed, 195 insertions(+), 14 deletions(-) ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH_v2 1/2] GAtPPP: Add ACFC option support 2011-06-27 16:15 [PATCH_v2 0/2] ACFC and PFC options implementation Guillaume Zajac @ 2011-06-27 16:15 ` Guillaume Zajac 2011-06-27 16:31 ` Denis Kenzior 2011-06-27 16:15 ` [PATCH_v2 2/2] GAtPPP: Add PFC " Guillaume Zajac 1 sibling, 1 reply; 5+ messages in thread From: Guillaume Zajac @ 2011-06-27 16:15 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 6893 bytes --] --- gatchat/gatppp.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++------- gatchat/gatppp.h | 2 + gatchat/ppp.h | 8 +++++ gatchat/ppp_lcp.c | 28 ++++++++++++++++--- 4 files changed, 103 insertions(+), 14 deletions(-) diff --git a/gatchat/gatppp.c b/gatchat/gatppp.c index 5fb4146..2640985 100644 --- a/gatchat/gatppp.c +++ b/gatchat/gatppp.c @@ -83,6 +83,8 @@ struct _GAtPPP { int fd; guint guard_timeout_source; gboolean suspended; + gboolean force_acfc_off; + gboolean acfc; }; void ppp_debug(GAtPPP *ppp, const char *str) @@ -168,8 +170,19 @@ static inline gboolean ppp_drop_packet(GAtPPP *ppp, guint16 protocol) static void ppp_receive(const unsigned char *buf, gsize len, void *data) { GAtPPP *ppp = data; - guint16 protocol = ppp_proto(buf); - const guint8 *packet = ppp_info(buf); + struct ppp_header *header = (struct ppp_header *) buf; + gboolean acfc_frame = (header->address != PPP_ADDR_FIELD + || header->control != PPP_CTRL); + guint16 protocol; + const guint8 *packet; + + if (acfc_frame) { + protocol = ppp_acfc_proto(buf); + packet = ppp_acfc_info(buf); + } else { + protocol = ppp_proto(buf); + packet = ppp_info(buf); + } if (ppp_drop_packet(ppp, protocol)) return; @@ -196,17 +209,11 @@ static void ppp_receive(const unsigned char *buf, gsize len, void *data) }; } -/* - * transmit out through the lower layer interface - * - * infolen - length of the information part of the packet - */ -void ppp_transmit(GAtPPP *ppp, guint8 *packet, guint infolen) +static void ppp_send_common_frame(GAtPPP *ppp, guint8 *packet, guint infolen, + gboolean lcp) { struct ppp_header *header = (struct ppp_header *) packet; - guint16 proto = ppp_proto(packet); guint8 code; - gboolean lcp = (proto == LCP_PROTOCOL); guint32 xmit_accm = 0; gboolean sta = FALSE; @@ -251,6 +258,44 @@ void ppp_transmit(GAtPPP *ppp, guint8 *packet, guint infolen) g_at_hdlc_set_xmit_accm(ppp->hdlc, xmit_accm); } +static void ppp_send_acfc_frame(GAtPPP *ppp, guint8 *packet, + guint infolen) +{ + struct ppp_header *header = (struct ppp_header *) packet; + guint offset = 0; + + if (ppp->acfc) + offset = 2; + else + offset = 0; + + if (g_at_hdlc_send(ppp->hdlc, packet + offset, + infolen + sizeof(*header) - offset) + == FALSE) + DBG(ppp, "Failed to send a frame\n"); +} + +/* + * transmit out through the lower layer interface + * + * infolen - length of the information part of the packet + */ +void ppp_transmit(GAtPPP *ppp, guint8 *packet, guint infolen) +{ + guint16 proto = ppp_proto(packet); + + switch (proto) { + case LCP_PROTOCOL: + ppp_send_common_frame(ppp, packet, infolen, TRUE); + break; + case CHAP_PROTOCOL: + case IPCP_PROTO: + case PPP_IP_PROTO: + ppp_send_acfc_frame(ppp, packet, infolen); + break; + } +} + static inline void ppp_enter_phase(GAtPPP *ppp, enum ppp_phase phase) { DBG(ppp, "%d", phase); @@ -390,6 +435,14 @@ void ppp_set_mtu(GAtPPP *ppp, const guint8 *data) ppp->mtu = mtu; } +void ppp_set_acfc_enabled(GAtPPP *ppp, gboolean acfc) +{ + if (ppp->force_acfc_off) + ppp->acfc = FALSE; + else + ppp->acfc = acfc; +} + static void io_disconnect(gpointer user_data) { GAtPPP *ppp = user_data; @@ -658,6 +711,12 @@ void g_at_ppp_set_server_info(GAtPPP *ppp, const char *remote, ipcp_set_server_info(ppp->ipcp, r, d1, d2); } +void g_at_ppp_force_acfc_off(GAtPPP *ppp, gboolean off) +{ + ppp->force_acfc_off = off; + lcp_turn_off_acfc(ppp->lcp); +} + static GAtPPP *ppp_init_common(gboolean is_server, guint32 ip) { GAtPPP *ppp; diff --git a/gatchat/gatppp.h b/gatchat/gatppp.h index f0930a7..d0231fc 100644 --- a/gatchat/gatppp.h +++ b/gatchat/gatppp.h @@ -79,6 +79,8 @@ void g_at_ppp_set_recording(GAtPPP *ppp, const char *filename); void g_at_ppp_set_server_info(GAtPPP *ppp, const char *remote_ip, const char *dns1, const char *dns2); +void g_at_ppp_force_acfc_off(GAtPPP *ppp, gboolean off); + #ifdef __cplusplus } #endif diff --git a/gatchat/ppp.h b/gatchat/ppp.h index 023d779..116b5db 100644 --- a/gatchat/ppp.h +++ b/gatchat/ppp.h @@ -85,10 +85,17 @@ static inline void __put_unaligned_short(void *p, guint16 val) #define ppp_proto(packet) \ (get_host_short(packet + 2)) +#define ppp_acfc_info(packet) \ + (packet + 2) + +#define ppp_acfc_proto(packet) \ + (get_host_short(packet)) + /* LCP related functions */ struct pppcp_data *lcp_new(GAtPPP *ppp, gboolean dormant); void lcp_free(struct pppcp_data *lcp); void lcp_protocol_reject(struct pppcp_data *lcp, guint8 *packet, gsize len); +void lcp_turn_off_acfc(struct pppcp_data *pppcp); /* IPCP related functions */ struct pppcp_data *ipcp_new(GAtPPP *ppp, gboolean is_server, guint32 ip); @@ -125,4 +132,5 @@ void ppp_lcp_finished_notify(GAtPPP *ppp); void ppp_set_recv_accm(GAtPPP *ppp, guint32 accm); void ppp_set_xmit_accm(GAtPPP *ppp, guint32 accm); void ppp_set_mtu(GAtPPP *ppp, const guint8 *data); +void ppp_set_acfc_enabled(GAtPPP *ppp, gboolean acfc); struct ppp_header *ppp_packet_new(gsize infolen, guint16 protocol); diff --git a/gatchat/ppp_lcp.c b/gatchat/ppp_lcp.c index ce9dae2..3814ddf 100644 --- a/gatchat/ppp_lcp.c +++ b/gatchat/ppp_lcp.c @@ -58,11 +58,12 @@ enum lcp_options { ACFC = 8, }; -/* Maximum size of all options, we only ever request ACCM and MRU */ -#define MAX_CONFIG_OPTION_SIZE 10 +/* Maximum size of all options, we only ever request ACCM, MRU and ACFC */ +#define MAX_CONFIG_OPTION_SIZE 12 #define REQ_OPTION_ACCM 0x1 #define REQ_OPTION_MRU 0x2 +#define REQ_OPTION_ACFC 0x4 struct lcp_data { guint8 options[MAX_CONFIG_OPTION_SIZE]; @@ -100,13 +101,20 @@ static void lcp_generate_config_options(struct lcp_data *lcp) len += 4; } + if (lcp->req_options & REQ_OPTION_ACFC) { + lcp->options[len] = ACFC; + lcp->options[len + 1] = 2; + + len += 2; + } + lcp->options_len = len; } static void lcp_reset_config_options(struct lcp_data *lcp) { /* Using the default ACCM */ - + lcp->req_options |= REQ_OPTION_ACFC; lcp_generate_config_options(lcp); } @@ -286,9 +294,11 @@ static enum rcr_result lcp_rcr(struct pppcp_data *pppcp, break; case MAGIC_NUMBER: case PFC: - case ACFC: /* don't care */ break; + case ACFC: + ppp_set_acfc_enabled(ppp, TRUE); + break; } } @@ -338,3 +348,13 @@ struct pppcp_data *lcp_new(GAtPPP *ppp, gboolean is_server) return pppcp; } + +void lcp_turn_off_acfc(struct pppcp_data *pppcp) +{ + struct lcp_data *lcp = pppcp_get_data(pppcp); + + lcp->req_options &= ~REQ_OPTION_ACFC; + lcp_generate_config_options(lcp); + + pppcp_set_local_options(pppcp, lcp->options, lcp->options_len); +} -- 1.7.1 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH_v2 1/2] GAtPPP: Add ACFC option support 2011-06-27 16:15 ` [PATCH_v2 1/2] GAtPPP: Add ACFC option support Guillaume Zajac @ 2011-06-27 16:31 ` Denis Kenzior 2011-06-28 9:54 ` Guillaume Zajac 0 siblings, 1 reply; 5+ messages in thread From: Denis Kenzior @ 2011-06-27 16:31 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 8071 bytes --] Hi Guillaume, On 06/27/2011 11:15 AM, Guillaume Zajac wrote: > --- > gatchat/gatppp.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++------- > gatchat/gatppp.h | 2 + > gatchat/ppp.h | 8 +++++ > gatchat/ppp_lcp.c | 28 ++++++++++++++++--- > 4 files changed, 103 insertions(+), 14 deletions(-) > > diff --git a/gatchat/gatppp.c b/gatchat/gatppp.c > index 5fb4146..2640985 100644 > --- a/gatchat/gatppp.c > +++ b/gatchat/gatppp.c > @@ -83,6 +83,8 @@ struct _GAtPPP { > int fd; > guint guard_timeout_source; > gboolean suspended; > + gboolean force_acfc_off; You don't need this variable, see below for more > + gboolean acfc; Please name this xmit_acfc. > }; > > void ppp_debug(GAtPPP *ppp, const char *str) > @@ -168,8 +170,19 @@ static inline gboolean ppp_drop_packet(GAtPPP *ppp, guint16 protocol) > static void ppp_receive(const unsigned char *buf, gsize len, void *data) > { > GAtPPP *ppp = data; > - guint16 protocol = ppp_proto(buf); > - const guint8 *packet = ppp_info(buf); > + struct ppp_header *header = (struct ppp_header *) buf; > + gboolean acfc_frame = (header->address != PPP_ADDR_FIELD > + || header->control != PPP_CTRL); > + guint16 protocol; > + const guint8 *packet; > + > + if (acfc_frame) { > + protocol = ppp_acfc_proto(buf); > + packet = ppp_acfc_info(buf); > + } else { > + protocol = ppp_proto(buf); > + packet = ppp_info(buf); > + } > > if (ppp_drop_packet(ppp, protocol)) > return; > @@ -196,17 +209,11 @@ static void ppp_receive(const unsigned char *buf, gsize len, void *data) > }; > } > > -/* > - * transmit out through the lower layer interface > - * > - * infolen - length of the information part of the packet > - */ > -void ppp_transmit(GAtPPP *ppp, guint8 *packet, guint infolen) > +static void ppp_send_common_frame(GAtPPP *ppp, guint8 *packet, guint infolen, > + gboolean lcp) Shouldn't this be called send_lcp_frame? > { > struct ppp_header *header = (struct ppp_header *) packet; > - guint16 proto = ppp_proto(packet); > guint8 code; > - gboolean lcp = (proto == LCP_PROTOCOL); > guint32 xmit_accm = 0; > gboolean sta = FALSE; > > @@ -251,6 +258,44 @@ void ppp_transmit(GAtPPP *ppp, guint8 *packet, guint infolen) > g_at_hdlc_set_xmit_accm(ppp->hdlc, xmit_accm); > } > > +static void ppp_send_acfc_frame(GAtPPP *ppp, guint8 *packet, > + guint infolen) > +{ > + struct ppp_header *header = (struct ppp_header *) packet; > + guint offset = 0; > + > + if (ppp->acfc) > + offset = 2; > + else > + offset = 0; > + > + if (g_at_hdlc_send(ppp->hdlc, packet + offset, > + infolen + sizeof(*header) - offset) > + == FALSE) > + DBG(ppp, "Failed to send a frame\n"); > +} > + > +/* > + * transmit out through the lower layer interface > + * > + * infolen - length of the information part of the packet > + */ > +void ppp_transmit(GAtPPP *ppp, guint8 *packet, guint infolen) > +{ > + guint16 proto = ppp_proto(packet); > + > + switch (proto) { > + case LCP_PROTOCOL: > + ppp_send_common_frame(ppp, packet, infolen, TRUE); > + break; > + case CHAP_PROTOCOL: > + case IPCP_PROTO: > + case PPP_IP_PROTO: > + ppp_send_acfc_frame(ppp, packet, infolen); > + break; > + } > +} > + > static inline void ppp_enter_phase(GAtPPP *ppp, enum ppp_phase phase) > { > DBG(ppp, "%d", phase); > @@ -390,6 +435,14 @@ void ppp_set_mtu(GAtPPP *ppp, const guint8 *data) > ppp->mtu = mtu; > } > > +void ppp_set_acfc_enabled(GAtPPP *ppp, gboolean acfc) Please name this function ppp_set_xmit_acfc(GAtPPP *ppp, gboolean acfc) > +{ > + if (ppp->force_acfc_off) > + ppp->acfc = FALSE; > + else > + ppp->acfc = acfc; And set ppp->xmit_acfc directly from acfc... > +} > + > static void io_disconnect(gpointer user_data) > { > GAtPPP *ppp = user_data; > @@ -658,6 +711,12 @@ void g_at_ppp_set_server_info(GAtPPP *ppp, const char *remote, > ipcp_set_server_info(ppp->ipcp, r, d1, d2); > } > > +void g_at_ppp_force_acfc_off(GAtPPP *ppp, gboolean off) Please name this function g_at_ppp_set_acfc_enabled(GAtPPP *ppp, gboolean enabled) > +{ > + ppp->force_acfc_off = off; > + lcp_turn_off_acfc(ppp->lcp); To help in regression testing lets turn off ACFC by default, and only enable it if someone has asked for it. > +} > + > static GAtPPP *ppp_init_common(gboolean is_server, guint32 ip) > { > GAtPPP *ppp; > diff --git a/gatchat/gatppp.h b/gatchat/gatppp.h > index f0930a7..d0231fc 100644 > --- a/gatchat/gatppp.h > +++ b/gatchat/gatppp.h > @@ -79,6 +79,8 @@ void g_at_ppp_set_recording(GAtPPP *ppp, const char *filename); > void g_at_ppp_set_server_info(GAtPPP *ppp, const char *remote_ip, > const char *dns1, const char *dns2); > > +void g_at_ppp_force_acfc_off(GAtPPP *ppp, gboolean off); > + > #ifdef __cplusplus > } > #endif > diff --git a/gatchat/ppp.h b/gatchat/ppp.h > index 023d779..116b5db 100644 > --- a/gatchat/ppp.h > +++ b/gatchat/ppp.h > @@ -85,10 +85,17 @@ static inline void __put_unaligned_short(void *p, guint16 val) > #define ppp_proto(packet) \ > (get_host_short(packet + 2)) > > +#define ppp_acfc_info(packet) \ > + (packet + 2) > + > +#define ppp_acfc_proto(packet) \ > + (get_host_short(packet)) > + > /* LCP related functions */ > struct pppcp_data *lcp_new(GAtPPP *ppp, gboolean dormant); > void lcp_free(struct pppcp_data *lcp); > void lcp_protocol_reject(struct pppcp_data *lcp, guint8 *packet, gsize len); > +void lcp_turn_off_acfc(struct pppcp_data *pppcp); > > /* IPCP related functions */ > struct pppcp_data *ipcp_new(GAtPPP *ppp, gboolean is_server, guint32 ip); > @@ -125,4 +132,5 @@ void ppp_lcp_finished_notify(GAtPPP *ppp); > void ppp_set_recv_accm(GAtPPP *ppp, guint32 accm); > void ppp_set_xmit_accm(GAtPPP *ppp, guint32 accm); > void ppp_set_mtu(GAtPPP *ppp, const guint8 *data); > +void ppp_set_acfc_enabled(GAtPPP *ppp, gboolean acfc); > struct ppp_header *ppp_packet_new(gsize infolen, guint16 protocol); > diff --git a/gatchat/ppp_lcp.c b/gatchat/ppp_lcp.c > index ce9dae2..3814ddf 100644 > --- a/gatchat/ppp_lcp.c > +++ b/gatchat/ppp_lcp.c > @@ -58,11 +58,12 @@ enum lcp_options { > ACFC = 8, > }; > > -/* Maximum size of all options, we only ever request ACCM and MRU */ > -#define MAX_CONFIG_OPTION_SIZE 10 > +/* Maximum size of all options, we only ever request ACCM, MRU and ACFC */ > +#define MAX_CONFIG_OPTION_SIZE 12 > > #define REQ_OPTION_ACCM 0x1 > #define REQ_OPTION_MRU 0x2 > +#define REQ_OPTION_ACFC 0x4 > > struct lcp_data { > guint8 options[MAX_CONFIG_OPTION_SIZE]; > @@ -100,13 +101,20 @@ static void lcp_generate_config_options(struct lcp_data *lcp) > len += 4; > } > > + if (lcp->req_options & REQ_OPTION_ACFC) { > + lcp->options[len] = ACFC; > + lcp->options[len + 1] = 2; > + > + len += 2; > + } > + > lcp->options_len = len; > } > > static void lcp_reset_config_options(struct lcp_data *lcp) > { > /* Using the default ACCM */ > - > + lcp->req_options |= REQ_OPTION_ACFC; > lcp_generate_config_options(lcp); > } > > @@ -286,9 +294,11 @@ static enum rcr_result lcp_rcr(struct pppcp_data *pppcp, > break; > case MAGIC_NUMBER: > case PFC: > - case ACFC: > /* don't care */ > break; > + case ACFC: > + ppp_set_acfc_enabled(ppp, TRUE); You can check whether we turned on ACFC by checking whether ACFC option is being advertised to the peer. E.g. lcp->req_options & REQ_OPTION_ACFC... > + break; > } > } > > @@ -338,3 +348,13 @@ struct pppcp_data *lcp_new(GAtPPP *ppp, gboolean is_server) > > return pppcp; > } > + > +void lcp_turn_off_acfc(struct pppcp_data *pppcp) > +{ > + struct lcp_data *lcp = pppcp_get_data(pppcp); > + > + lcp->req_options &= ~REQ_OPTION_ACFC; > + lcp_generate_config_options(lcp); > + > + pppcp_set_local_options(pppcp, lcp->options, lcp->options_len); > +} Regards, -Denis ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH_v2 1/2] GAtPPP: Add ACFC option support 2011-06-27 16:31 ` Denis Kenzior @ 2011-06-28 9:54 ` Guillaume Zajac 0 siblings, 0 replies; 5+ messages in thread From: Guillaume Zajac @ 2011-06-28 9:54 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 8158 bytes --] On 27/06/2011 18:31, Denis Kenzior wrote: > Hi Guillaume, > > On 06/27/2011 11:15 AM, Guillaume Zajac wrote: >> --- >> gatchat/gatppp.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++------- >> gatchat/gatppp.h | 2 + >> gatchat/ppp.h | 8 +++++ >> gatchat/ppp_lcp.c | 28 ++++++++++++++++--- >> 4 files changed, 103 insertions(+), 14 deletions(-) >> >> diff --git a/gatchat/gatppp.c b/gatchat/gatppp.c >> index 5fb4146..2640985 100644 >> --- a/gatchat/gatppp.c >> +++ b/gatchat/gatppp.c >> @@ -83,6 +83,8 @@ struct _GAtPPP { >> int fd; >> guint guard_timeout_source; >> gboolean suspended; >> + gboolean force_acfc_off; > You don't need this variable, see below for more > >> + gboolean acfc; > Please name this xmit_acfc. > >> }; >> >> void ppp_debug(GAtPPP *ppp, const char *str) >> @@ -168,8 +170,19 @@ static inline gboolean ppp_drop_packet(GAtPPP *ppp, guint16 protocol) >> static void ppp_receive(const unsigned char *buf, gsize len, void *data) >> { >> GAtPPP *ppp = data; >> - guint16 protocol = ppp_proto(buf); >> - const guint8 *packet = ppp_info(buf); >> + struct ppp_header *header = (struct ppp_header *) buf; >> + gboolean acfc_frame = (header->address != PPP_ADDR_FIELD >> + || header->control != PPP_CTRL); >> + guint16 protocol; >> + const guint8 *packet; >> + >> + if (acfc_frame) { >> + protocol = ppp_acfc_proto(buf); >> + packet = ppp_acfc_info(buf); >> + } else { >> + protocol = ppp_proto(buf); >> + packet = ppp_info(buf); >> + } >> >> if (ppp_drop_packet(ppp, protocol)) >> return; >> @@ -196,17 +209,11 @@ static void ppp_receive(const unsigned char *buf, gsize len, void *data) >> }; >> } >> >> -/* >> - * transmit out through the lower layer interface >> - * >> - * infolen - length of the information part of the packet >> - */ >> -void ppp_transmit(GAtPPP *ppp, guint8 *packet, guint infolen) >> +static void ppp_send_common_frame(GAtPPP *ppp, guint8 *packet, guint infolen, >> + gboolean lcp) > Shouldn't this be called send_lcp_frame? Yes sorry I had an issue with git reflog. I will fix it in next version. >> { >> struct ppp_header *header = (struct ppp_header *) packet; >> - guint16 proto = ppp_proto(packet); >> guint8 code; >> - gboolean lcp = (proto == LCP_PROTOCOL); >> guint32 xmit_accm = 0; >> gboolean sta = FALSE; >> >> @@ -251,6 +258,44 @@ void ppp_transmit(GAtPPP *ppp, guint8 *packet, guint infolen) >> g_at_hdlc_set_xmit_accm(ppp->hdlc, xmit_accm); >> } >> >> +static void ppp_send_acfc_frame(GAtPPP *ppp, guint8 *packet, >> + guint infolen) >> +{ >> + struct ppp_header *header = (struct ppp_header *) packet; >> + guint offset = 0; >> + >> + if (ppp->acfc) >> + offset = 2; >> + else >> + offset = 0; >> + >> + if (g_at_hdlc_send(ppp->hdlc, packet + offset, >> + infolen + sizeof(*header) - offset) >> + == FALSE) >> + DBG(ppp, "Failed to send a frame\n"); >> +} >> + >> +/* >> + * transmit out through the lower layer interface >> + * >> + * infolen - length of the information part of the packet >> + */ >> +void ppp_transmit(GAtPPP *ppp, guint8 *packet, guint infolen) >> +{ >> + guint16 proto = ppp_proto(packet); >> + >> + switch (proto) { >> + case LCP_PROTOCOL: >> + ppp_send_common_frame(ppp, packet, infolen, TRUE); >> + break; >> + case CHAP_PROTOCOL: >> + case IPCP_PROTO: >> + case PPP_IP_PROTO: >> + ppp_send_acfc_frame(ppp, packet, infolen); >> + break; >> + } >> +} >> + >> static inline void ppp_enter_phase(GAtPPP *ppp, enum ppp_phase phase) >> { >> DBG(ppp, "%d", phase); >> @@ -390,6 +435,14 @@ void ppp_set_mtu(GAtPPP *ppp, const guint8 *data) >> ppp->mtu = mtu; >> } >> >> +void ppp_set_acfc_enabled(GAtPPP *ppp, gboolean acfc) > Please name this function ppp_set_xmit_acfc(GAtPPP *ppp, gboolean acfc) > >> +{ >> + if (ppp->force_acfc_off) >> + ppp->acfc = FALSE; >> + else >> + ppp->acfc = acfc; > And set ppp->xmit_acfc directly from acfc... > >> +} >> + >> static void io_disconnect(gpointer user_data) >> { >> GAtPPP *ppp = user_data; >> @@ -658,6 +711,12 @@ void g_at_ppp_set_server_info(GAtPPP *ppp, const char *remote, >> ipcp_set_server_info(ppp->ipcp, r, d1, d2); >> } >> >> +void g_at_ppp_force_acfc_off(GAtPPP *ppp, gboolean off) > Please name this function g_at_ppp_set_acfc_enabled(GAtPPP *ppp, > gboolean enabled) > >> +{ >> + ppp->force_acfc_off = off; >> + lcp_turn_off_acfc(ppp->lcp); > To help in regression testing lets turn off ACFC by default, and only > enable it if someone has asked for it. > >> +} >> + >> static GAtPPP *ppp_init_common(gboolean is_server, guint32 ip) >> { >> GAtPPP *ppp; >> diff --git a/gatchat/gatppp.h b/gatchat/gatppp.h >> index f0930a7..d0231fc 100644 >> --- a/gatchat/gatppp.h >> +++ b/gatchat/gatppp.h >> @@ -79,6 +79,8 @@ void g_at_ppp_set_recording(GAtPPP *ppp, const char *filename); >> void g_at_ppp_set_server_info(GAtPPP *ppp, const char *remote_ip, >> const char *dns1, const char *dns2); >> >> +void g_at_ppp_force_acfc_off(GAtPPP *ppp, gboolean off); >> + >> #ifdef __cplusplus >> } >> #endif >> diff --git a/gatchat/ppp.h b/gatchat/ppp.h >> index 023d779..116b5db 100644 >> --- a/gatchat/ppp.h >> +++ b/gatchat/ppp.h >> @@ -85,10 +85,17 @@ static inline void __put_unaligned_short(void *p, guint16 val) >> #define ppp_proto(packet) \ >> (get_host_short(packet + 2)) >> >> +#define ppp_acfc_info(packet) \ >> + (packet + 2) >> + >> +#define ppp_acfc_proto(packet) \ >> + (get_host_short(packet)) >> + >> /* LCP related functions */ >> struct pppcp_data *lcp_new(GAtPPP *ppp, gboolean dormant); >> void lcp_free(struct pppcp_data *lcp); >> void lcp_protocol_reject(struct pppcp_data *lcp, guint8 *packet, gsize len); >> +void lcp_turn_off_acfc(struct pppcp_data *pppcp); >> >> /* IPCP related functions */ >> struct pppcp_data *ipcp_new(GAtPPP *ppp, gboolean is_server, guint32 ip); >> @@ -125,4 +132,5 @@ void ppp_lcp_finished_notify(GAtPPP *ppp); >> void ppp_set_recv_accm(GAtPPP *ppp, guint32 accm); >> void ppp_set_xmit_accm(GAtPPP *ppp, guint32 accm); >> void ppp_set_mtu(GAtPPP *ppp, const guint8 *data); >> +void ppp_set_acfc_enabled(GAtPPP *ppp, gboolean acfc); >> struct ppp_header *ppp_packet_new(gsize infolen, guint16 protocol); >> diff --git a/gatchat/ppp_lcp.c b/gatchat/ppp_lcp.c >> index ce9dae2..3814ddf 100644 >> --- a/gatchat/ppp_lcp.c >> +++ b/gatchat/ppp_lcp.c >> @@ -58,11 +58,12 @@ enum lcp_options { >> ACFC = 8, >> }; >> >> -/* Maximum size of all options, we only ever request ACCM and MRU */ >> -#define MAX_CONFIG_OPTION_SIZE 10 >> +/* Maximum size of all options, we only ever request ACCM, MRU and ACFC */ >> +#define MAX_CONFIG_OPTION_SIZE 12 >> >> #define REQ_OPTION_ACCM 0x1 >> #define REQ_OPTION_MRU 0x2 >> +#define REQ_OPTION_ACFC 0x4 >> >> struct lcp_data { >> guint8 options[MAX_CONFIG_OPTION_SIZE]; >> @@ -100,13 +101,20 @@ static void lcp_generate_config_options(struct lcp_data *lcp) >> len += 4; >> } >> >> + if (lcp->req_options& REQ_OPTION_ACFC) { >> + lcp->options[len] = ACFC; >> + lcp->options[len + 1] = 2; >> + >> + len += 2; >> + } >> + >> lcp->options_len = len; >> } >> >> static void lcp_reset_config_options(struct lcp_data *lcp) >> { >> /* Using the default ACCM */ >> - >> + lcp->req_options |= REQ_OPTION_ACFC; >> lcp_generate_config_options(lcp); >> } >> >> @@ -286,9 +294,11 @@ static enum rcr_result lcp_rcr(struct pppcp_data *pppcp, >> break; >> case MAGIC_NUMBER: >> case PFC: >> - case ACFC: >> /* don't care */ >> break; >> + case ACFC: >> + ppp_set_acfc_enabled(ppp, TRUE); > You can check whether we turned on ACFC by checking whether ACFC option > is being advertised to the peer. E.g. lcp->req_options& REQ_OPTION_ACFC... Ok I will do it this way. Then I will add ACFC and PFC options activation into emulator and gsmdial. Kind regards, Guillaume ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH_v2 2/2] GAtPPP: Add PFC option support 2011-06-27 16:15 [PATCH_v2 0/2] ACFC and PFC options implementation Guillaume Zajac 2011-06-27 16:15 ` [PATCH_v2 1/2] GAtPPP: Add ACFC option support Guillaume Zajac @ 2011-06-27 16:15 ` Guillaume Zajac 1 sibling, 0 replies; 5+ messages in thread From: Guillaume Zajac @ 2011-06-27 16:15 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 7183 bytes --] --- gatchat/gatppp.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++- gatchat/gatppp.h | 1 + gatchat/ppp.h | 4 +++ gatchat/ppp_lcp.c | 27 ++++++++++++++++++-- 4 files changed, 96 insertions(+), 4 deletions(-) diff --git a/gatchat/gatppp.c b/gatchat/gatppp.c index 2640985..2a0159f 100644 --- a/gatchat/gatppp.c +++ b/gatchat/gatppp.c @@ -84,7 +84,9 @@ struct _GAtPPP { guint guard_timeout_source; gboolean suspended; gboolean force_acfc_off; + gboolean force_pfc_off; gboolean acfc; + gboolean pfc; }; void ppp_debug(GAtPPP *ppp, const char *str) @@ -173,6 +175,7 @@ static void ppp_receive(const unsigned char *buf, gsize len, void *data) struct ppp_header *header = (struct ppp_header *) buf; gboolean acfc_frame = (header->address != PPP_ADDR_FIELD || header->control != PPP_CTRL); + gboolean pfc_frame = FALSE; guint16 protocol; const guint8 *packet; @@ -184,6 +187,20 @@ static void ppp_receive(const unsigned char *buf, gsize len, void *data) packet = ppp_info(buf); } + pfc_frame = (protocol != LCP_PROTOCOL && protocol != CHAP_PROTOCOL && + protocol != IPCP_PROTO && protocol != PPP_IP_PROTO); + + if (pfc_frame) { + guint8 proto = (protocol >> 8) & 0xFF ; + packet = packet - 1; + /* + * The only protocol that can be compressed is PPP_IP_PROTO + * because first byte is 0x00. + */ + if (proto == PPP_IP_COMPRESSED_PROTO) + protocol = PPP_IP_PROTO; + } + if (ppp_drop_packet(ppp, protocol)) return; @@ -268,6 +285,32 @@ static void ppp_send_acfc_frame(GAtPPP *ppp, guint8 *packet, offset = 2; else offset = 0; + /* We remove the only address and control field */ + if (g_at_hdlc_send(ppp->hdlc, packet + offset, + infolen + sizeof(*header) - offset) + == FALSE) + DBG(ppp, "Failed to send a frame\n"); +} + +static void ppp_send_acfc_pfc_frame(GAtPPP *ppp, guint8 *packet, + guint infolen) +{ + struct ppp_header *header = (struct ppp_header *) packet; + guint offset = 0; + + if (ppp->acfc && ppp->pfc) + offset = 3; + else if (ppp->acfc) + offset = 2; + else if (ppp->pfc) { + /* + * We remove only the 1st byte that is 0x00 of protocol field. + */ + packet[2] = packet[1]; + packet[1] = packet[0]; + offset = 1; + } else + offset = 0; if (g_at_hdlc_send(ppp->hdlc, packet + offset, infolen + sizeof(*header) - offset) @@ -286,13 +329,22 @@ void ppp_transmit(GAtPPP *ppp, guint8 *packet, guint infolen) switch (proto) { case LCP_PROTOCOL: + /* Don't use any compression for LCP packets */ ppp_send_common_frame(ppp, packet, infolen, TRUE); break; case CHAP_PROTOCOL: case IPCP_PROTO: - case PPP_IP_PROTO: + /* + * We can't use PFC option because first byte of CHAP_PROTOCOL + * and IPCP_PROTO is not equal to 0x00 + */ ppp_send_acfc_frame(ppp, packet, infolen); break; + case PPP_IP_PROTO: + /* + * We can't use both compression options if they are negotiated + */ + ppp_send_acfc_pfc_frame(ppp, packet, infolen); } } @@ -443,6 +495,14 @@ void ppp_set_acfc_enabled(GAtPPP *ppp, gboolean acfc) ppp->acfc = acfc; } +void ppp_set_pfc_enabled(GAtPPP *ppp, gboolean pfc) +{ + if (ppp->force_pfc_off) + ppp->pfc = FALSE; + else + ppp->pfc = pfc; +} + static void io_disconnect(gpointer user_data) { GAtPPP *ppp = user_data; @@ -717,6 +777,12 @@ void g_at_ppp_force_acfc_off(GAtPPP *ppp, gboolean off) lcp_turn_off_acfc(ppp->lcp); } +void g_at_ppp_force_pfc_off(GAtPPP *ppp, gboolean off) +{ + ppp->force_acfc_off = off; + lcp_turn_off_pfc(ppp->lcp); +} + static GAtPPP *ppp_init_common(gboolean is_server, guint32 ip) { GAtPPP *ppp; diff --git a/gatchat/gatppp.h b/gatchat/gatppp.h index d0231fc..b7933d3 100644 --- a/gatchat/gatppp.h +++ b/gatchat/gatppp.h @@ -80,6 +80,7 @@ void g_at_ppp_set_server_info(GAtPPP *ppp, const char *remote_ip, const char *dns1, const char *dns2); void g_at_ppp_force_acfc_off(GAtPPP *ppp, gboolean off); +void g_at_ppp_force_pfc_off(GAtPPP *ppp, gboolean off); #ifdef __cplusplus } diff --git a/gatchat/ppp.h b/gatchat/ppp.h index 116b5db..3a0b2bf 100644 --- a/gatchat/ppp.h +++ b/gatchat/ppp.h @@ -27,6 +27,8 @@ #define PPP_IP_PROTO 0x0021 #define MD5 5 +#define PPP_IP_COMPRESSED_PROTO 0x21 + #define DBG(p, fmt, arg...) do { \ char *str = g_strdup_printf("%s:%s() " fmt, __FILE__, \ __FUNCTION__ , ## arg); \ @@ -96,6 +98,7 @@ struct pppcp_data *lcp_new(GAtPPP *ppp, gboolean dormant); void lcp_free(struct pppcp_data *lcp); void lcp_protocol_reject(struct pppcp_data *lcp, guint8 *packet, gsize len); void lcp_turn_off_acfc(struct pppcp_data *pppcp); +void lcp_turn_off_pfc(struct pppcp_data *pppcp); /* IPCP related functions */ struct pppcp_data *ipcp_new(GAtPPP *ppp, gboolean is_server, guint32 ip); @@ -133,4 +136,5 @@ void ppp_set_recv_accm(GAtPPP *ppp, guint32 accm); void ppp_set_xmit_accm(GAtPPP *ppp, guint32 accm); void ppp_set_mtu(GAtPPP *ppp, const guint8 *data); void ppp_set_acfc_enabled(GAtPPP *ppp, gboolean acfc); +void ppp_set_pfc_enabled(GAtPPP *ppp, gboolean acfc); struct ppp_header *ppp_packet_new(gsize infolen, guint16 protocol); diff --git a/gatchat/ppp_lcp.c b/gatchat/ppp_lcp.c index 3814ddf..18dfea4 100644 --- a/gatchat/ppp_lcp.c +++ b/gatchat/ppp_lcp.c @@ -58,12 +58,13 @@ enum lcp_options { ACFC = 8, }; -/* Maximum size of all options, we only ever request ACCM, MRU and ACFC */ -#define MAX_CONFIG_OPTION_SIZE 12 +/* Maximum size of all options, we only ever request ACCM, MRU, ACFC and PFC */ +#define MAX_CONFIG_OPTION_SIZE 14 #define REQ_OPTION_ACCM 0x1 #define REQ_OPTION_MRU 0x2 #define REQ_OPTION_ACFC 0x4 +#define REQ_OPTION_PFC 0x8 struct lcp_data { guint8 options[MAX_CONFIG_OPTION_SIZE]; @@ -108,6 +109,13 @@ static void lcp_generate_config_options(struct lcp_data *lcp) len += 2; } + if (lcp->req_options & REQ_OPTION_PFC) { + lcp->options[len] = PFC; + lcp->options[len + 1] = 2; + + len += 2; + } + lcp->options_len = len; } @@ -115,6 +123,7 @@ static void lcp_reset_config_options(struct lcp_data *lcp) { /* Using the default ACCM */ lcp->req_options |= REQ_OPTION_ACFC; + lcp->req_options |= REQ_OPTION_PFC; lcp_generate_config_options(lcp); } @@ -293,9 +302,11 @@ static enum rcr_result lcp_rcr(struct pppcp_data *pppcp, ppp_set_mtu(ppp, ppp_option_iter_get_data(&iter)); break; case MAGIC_NUMBER: - case PFC: /* don't care */ break; + case PFC: + ppp_set_pfc_enabled(ppp, TRUE); + break; case ACFC: ppp_set_acfc_enabled(ppp, TRUE); break; @@ -358,3 +369,13 @@ void lcp_turn_off_acfc(struct pppcp_data *pppcp) pppcp_set_local_options(pppcp, lcp->options, lcp->options_len); } + +void lcp_turn_off_pfc(struct pppcp_data *pppcp) +{ + struct lcp_data *lcp = pppcp_get_data(pppcp); + + lcp->req_options &= ~REQ_OPTION_PFC; + lcp_generate_config_options(lcp); + + pppcp_set_local_options(pppcp, lcp->options, lcp->options_len); +} -- 1.7.1 ^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2011-06-28 9:54 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2011-06-27 16:15 [PATCH_v2 0/2] ACFC and PFC options implementation Guillaume Zajac 2011-06-27 16:15 ` [PATCH_v2 1/2] GAtPPP: Add ACFC option support Guillaume Zajac 2011-06-27 16:31 ` Denis Kenzior 2011-06-28 9:54 ` Guillaume Zajac 2011-06-27 16:15 ` [PATCH_v2 2/2] GAtPPP: Add PFC " Guillaume Zajac
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.