Open Source Telephony
 help / color / mirror / Atom feed
From: Denis Kenzior <denkenz@gmail.com>
To: ofono@ofono.org
Subject: Re: [PATCH 2/6] gatppp: Add PPP server extension
Date: Wed, 23 Jun 2010 18:19:38 -0500	[thread overview]
Message-ID: <201006231819.38520.denkenz@gmail.com> (raw)
In-Reply-To: <1277286402-22312-3-git-send-email-zhenhua.zhang@intel.com>

[-- Attachment #1: Type: text/plain, Size: 5305 bytes --]

Hi Zhenhua,

> 1. Add interface to set PPP server info by g_at_ppp_set_server_info.
> 2. Pass local and peer address through IPCP handshaking.

Ok getting pretty close now :)

> +static void ipcp_reset_server_config_options(struct ipcp_data *ipcp)
> +{
> +	ipcp->req_options = REQ_OPTION_IPADDR;

Might want to only request IP Addr if local_addr is not zero.  Just like in 
set_server_info.

> +
> +	ipcp_generate_config_options(ipcp);
> +}
> +

<snip>

> @@ -167,7 +211,7 @@ static void ipcp_rca(struct pppcp_data *pppcp,
> 
>  		switch (ppp_option_iter_get_type(&iter)) {
>  		case IP_ADDRESS:
> -			memcpy(&ipcp->ipaddr, data, 4);
> +			memcpy(&ipcp->local_addr, data, 4);
>  			break;
>  		case PRIMARY_DNS_SERVER:
>  			memcpy(&ipcp->dns1, data, 4);

You might not want to do anything here in the case of a server role.

> @@ -204,7 +248,7 @@ static void ipcp_rcn_nak(struct pppcp_data *pppcp,
>  		case IP_ADDRESS:
>  			g_print("Setting suggested ip addr\n");
>  			ipcp->req_options |= REQ_OPTION_IPADDR;
> -			memcpy(&ipcp->ipaddr, data, 4);
> +			memcpy(&ipcp->local_addr, data, 4);
>  			break;
>  		case PRIMARY_DNS_SERVER:
>  			g_print("Setting suggested dns1\n");

Again, probably don't want to set the local_addr in the case of a server role.

> @@ -269,17 +313,102 @@ static void ipcp_rcn_rej(struct pppcp_data *pppcp,
>  	pppcp_set_local_options(pppcp, ipcp->options, ipcp->options_len);
>  }
> 
> +static guint8 *ipcp_generate_peer_config_options(struct ipcp_data *ipcp,
> +							guint16 *new_len)
> +{
> +	guint8 *options;
> +	guint16 len = 0;
> +
> +	options = g_try_new0(guint8, MAX_CONFIG_OPTION_SIZE);
> +	if (!options)
> +		return NULL;
> +
> +	FILL_IP(options, TRUE, IP_ADDRESS, &ipcp->peer_addr);
> +	FILL_IP(options, TRUE, PRIMARY_DNS_SERVER, &ipcp->dns1);
> +	FILL_IP(options, TRUE, SECONDARY_DNS_SERVER, &ipcp->dns2);
> +	FILL_IP(options, TRUE, PRIMARY_NBNS_SERVER, &ipcp->nbns1);
> +	FILL_IP(options, TRUE, SECONDARY_NBNS_SERVER, &ipcp->nbns2);
> +
> +	*new_len = MAX_CONFIG_OPTION_SIZE;

Don't use MAX_CONFIG_OPTION_SIZE, instead use len (which is filled properly by 
the FILL_IP macro)  Also, we shouldn't bother supporting NBNS, lets never 
suggest those options as a server or set them in set_server_info.

> +
> +	return options;
> +}
> +
>  static enum rcr_result ipcp_rcr(struct pppcp_data *pppcp,
>  					const struct pppcp_packet *packet,
>  					guint8 **new_options, guint16 *new_len)
>  {
>  	struct ppp_option_iter iter;
> +	struct ipcp_data *ipcp = pppcp_get_data(pppcp);
> +	guint32 peer_addr = 0;
> +	guint32 dns1 = 0;
> +	guint32 dns2 = 0;
> +	guint32 nbns1 = 0;
> +	guint32 nbns2 = 0;
> 
>  	ppp_option_iter_init(&iter, packet);
> 
> -	if (ppp_option_iter_next(&iter) == FALSE)
> +	while (ppp_option_iter_next(&iter) == TRUE) {
> +		const guint8 *data = ppp_option_iter_get_data(&iter);
> +
> +		switch (ppp_option_iter_get_type(&iter)) {
> +		case IP_ADDRESS:
> +			memcpy(&peer_addr, data, 4);
> +			break;
> +		case PRIMARY_DNS_SERVER:
> +			memcpy(&dns1, data, 4);
> +			break;
> +		case SECONDARY_DNS_SERVER:
> +			memcpy(&dns2, data, 4);
> +			break;
> +		case PRIMARY_NBNS_SERVER:
> +			memcpy(&nbns1, data, 4);
> +			break;
> +		case SECONDARY_NBNS_SERVER:
> +			memcpy(&nbns2, data, 4);
> +			break;
> +		default:
> +			break;
> +		}
> +	}
> +

As mentioned above, if Primary / Secondary NBNS server is sent by the client, 
we need to Conf-Rej just those options to the client.  Any other unrecognized 
options should also be Conf-Rejected.  The order is important here, read the 
spec for details.  The IP Address, DNS1/DNS2 should not be Conf-Rejected.

> +	if (ipcp->is_server) {
> +		guint8 *options;
> +		guint16 len;
> +
> +		/* Reject if we have not assign client address yet */
> +		if (ipcp->peer_addr == 0 && ipcp->dns1 == 0 && ipcp->dns2 == 0)
> +			goto reject;

Actually you should be NAKing here, not Rejecting.  Reject means you don't 
support this option at all.

> +
> +		/* Acknowledge client options if it matches with server options
> +		 */
> +		if (ipcp->peer_addr == peer_addr &&
> +				ipcp->dns1 == dns1 && ipcp->dns2 == dns2 &&
> +				ipcp->nbns1 == nbns1 && ipcp->nbns2 == nbns2)
> +			return RCR_ACCEPT;
> +
> +		/* Send client IP/DNS/NBNS information in the config options */
> +		options = ipcp_generate_peer_config_options(ipcp, &len);
> +		if (!options)
> +			goto reject;
> +
> +		*new_len = len;
> +		*new_options = options;
> +
> +		return RCR_NAK;
> +	}
> +
> +	/* Client */
> +	if (peer_addr && ipcp->peer_addr == 0) {
> +		/* RFC 1332 section 3.3
> +		 * As client, accept the server IP as peer's address
> +		 */
> +		ipcp->peer_addr = peer_addr;
> +
>  		return RCR_ACCEPT;
> +	}
> 
> +reject:
>  	/* Reject all options */
>  	*new_len = ntohs(packet->length) - sizeof(*packet);
>  	*new_options = g_memdup(packet->data, *new_len);
> @@ -317,7 +446,7 @@ struct pppcp_data *ipcp_new(GAtPPP *ppp)
>  	}
> 
>  	pppcp_set_data(pppcp, ipcp);
> -	ipcp_reset_config_options(ipcp);
> +	ipcp_reset_client_config_options(ipcp);
>  	pppcp_set_local_options(pppcp, ipcp->options, ipcp->options_len);
> 
>  	return pppcp;
> 

Regards,
-Denis

  parent reply	other threads:[~2010-06-23 23:19 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-06-23  9:46 [PATCH 0/6] Add PPP server support Zhenhua Zhang
2010-06-23  9:46 ` [PATCH 1/6] ppp: Fix incorrect packet length for little-endian Zhenhua Zhang
2010-06-23  9:46   ` [PATCH 2/6] gatppp: Add PPP server extension Zhenhua Zhang
2010-06-23  9:46     ` [PATCH 3/6] atmodem: Fix GAtPPPConnectFunc interface change Zhenhua Zhang
2010-06-23  9:46       ` [PATCH 4/6] test-server: Add PPP server support Zhenhua Zhang
2010-06-23  9:46         ` [PATCH 5/6] test-server: Configure network interface Zhenhua Zhang
2010-06-23  9:46           ` [PATCH 6/6] gsmdial: Configure network interface for PPP Zhenhua Zhang
2010-06-23 23:19     ` Denis Kenzior [this message]
2010-06-24  6:23       ` [PATCH 2/6] gatppp: Add PPP server extension Zhang, Zhenhua
2010-06-24  6:26         ` Zhang, Zhenhua
2010-06-23 23:20   ` [PATCH 1/6] ppp: Fix incorrect packet length for little-endian Denis Kenzior

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=201006231819.38520.denkenz@gmail.com \
    --to=denkenz@gmail.com \
    --cc=ofono@ofono.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox