From: Oleg Zhurakivskyy <oleg.zhurakivskyy@intel.com>
To: ofono@ofono.org
Subject: Re: [PATCH 1/1] gatchat: Add IPv6 CP support
Date: Wed, 02 Nov 2011 12:29:10 +0200 [thread overview]
Message-ID: <4EB11B76.9020808@intel.com> (raw)
In-Reply-To: <4EAE5193.2080709@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 4819 bytes --]
Hello Denis,
On 10/31/2011 09:43 AM, Denis Kenzior wrote:
> This looks like a good start. However, please separate this patch into
> several, like this:
>
> - One adding the bulk of IPv6CP protocol
> - One for hooks in gatppp itself& ipv6cp
> - One for gsmdial
> - One for test-server.
Sure, will structure like that.
> Can IPV6CP and IPCP co-exist? In theory there is such a concept as
> dual-stack contexts, however I don't know whether any modem in existence
> does this with PPP.
Incidentally, I was thinking about this too. I already made IPCP and IPv6CP to
co-exist, will post it together with corrections in the next version.
>> +void g_at_ppp_set_ipv6cp_info(GAtPPP *ppp, const char *local, const char *peer)
>> +{
>> + struct in6_addr local_addr;
>> + struct in6_addr peer_addr;
>> +
>> + if (local)
>> + inet_pton(AF_INET6, local,&local_addr);
>> + else
>> + memset(&local_addr, 0, sizeof(local_addr));
>> +
>
> What if inet_pton fails?
Sure, I will improve this.
>> +struct eui64 {
[...]
>> +};
>
> I really don't like this actually. I would either simply use an
> unsigned char[8] array or use guint64.
Sure, simple guint8[8] will do.
>> +struct pppcp_data *ipv6cp_new(GAtPPP *ppp, const struct eui64 *local_addr,
>> + const struct eui64 *peer_addr);
>
> Thinking more about it, why don't you make this function take const char
> * arguments instead, and hide away all the nasty details inside
> ipv6cp.c? This way all these funky structs are hidden away in the
> implementation, and you can use whatever is the most convenient.
Good point, I will correct.
>> +enum ipv6cp_option_types {
>> + IPV6CP_INTERFACE_ID = 1,
>> + IPV6CP_COMPRESSION_PROTO = 2,
>
> The latest RFC 5072 doesn't even have this option, so you can probably
> get rid of it.
OK.
>> +static enum rcr_result ipv6cp_peer_addr_check(struct ipv6cp_data *ipv6cp,
>> + const void *data)
>> +{
>> + if (memcmp(&eui64_any, data, sizeof(eui64_any)) == 0)
>> + return RCR_NAK;
>> +
>
> If we're playing the server role, then we might want to NAK non-zero
> peer interface ids as well.
OK.
>> +static enum rcr_result ipv6cp_rcr(struct pppcp_data *pppcp,
>> + const struct pppcp_packet *packet,
>> + guint8 **new_options, guint16 *new_len)
>
> Is there a particular reason you did not structure this function in the
> same manner as ipcp_server/client_rcr? They are pretty much optimized
> with no allocations on the fast (non-reject) path and I'd like to have
> consistency in the code.
I tried to simplify this a bit, and to get rid of the client-server separation,
if possible. I missed the point that the fast path is optimized.
Anyway, thanks for the explanation, I will separate into client and server and
make sure there aren't extra allocations on the fast path.
>> +static void ipv6cp_rcn_nak(struct pppcp_data *pppcp,
>> + const struct pppcp_packet *packet)
>> +{
>> + struct ipv6cp_data *ipv6cp = pppcp_get_data(pppcp);
>> + struct ppp_option_iter iter;
>> +
>> + ppp_option_iter_init(&iter, packet);
>> +
>
> We have to be a bit careful here, if we are playing the server role then
> we should not let the client dictate our interface ID. The reason being
> that e.g. ConnMan might be allocating our interface ids from its own
> pool and we can't really change it at this point.
OK, thanks for the input here, I will take this into account.
>> + while (ppp_option_iter_next(&iter) == TRUE) {
>> + const guint8 *data = ppp_option_iter_get_data(&iter);
>> +
>> + switch (ppp_option_iter_get_type(&iter)) {
>> + case IPV6CP_INTERFACE_ID:
>> + memcpy(&ipv6cp->local_addr, data,
>> + sizeof(ipv6cp->local_addr));
>
> You might also want to make sure to set the flag to request the
> interface id, though this is more of a problem with IPCP.
OK, will check this.
>> + while (ppp_option_iter_next(&iter) == TRUE) {
>> + switch (ppp_option_iter_get_type(&iter)) {
>> + case IPV6CP_INTERFACE_ID:
>> + ipv6cp->req_options&= ~IPV6CP_INTERFACE_ID;
>> + memset(&ipv6cp->local_addr, 0,
>> + sizeof(ipv6cp->local_addr));
>
> This means that the peer refused to configure this option, it doesn't
> mean that our idea of our interface (e.g. if we're the server) should be
> reset...
Will check this too.
>> + g_print("\ttest-server [-t type] [-6 addr]\n");
>
> Hm, this message makes no sense.
This was added for testing purposes, just in order to test if both ends can
exchange the IDs. I will remove it, if it's not necessary.
Thanks for the comments, I will prepare and send another set.
Regards,
Oleg
--
Intel Finland Oy
Registered Address: PL 281, 00181 Helsinki
Business Identity Code: 0357606 - 4
Domiciled in Helsinki
prev parent reply other threads:[~2011-11-02 10:29 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-10-26 14:20 [PATCH 0/1] Initial patches for gatchat IPv6 CP support Oleg Zhurakivskyy
2011-10-26 14:20 ` [PATCH 1/1] gatchat: Add " Oleg Zhurakivskyy
2011-10-31 7:43 ` Denis Kenzior
2011-11-02 10:29 ` Oleg Zhurakivskyy [this message]
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=4EB11B76.9020808@intel.com \
--to=oleg.zhurakivskyy@intel.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 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.