cancel
Showing results for 
Search instead for 
Did you mean: 

Linux PPPoE anyone?

MrC
Grafter
Posts: 525
Thanks: 2
Registered: ‎17-07-2008

Linux PPPoE anyone?

Just tried my setup on ipv6 today and have hit a bit of a brick wall. For starters my setup is probably non-standard so I don't expect a lot of hand-holding. Basically I have a linux box acting as a boundary running pppoe through a d-link dsl-320b. I've got a ipv4  /29 mostly for historical reasons and the linux box nats ipv4 connections from private lans behind it. I've also got a Hurricane Electric ipv6 tunnel active.
I'm just trying to get the linux box working - getting everything else behind it working will come later.
So I added "ipv6 ," to my ppp options file, and the ipv6 user and password to the chaps secrets file, brought the ipv6 tunnel down and restarted ppp. ppp comes up and reports both ipv4 and ipv6 (link level) addresses.
Quote
PPP session is 1235
Connected to 00:90:1a:40:df:7a via interface eth1
Using interface ppp0
Connect: ppp0 <--> eth1
CHAP authentication succeeded
CHAP authentication succeeded
peer from calling number 00:90:1A:40:DF:7A authorized
local  IP address 81.174.167.226
remote IP address 195.166.130.65
local  LL address fe80::a4db:1fdf:2679:fcd3
remote LL address fe80::0090:1a00:05a3:8d26

Quote
lucy log # ip -6 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436
    inet6 ::1/128 scope host
      valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 fe80::21d:60ff:fe30:ed17/64 scope link
      valid_lft forever preferred_lft forever
9: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
    inet6 fe80::20f:cbff:feb1:cfd7/64 scope link
      valid_lft forever preferred_lft forever
15: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1492 qlen 3
    inet6 fe80::a4db:1fdf:2679:fcd3/10 scope link
      valid_lft forever preferred_lft forever

I can ping the remote IPv6 link level address:-
Quote
lucy log # ping6 -I ppp0 fe80::0090:1a00:05a3:8d26
PING fe80::0090:1a00:05a3:8d26(fe80::90:1a00:5a3:8d26) from fe80::a4db:1fdf:2679:fcd3 ppp0: 56 data bytes
64 bytes from fe80::90:1a00:5a3:8d26: icmp_seq=1 ttl=255 time=41.3 ms
64 bytes from fe80::90:1a00:5a3:8d26: icmp_seq=2 ttl=255 time=48.7 ms
64 bytes from fe80::90:1a00:5a3:8d26: icmp_seq=3 ttl=255 time=41.2 ms
64 bytes from fe80::90:1a00:5a3:8d26: icmp_seq=4 ttl=255 time=41.0 ms
64 bytes from fe80::90:1a00:5a3:8d26: icmp_seq=5 ttl=255 time=42.0 ms
^C
--- fe80::0090:1a00:05a3:8d26 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4004ms
rtt min/avg/max/mdev = 41.039/42.892/48.771/2.969 ms

Note that the ppp0 link is running over eth1 which is itself configured to let me telnet to the d-link
I then start the dhcp6 client (shown here in debug mode so apologies for length):
Quote
lucy log # dhcp6c -v -f ppp0
Jun/06/2011 15:17:07 <3>comment [#] (1)
Jun/06/2011 15:17:07 <3>comment [# See dhcp6c.conf(5) man page for details.] (42)
Jun/06/2011 15:17:07 <3>comment [#] (1)
Jun/06/2011 15:17:07 <3>[interface] (9)
Jun/06/2011 15:17:07 <5>[ppp0] (4)
Jun/06/2011 15:17:07 <3>begin of closure [{] (1)
Jun/06/2011 15:17:07 <3>[send] (4)
Jun/06/2011 15:17:07 <3>[rapid-commit] (12)
Jun/06/2011 15:17:07 <3>end of sentence [;] (1)
Jun/06/2011 15:17:07 <3>end of closure [}] (1)
Jun/06/2011 15:17:07 <3>end of sentence [;] (1)
Jun/06/2011 15:17:07 generated a new DUID: 00:01:02:00:15:7f:9d:e3
Jun/06/2011 15:17:07 saved generated DUID to /var/lib/dhcpv6/dhcp6c_duid
Jun/06/2011 15:17:07 link local addr is fe80::a4db:1fdf:2679:fcd3
Jun/06/2011 15:17:07 res addr is fe80::a4db:1fdf:2679:fcd3%ppp0/28
Jun/06/2011 15:17:07 found an interface eth0 harware 00:1d:60:30:e6:0d
Jun/06/2011 15:17:07  create iaid 233189472 for interface eth0
Jun/06/2011 15:17:07 found an interface eth1 harware 00:1d:60:30:ed:17
Jun/06/2011 15:17:07  create iaid 401420384 for interface eth1
Jun/06/2011 15:17:07 dhcpv6 doesn't support hardware type 776
Jun/06/2011 15:17:07 doesn't support sit0 address family 0
Jun/06/2011 15:17:07 found an interface wlan0 harware 00:0f:cb:b1:cf:d7
Jun/06/2011 15:17:07  create iaid 3620712907 for interface wlan0
Jun/06/2011 15:17:07 found an interface wlan2 harware 94:44:52:4e:ac:d0
Jun/06/2011 15:17:07  create iaid 3500953170 for interface wlan2
Jun/06/2011 15:17:07 found an interface tap0 harware d6:41:1f:8b:ee:07
Jun/06/2011 15:17:07  create iaid 133073695 for interface tap0
Jun/06/2011 15:17:07 found an interface br0 harware 00:0f:cb:b1:cf:d7
Jun/06/2011 15:17:07  create iaid 3620712907 for interface br0
Jun/06/2011 15:17:07 dhcpv6 doesn't support hardware type 803
Jun/06/2011 15:17:07 doesn't support mon.wlan0 address family 0
Jun/06/2011 15:17:07 dhcpv6 doesn't support hardware type 776
Jun/06/2011 15:17:07 doesn't support he6 address family 0
Jun/06/2011 15:17:07  create iaid 812675199 for interface ppp0
Jun/06/2011 15:17:07 found an interface eth1 harware 00:1d:60:30:ed:17
Jun/06/2011 15:17:07  create iaid 401420384 for interface eth1
Jun/06/2011 15:17:07 found an interface br0 harware 00:0f:cb:b1:cf:d7
Jun/06/2011 15:17:07  create iaid 3620712907 for interface br0
Jun/06/2011 15:17:07  create iaid 812675199 for interface ppp0
Jun/06/2011 15:17:07  found interface ppp0 iaid 812675199
Jun/06/2011 15:17:07 interface ppp0 iaid is 812675199
Jun/06/2011 15:17:07 saved generated DUID to /var/lib/dhcpv6/dhcp6c_duid
Jun/06/2011 15:17:07 get prefix address fe80::a4db:1fdf:2679:fcd3
Jun/06/2011 15:17:07 get prefix plen 10
Jun/06/2011 15:17:07 create an event 0x7f8d6d59e500 xid 0 for state 0
Jun/06/2011 15:17:07 reset a timer on ppp0, state=INIT, timeo=0, retrans=988
Jun/06/2011 15:17:08 ifp 0x7f8d6d5812e0 event 0x7f8d6d59e500 a new XID (2f8525) is generated
Jun/06/2011 15:17:08 saved generated DUID to /var/lib/dhcpv6/dhcp6c_duid
Jun/06/2011 15:17:08 set client ID
Jun/06/2011 15:17:08 set opt_8
Jun/06/2011 15:17:08 set rapid commit
Jun/06/2011 15:17:08 set IA_NA iaidinfo: iaid 812675199 renewtime 0 rebindtime 0
Jun/06/2011 15:17:08 status code of this IA is: 0 - success
Jun/06/2011 15:17:08 set IA status len 6 optlen: 18
Jun/06/2011 15:17:08 set opt_3
Jun/06/2011 15:17:08 send dst if ppp0 addr is ff02::1:2%ppp0 scope id is 15
Jun/06/2011 15:17:08 send solicit to ff02::1:2%ppp0
Jun/06/2011 15:17:08 DUID is 00:01:02:00:15:7f:9d:e3, DUID_LEN is 8
Jun/06/2011 15:17:08 removing ID (ID: 00:01:02:00:15:7f:9d:e3)
Jun/06/2011 15:17:08 DUID is , DUID_LEN is 0
Jun/06/2011 15:17:08 reset a timer on ppp0, state=SOLICIT, timeo=0, retrans=1025
Jun/06/2011 15:17:09 saved generated DUID to /var/lib/dhcpv6/dhcp6c_duid
Jun/06/2011 15:17:09 set client ID
Jun/06/2011 15:17:09 set opt_8
Jun/06/2011 15:17:09 set rapid commit
Jun/06/2011 15:17:09 set IA_NA iaidinfo: iaid 812675199 renewtime 0 rebindtime 0
Jun/06/2011 15:17:09 status code of this IA is: 0 - success
Jun/06/2011 15:17:09 set IA status len 6 optlen: 18
Jun/06/2011 15:17:09 set opt_3
Jun/06/2011 15:17:09 send dst if ppp0 addr is ff02::1:2%ppp0 scope id is 15
Jun/06/2011 15:17:09 send solicit to ff02::1:2%ppp0
Jun/06/2011 15:17:09 DUID is 00:01:02:00:15:7f:9d:e3, DUID_LEN is 8
Jun/06/2011 15:17:09 removing ID (ID: 00:01:02:00:15:7f:9d:e3)
Jun/06/2011 15:17:09 DUID is , DUID_LEN is 0
Jun/06/2011 15:17:09 reset a timer on ppp0, state=SOLICIT, timeo=1, retrans=2093
Jun/06/2011 15:17:11 saved generated DUID to /var/lib/dhcpv6/dhcp6c_duid
Jun/06/2011 15:17:11 set client ID
Jun/06/2011 15:17:11 set opt_8
Jun/06/2011 15:17:11 set rapid commit
Jun/06/2011 15:17:11 set IA_NA iaidinfo: iaid 812675199 renewtime 0 rebindtime 0
Jun/06/2011 15:17:11 status code of this IA is: 0 - success
Jun/06/2011 15:17:11 set IA status len 6 optlen: 18
Jun/06/2011 15:17:11 set opt_3
Jun/06/2011 15:17:11 send dst if ppp0 addr is ff02::1:2%ppp0 scope id is 15
Jun/06/2011 15:17:11 send solicit to ff02::1:2%ppp0
Jun/06/2011 15:17:11 DUID is 00:01:02:00:15:7f:9d:e3, DUID_LEN is 8
Jun/06/2011 15:17:11 removing ID (ID: 00:01:02:00:15:7f:9d:e3)
Jun/06/2011 15:17:11 DUID is , DUID_LEN is 0
Jun/06/2011 15:17:11 reset a timer on ppp0, state=SOLICIT, timeo=2, retrans=4032
Jun/06/2011 15:17:15 saved generated DUID to /var/lib/dhcpv6/dhcp6c_duid
Jun/06/2011 15:17:15 set client ID
Jun/06/2011 15:17:15 set opt_8
Jun/06/2011 15:17:15 set rapid commit
Jun/06/2011 15:17:15 set IA_NA iaidinfo: iaid 812675199 renewtime 0 rebindtime 0
Jun/06/2011 15:17:15 status code of this IA is: 0 - success
Jun/06/2011 15:17:15 set IA status len 6 optlen: 18
Jun/06/2011 15:17:15 set opt_3
Jun/06/2011 15:17:15 send dst if ppp0 addr is ff02::1:2%ppp0 scope id is 15
Jun/06/2011 15:17:15 send solicit to ff02::1:2%ppp0
Jun/06/2011 15:17:15 DUID is 00:01:02:00:15:7f:9d:e3, DUID_LEN is 8
Jun/06/2011 15:17:15 removing ID (ID: 00:01:02:00:15:7f:9d:e3)
Jun/06/2011 15:17:15 DUID is , DUID_LEN is 0
Jun/06/2011 15:17:15 reset a timer on ppp0, state=SOLICIT, timeo=3, retrans=7902

And so on ad-infinitum. I seem to be sending solicits down the correct interface (send solicit to ff02::1:2%ppp0) but never seem to see anything coming back. Anybody any clues as to what I'm missing/doing wrong here? IPv4 works as expected BTW.
7 REPLIES 7
MJN
Pro
Posts: 1,314
Thanks: 161
Fixes: 5
Registered: ‎26-08-2010

Re: Linux PPPoE anyone?

Hi Mrc,
I'm not familiar with PPPoE but  can scratch my head as much as the next guy...
Might it be worth running Wireshark or similar on PPP0 just to see if there are actually any responses coming back from the DHCPv6 server, and perhaps just not being processed by the client? Also, you don't have any firewall/filtering that might be responsible for blocking responses?
Mathew
MrC
Grafter
Posts: 525
Thanks: 2
Registered: ‎17-07-2008

Re: Linux PPPoE anyone?

Good points thanks - packet sniffing was my next thought but the filtering is a good call which I should have thought of - I'm using a minimalistic ip6tables ruleset for the 6to4 tunnel and nothing's appeared in the logs but maybe I'll disable filtering completely and retest as a first and easy option. Have had to revert to a normal ipv4 only config for now but will try again later.
MrC
Grafter
Posts: 525
Thanks: 2
Registered: ‎17-07-2008

Re: Linux PPPoE anyone?

Heh looks like ip6tables needs an inbound UDP rule to port 546 as there's no connection tracking module for DHCPv6.
dave
Plusnet Help Team
Plusnet Help Team
Posts: 12,178
Thanks: 49
Fixes: 1
Registered: ‎04-04-2007

Re: Linux PPPoE anyone?

Hi,
I've not tried setting it up using Linux box yet, but one of the network guys has, if you're still having problems this is what he did:

in /etc/ppp/options file add line
+ipv6
Also *nix box require DHCPv6 client, ie wide-dhcp for DHCP-PD
/etc/wide-dhcpv6/dhcp6c.conf
  interface ppp0 {
      request domain-name-servers;
      request domain-name;
      send rapid-commit;
      send ia-pd 0;
      script "/etc/wide-dhcpv6/dhcp6c-script";
  };
  id-assoc pd {
          prefix-interface lo {
                  sla-id 3;  #interface id to form prefix
                  sla-len 8;  #shift from allocated prefix, ie /56 + 8 = /64, so netmask for lo0 is /64 
                             
            };
Dave Tomlinson
Enterprise Architect - Network & OSS
Plusnet Technology
MrC
Grafter
Posts: 525
Thanks: 2
Registered: ‎17-07-2008

Re: Linux PPPoE anyone?

Cheers for that Dave. Even with the ip6tables rule in place I'm not seeing any joy. I'm using the RedHat dhcp6 client which is the Gentoo default and is similar to wide/kame-dhcp. The ISC dhclient doesn't appear to support PPP. My config file is very basic - I'm ignoring the ia-pd settings for now as I don't really care about other interfaces.
Quote
#
# See dhcp6c.conf(5) man page for details.
#
interface ppp0 {
    request domain-name-servers;
    send rapid-commit;
};

Symptoms are the same I can see the solicits going out but nothing comes back - proved via wireshark on ppp0 and eth1 (the interface to the dsl-320b). Even removing all ip6tables modules plus all lease and DUID files in /var/lib/dhcpv6 prior to starting dhcp6c doesn't improve things. More head-scratching here.....
mxs
Grafter
Posts: 70
Registered: ‎08-12-2010

Re: Linux PPPoE anyone?

I have a working setup under linux - just doing a clean install at the moment and making a few notes to post here once I have confirmed I have not missed anything.  I had a few teething problems getting everything up and running initially but all seems to be working fine now after finding the magic combination. 😛
Running wide-dhcpv6 client and rp-pppoe btw (not using a router in bridge mode though - connecting directly to the fibre modem since I am on FTTC).
MrC
Grafter
Posts: 525
Thanks: 2
Registered: ‎17-07-2008

Re: Linux PPPoE anyone?

OK, success of a sort but I'm a bit in the dark here so any comments from the IPv6 gurus would be appreciated Smiley
Firstly I dropped the old deprecated Redhat dhcp6c and tried dibbler which is a bit more 'friendly'.
I found that if I requested a prefix delegation in the dibbler-client config file the PN dhcp6 server happily gave me an allocation (although for some reason dibbler didn't set up the ppp0 interface with an address but did create an radvd.conf file and added the prefix to the routing table). However if I configured dibbler to request an identity association the PN dhcp6 server never responded. Is this correct behaviour?Huh
[code=dibbler-client.conf]
log-mode full
log-level 7
iface "ppp0" {
  pd
}[/code]
Gave:-
[code=dibbler-client output]
lucy dibbler # dibbler-client run
| Dibbler - a portable DHCPv6, version 0.7.3 (CLIENT, Linux port)
| Authors : Tomasz Mrugalski<thomson(at)klub.com.pl>,Marek Senderski<msend(at)o2.pl>
| Licence : GNU GPL v2 only. Developed at Gdansk University of Technology.
| Homepage: http://klub.com.pl/dhcpv6/
2011.06.10 15:06:53 Client Notice    My pid (12625) is stored in /var/lib/dibbler/client.pid
2011.06.10 15:06:53 Client Notice    Detected iface ppp0/18, MAC=.
2011.06.10 15:06:53 Client Notice    Detected iface mon.wlan0/10, MAC=00:0f:cb:b1:cf:d7.
2011.06.10 15:06:53 Client Notice    Detected iface br0/9, MAC=00:0f:cb:b1:cf:d7.
2011.06.10 15:06:53 Client Notice    Detected iface tap0/8, MAC=f2:83:e0:a2:67:ab.
2011.06.10 15:06:53 Client Notice    Detected iface wlan2/6, MAC=94:44:52:4e:ac:d0.
2011.06.10 15:06:53 Client Notice    Detected iface wlan0/5, MAC=00:0f:cb:b1:cf:d7.
2011.06.10 15:06:53 Client Notice    Detected iface sit0/4, MAC=00:00:00:00.
2011.06.10 15:06:53 Client Notice    Detected iface eth1/3, MAC=00:1d:60:30:ed:17.
2011.06.10 15:06:53 Client Notice    Detected iface eth0/2, MAC=00:1d:60:30:e6:0d.
2011.06.10 15:06:53 Client Notice    Detected iface lo/1, MAC=00:00:00:00:00:00.
2011.06.10 15:06:53 Client Notice    Parsing /etc/dibbler/client.conf config file...
2011.06.10 15:06:53 Client Info      Interface ppp0/18 configuation has been loaded.
2011.06.10 15:06:53 Client Info      My DUID is 00:01:03:23:15:84:dc:85:00:0f:cb:b1:cf:d7.
2011.06.10 15:06:53 Client Info      Loading old address database (client-AddrMgr.xml), using built-in routines.
2011.06.10 15:06:53 Client Notice    Address database loaded successfuly.
2011.06.10 15:06:53 Client Notice    Creating control (::) socket on the lo/1 interface.
2011.06.10 15:06:53 Client Notice    Creating socket (addr=fe80::b465:811c:f6a1:4ebf) on the ppp0/18 interface.
2011.06.10 15:06:53 Client Info      Socket bound to fe80::b465:811c:f6a1:4ebf/port=546
2011.06.10 15:06:53 Client Info      Creating SOLICIT message with 0 IA(s), no TA and 1 PD(s) on ppp0/18 interface.
2011.06.10 15:06:54 Client Info      Processing msg (SOLICIT,transID=0x7bd09c,opts: 1 25 Cool
2011.06.10 15:06:54 Client Warning  Option 20 in message 2 is not supported.
2011.06.10 15:06:54 Client Warning  Option 20 is invalid. Ignoring.
2011.06.10 15:06:54 Client Info      Received ADVERTISE on ppp0/18,TransID=0x7bd09c, 5 opts: 2 1 25 23 13
2011.06.10 15:06:55 Client Info      Processing msg (SOLICIT,transID=0x7bd09c,opts: 1 25 Cool
2011.06.10 15:06:55 Client Info      Creating REQUEST. Backup server list contains 1 server(s).
2011.06.10 15:06:56 Client Info      Processing msg (REQUEST,transID=0xa68667,opts: 1 25 8 2)
2011.06.10 15:06:56 Client Warning  Option 20 in message 7 is not supported.
2011.06.10 15:06:56 Client Warning  Option 20 is invalid. Ignoring.
2011.06.10 15:06:56 Client Info      Received REPLY on ppp0/18,TransID=0xa68667, 5 opts: 2 1 25 23 13
2011.06.10 15:06:56 Client Notice    PD: Adding prefix 2a02:16c8:2000:7000::/56 on the ppp0/18 interface.
2011.06.10 15:06:56 Client Notice    Setting up DNS server 2001:470:20::2 on interface ppp0/18.
2011.06.10 15:06:56 Client Notice    Status SUCCESS :
[/code]
However if I request an identity association, no response from PN.
[code=dibbler-client.conf]
log-mode full
log-level 7
iface "ppp0" {
  ia
}[/code]

[code=dibbler-client output]
lucy dibbler # dibbler-client run
| Dibbler - a portable DHCPv6, version 0.7.3 (CLIENT, Linux port)
| Authors : Tomasz Mrugalski<thomson(at)klub.com.pl>,Marek Senderski<msend(at)o2.pl>
| Licence : GNU GPL v2 only. Developed at Gdansk University of Technology.
| Homepage: http://klub.com.pl/dhcpv6/
2011.06.10 15:07:23 Client Notice    My pid (12629) is stored in /var/lib/dibbler/client.pid
2011.06.10 15:07:23 Client Notice    Detected iface ppp0/18, MAC=.
2011.06.10 15:07:23 Client Notice    Detected iface mon.wlan0/10, MAC=00:0f:cb:b1:cf:d7.
2011.06.10 15:07:23 Client Notice    Detected iface br0/9, MAC=00:0f:cb:b1:cf:d7.
2011.06.10 15:07:23 Client Notice    Detected iface tap0/8, MAC=f2:83:e0:a2:67:ab.
2011.06.10 15:07:23 Client Notice    Detected iface wlan2/6, MAC=94:44:52:4e:ac:d0.
2011.06.10 15:07:23 Client Notice    Detected iface wlan0/5, MAC=00:0f:cb:b1:cf:d7.
2011.06.10 15:07:23 Client Notice    Detected iface sit0/4, MAC=00:00:00:00.
2011.06.10 15:07:23 Client Notice    Detected iface eth1/3, MAC=00:1d:60:30:ed:17.
2011.06.10 15:07:23 Client Notice    Detected iface eth0/2, MAC=00:1d:60:30:e6:0d.
2011.06.10 15:07:23 Client Notice    Detected iface lo/1, MAC=00:00:00:00:00:00.
2011.06.10 15:07:23 Client Notice    Parsing /etc/dibbler/client.conf config file...
2011.06.10 15:07:23 Client Info      Interface ppp0/18 configuation has been loaded.
2011.06.10 15:07:23 Client Info      My DUID is 00:01:03:23:15:84:dc:85:00:0f:cb:b1:cf:d7.
2011.06.10 15:07:23 Client Info      Loading old address database (client-AddrMgr.xml), using built-in routines.
2011.06.10 15:07:23 Client Notice    Address database loaded successfuly.
2011.06.10 15:07:23 Client Notice    Creating control (::) socket on the lo/1 interface.
2011.06.10 15:07:23 Client Notice    Creating socket (addr=fe80::b465:811c:f6a1:4ebf) on the ppp0/18 interface.
2011.06.10 15:07:23 Client Info      Socket bound to fe80::b465:811c:f6a1:4ebf/port=546
2011.06.10 15:07:23 Client Info      Creating SOLICIT message with 1 IA(s), no TA and 0 PD(s) on ppp0/18 interface.
2011.06.10 15:07:24 Client Info      Processing msg (SOLICIT,transID=0x5ab050,opts: 1 3 8 6)
2011.06.10 15:07:25 Client Info      Processing msg (SOLICIT,transID=0x5ab050,opts: 1 3 8 6)
2011.06.10 15:07:27 Client Info      Processing msg (SOLICIT,transID=0x5ab050,opts: 1 3 8 6)
2011.06.10 15:07:31 Client Info      Processing msg (SOLICIT,transID=0x5ab050,opts: 1 3 8 6)
2011.06.10 15:07:39 Client Info      Processing msg (SOLICIT,transID=0x5ab050,opts: 1 3 8 6)
2011.06.10 15:07:54 Client Info      Processing msg (SOLICIT,transID=0x5ab050,opts: 1 3 8 6)
etc, etc
[/code]