[[!meta copyright="Copyright © 2007, 2008, 2010, 2012, 2013 Free Software
Foundation, Inc."]]

[[!meta license="""[[!toggle id="license" text="GFDL 1.2+"]][[!toggleable
id="license" text="Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation License, Version 1.2 or
any later version published by the Free Software Foundation; with no Invariant
Sections, no Front-Cover Texts, and no Back-Cover Texts.  A copy of the license
is included in the section entitled [[GNU Free Documentation
License|/fdl]]."]]"""]]

[[Stefan_Siegl|stesie]] has added IPv6 support to the pfinet [[translator]].
This was [[!GNU_Savannah_task 5470]].


# Implementation

Because the IPv4 and IPv6 protocols are
quite related to each other (think of mapped IPv4 addresses, etc.), there is no
separate [[server|translator]] for IPv6 but support for the latter has been
incorporated into the common pfinet.  Unfortunately it's a little bit clumsy
now to set the [[translator]] up, since it has to be bound to
*/servers/socket/2* (like before) as well as */servers/socket/26* (for IPv6).

To achieve this, you can tell pfinet to install [[active_translators|active]]
on specified nodes, using **-4** and **-6** options.  This is, you have to
install a [[passive_translator|passive]] on */servers/socket/2* that also binds
the IPv6 port and vice versa.


# Examples

Normal IPv4 network setup, address 192.168.7.23/24 and gateway 192.168.7.1.
IPv6 address shall be assigned using IPv6 auto-configuration.

    settrans -fgp /servers/socket/2 ↩
      /hurd/pfinet -6 /servers/socket/26 ↩
      -i /dev/eth0 -a 192.168.7.23 -m 255.255.255.0 -g 192.168.7.1
    settrans -fgp /servers/socket/26 ↩
      /hurd/pfinet -4 /servers/socket/2 ↩
      -i /dev/eth0 -a 192.168.7.23 -m 255.255.255.0 -g 192.168.7.1

Quite the same, but with static IPv6 address assignment:

    settrans -fgp /servers/socket/2 ↩
      /hurd/pfinet -6 /servers/socket/26 ↩
      -i /dev/eth0 -a 192.168.7.23 -m 255.255.255.0 -g 192.168.7.1 ↩
      -A 2001:4b88:10e4:0:216:3eff:feff:4223/64 -G 2001:4b88:10e4::1
    settrans -fgp /servers/socket/26 ↩
      /hurd/pfinet -4 /servers/socket/2 ↩
      -i /dev/eth0 -a 192.168.7.23 -m 255.255.255.0 -g 192.168.7.1 ↩
      -A 2001:4b88:10e4:0:216:3eff:feff:4223/64 -G 2001:4b88:10e4::1


# Missing Functionality

[[!tag open_issue_hurd]]

Amongst other things, support for [[IOCTL]]s is missing.


## IRC, freenode, #hurd, 2012-12-12

    <braunr> hm, pfinet seems not to support ipv6 well at all :(
    <pinotree> braunr: really?
    <braunr> pinotree: i can't manage to set a global address statically and
      make it communicate with neighbours
    <braunr> pfinet receives the advertisement (during neighbour discovery) but
      immediately resends the same solicitation again
    <gnu_srs> According to the pfinet/README IPv6 support was added in 2007
      from Linux 2.2.14 while the rest is from 2.2.12
    <braunr> according to me, bugs were added at the same time
    <braunr> :p
    <braunr> in addition, ipv6 in linux 2.2 was, uh, not working well either
    <braunr> even with 2.4, it was still messy
    <gnu_srs> maybe we should try to upgrade the TCP/IP stack to something
      2.6+?
    <gnu_srs> (a lot of work though)
    <braunr> we've already had that discussion
    <gnu_srs> Yes. What is the best way forward, a GSoC task? 
    <gnu_srs> There is one already:
      http://www.gnu.org/software/hurd/community/gsoc/project_ideas/tcp_ip_stack.html
    <braunr> personally, i'd advocate resuing code from netbsd


### IRC, freenode, #hurd, 2013-02-23

    <braunr> we're beginning to seriously lack ipv6 though
    <youpi> what is the actual problem?
    <youpi> (again)
    <youpi> lack?
    <youpi> we do have ipv6 working
    <braunr> i couldn't have it work with public addresses
    <youpi> uh?
    <youpi> I believe it worked for me
    <braunr> yes i told you a few months back
    <gnu_srs> braunr reported recently that v6 did not work as expected?
    <youpi> I don't remember about that (and my inbox neither)
    <braunr> it was only on irc
    <braunr> routing would be nice to have too
    <braunr> the stack can do it but we lack the interface
    <braunr> anyway, there would be benefits on working on it, but what we have
      now is fine and again, there are priorities
    <youpi> braunr: it seems ndp doesn't work indeed, I wonder why, it was
      working for me
    <braunr> that's what i found too
    <braunr> there have been other additions to the ipv6 spec over time, i
      don't know what else we might be lacking 
    <youpi> ndp is elder
    <braunr> yes ndp isn't lacking
    <youpi> and pfinet *does* actually do ndp :)
    <braunr> that's a different issue
    <braunr> my debugging session ended in the routing code
    <braunr> and i didn't investigate further
    <youpi> braunr: it seems the BPF filter on /dev/eth0 doesn't include IPv6
      frames
    <youpi> that'd explain that it worked before but not any more
    <braunr> oh
    <braunr> good
    <braunr> i'd love to assign global addresses to our VMs :)
    <youpi> ok, it goes through, there is just a remaining multicast join issue
    <youpi> yep, ethernet_set_multi is empty :)
    <youpi> ok, enabling ALLMULTI was enough to fix it
    <youpi> you can ping6 2001:910:1059:2:5054:00ff:fe12:3456 :)

Indeed, IPv6 now works properly, and the very machine hosting this wiki
(darnassus.sceen.net) can be reached with that protocol.

## IRC, freenode, #hurd, 2013-01-13

    <youpi> gnu_srs, gnu_srs1: fyi, I'm having a look at cherry-picking the
      v6only  option from linux


### IRC, freenode, #hurd, 2013-02-23

    <gnu_srs> youpi: From when is the Linux
      524354b4d086a4f013343d727eaccb7b4c39eb25 commit (IPV6_V6ONLY)?
    <youpi> which repo?
    <youpi> I don't have such commit here
    <gnu_srs>
      http://git.savannah.gnu.org/cgit/hurd/hurd.git/commit/?id=2b2d7fdc42475019e5ce3eabc9c9673e3c13d89f
    <gnu_srs> From which release, 2.4.x, 2.6.x?
    <youpi> it's very old
    <youpi> 2002
    <youpi> it's not in the current linux git tree, but in the "history" tree
    <youpi> I don't remember its url
    <braunr> git://git.kernel.org/pub/scm/linux/kernel/git/tglx/history.git
    <braunr> might be even older


## IRC, freenode, #hurd, 2013-04-01

    <congzhan`> hi, the ipv6 route works or not?
    <congzhan`> I can use ipv6 to connect vms, but the vm can't access other
      host except the router
    <congzhan`> the ipv6 route -G seems not work for me, anyone make it work?
    <youpi> I'm using SLAAC
    <congzhan`> youpi: you mean static config not work?
    <youpi> I mean automatic config does work
    <youpi> I don't use static config myself
    <congzhang> youpi: My ipv6 works now, just because not fully enable ipv6
      forwarding and firewall, thank you:)