Re: kaa rpc and IPV6

A Mennucc <[email protected]> Wed, 09 Nov 2011 13:07:13 +0100
Newsgroups gmane.comp.video.freevo.devel
Message-ID <[email protected]>
hi,

I nailed it. It depends on the value of /proc/sys/net/ipv6/bindv6only

The man page ipv6(7) says

IPV6_V6ONLY (since Linux 2.4.21 and 2.6)
If this flag is set to true (nonzero), then the socket is re‐
stricted to sending and receiving IPv6 packets only. In this
case, an IPv4 and an IPv6 application can bind to a single port
at the same time.

If this flag is set to false (zero), then the socket can be used
to send and receive packets to and from an IPv6 address or an
IPv4-mapped IPv6 address.

The argument is a pointer to a boolean value in an integer.

The default value for this flag is defined by the contents of
the file /proc/sys/net/ipv6/bindv6only. The default value for
that file is 0 (false).

AFAICT kaa works fine in my systems where /proc/sys/net/ipv6/bindv6only is 0

But it happened that in my freevo-box it is 1 ( why?? I dont know!!) and
it seems that somehow this makes kaa fail.

I modified the script sockettest.py, I attach it and I attach the output
when the above is 1 or 0

I think that if you want kaa to work uniformly in all systems then you
should explicitely set the flag IPV6_V6ONLY to 'false' in the kaa socket
code.

a.

------------------------------------------------------------------------------
RSA(R) Conference 2012
Save $700 by Nov 18
Register now
http://p.sf.net/sfu/rsa-sfdev2dev1

_______________________________________________
Freevo-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-devel
sockettest.py (text/x-python, 4.5 KB)
import socket,os,sys,subprocess

port=20011

def to_v6(addr):
    return '::ffff:' + addr if ':' not in addr and addr else addr

def netstat():
    from subprocess import *
    #os.system('echo -n "   netstat inet = " ; netstat --inet -n -a | grep '+str(port)+' ; echo')
    #os.system('echo -n "   netstat inet6 =" ; netstat --inet6 -n -a | grep '+str(port)+' ; echo')
    print "   netstat inet = " +\
        Popen('netstat --inet -n -a | grep '+str(port),stdout=PIPE,shell=True).stdout.read().strip()
    print "   netstat inet6= " +\
        Popen('netstat --inet6 -n -a | grep '+str(port),stdout=PIPE,shell=True).stdout.read().strip()

def v6sock(addr, port, bind=True, get=False):
    print 'AF_INET6 %s to %s:%d' % ( ('bind' if bind else 'connect') , addr, port)
    addrs = socket.getaddrinfo(addr, port, socket.AF_INET6, socket.SOCK_STREAM, 0, socket.AI_V4MAPPED | socket.AI_ALL)
    for addrinfo in (a[4] for a in addrs):
        newinfo = (to_v6(addrinfo[0]),) + addrinfo[1:]
        print '  try %s -> %s' % (addrinfo, newinfo)
        try:
            sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM, socket.IPPROTO_TCP)
            #print '   ',socket.AF_INET6, socket.SOCK_STREAM, socket.IPPROTO_TCP
            sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            if bind:
                sock.bind(newinfo)
            else:
                sock.connect(newinfo)
            if get:
                return sock
        except socket.error, e:
            print '    -> failed:', e


def v4sock(addr, port, bind=True, get=False):
    print 'AF_INET %s to %s:%d' % ('bind' if bind else 'connect', addr, port)
    addrs = socket.getaddrinfo(addr, port, socket.AF_INET, socket.SOCK_STREAM, 0, socket.AI_ALL)
    for addrinfo in (a[4] for a in addrs):
        print '  try %s' % repr(addrinfo)
        try:
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)
            #print '   ',socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP
            sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            if bind:
                sock.bind(addrinfo)
            else:
                sock.connect(addrinfo)
            if get:
                return sock
        except socket.error, e:
            print '    -> failed:', e


def server_example(addr): 
    "http://docs.python.org/release/2.7.2/library/socket.html"
    # Echo server program
    import socket
    import sys

    #addr = addr               # Symbolic name meaning all available interfaces
    #PORT = port               # Arbitrary non-privileged port
    s = None
    for res in socket.getaddrinfo(addr, port, socket.AF_UNSPEC,
                                  socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
        af, socktype, proto, canonname, sa = res
        print '  getaddrinfo returns ',res
        try:
            s = socket.socket(af, socktype, proto)
        except socket.error, msg:
            s = None
            continue
        try:
            s.bind(sa)
            s.listen(1)
        except socket.error, msg:
            print '********',err
            s.close()
            s = None
            continue
        #nope, lets try them all 
        #break
    if s is None:
        print 'could not open socket'
        sys.exit(1)
    return s
    # conn, addr = s.accept()
    # print 'Connected by', addr
    # while 1:
    #     data = conn.recv(1024)
    #     if not data: break
    #     conn.send(data)
    # conn.close()

for host in (None, 'localhost', '127.0.0.1'):
    print '------', host
    #v4sock(host, port)
    lsock = v4sock(host, port, get=True)
    if lsock:
        lsock.listen(10)
        netstat()
        v4sock(host or 'localhost', port, False)
        lsock.close()
    else:
        print '  skipping connect'

for host in (None, 'localhost', 'ip6-localhost', '127.0.0.1', '::1'):
    print '------', host
    #v6sock(host, port)
    lsock = v6sock(host, port, get=True)
    if lsock:
        lsock.listen(10)
        netstat()
        if host == 'localhost':
            v4sock(host, port, False)
        v6sock(host or 'localhost', port, False)
        lsock.close()
    else:
        print '  skipping connect'

for host in (None, 'localhost', 'ip6-localhost', '127.0.0.1', '::1'):
    print '--doc-', host
    lsock = server_example(host)
    if lsock:
        lsock.listen(10)
        netstat()
        if host == 'localhost':
            v4sock(host, port, False)
        v6sock(host or 'localhost', port, False)
        lsock.close()
    else:
        print '  skipping connect'
sockettest.txt~freevo-bindv6only-is-1 (text/plain, 3.6 KB)
------ None
AF_INET bind to None:20011
  try ('127.0.0.1', 20011)
   netstat inet = tcp        0      0 127.0.0.1:20011         0.0.0.0:*               LISTEN
   netstat inet6= 
AF_INET connect to localhost:20011
  try ('127.0.0.1', 20011)
------ localhost
AF_INET bind to localhost:20011
  try ('127.0.0.1', 20011)
   netstat inet = tcp        0      0 127.0.0.1:20011         0.0.0.0:*               LISTEN
   netstat inet6= 
AF_INET connect to localhost:20011
  try ('127.0.0.1', 20011)
------ 127.0.0.1
AF_INET bind to 127.0.0.1:20011
  try ('127.0.0.1', 20011)
   netstat inet = tcp        0      0 127.0.0.1:20011         0.0.0.0:*               LISTEN
   netstat inet6= 
AF_INET connect to 127.0.0.1:20011
  try ('127.0.0.1', 20011)
------ None
AF_INET6 bind to None:20011
  try ('::1', 20011, 0, 0) -> ('::1', 20011, 0, 0)
   netstat inet = 
   netstat inet6= tcp6       0      0 ::1:20011               :::*                    LISTEN
AF_INET6 connect to localhost:20011
  try ('127.0.0.1', 20011) -> ('::ffff:127.0.0.1', 20011)
    -> failed: [Errno 101] Network is unreachable
------ localhost
AF_INET6 bind to localhost:20011
  try ('127.0.0.1', 20011) -> ('::ffff:127.0.0.1', 20011)
    -> failed: [Errno 22] Invalid argument
  skipping connect
------ ip6-localhost
AF_INET6 bind to ip6-localhost:20011
  try ('::1', 20011, 0, 0) -> ('::1', 20011, 0, 0)
   netstat inet = 
   netstat inet6= tcp6       0      0 ::1:20011               :::*                    LISTEN
AF_INET6 connect to ip6-localhost:20011
  try ('::1', 20011, 0, 0) -> ('::1', 20011, 0, 0)
------ 127.0.0.1
AF_INET6 bind to 127.0.0.1:20011
  try ('::ffff:127.0.0.1', 20011, 0, 0) -> ('::ffff:127.0.0.1', 20011, 0, 0)
    -> failed: [Errno 22] Invalid argument
  skipping connect
------ ::1
AF_INET6 bind to ::1:20011
  try ('::1', 20011, 0, 0) -> ('::1', 20011, 0, 0)
   netstat inet = 
   netstat inet6= tcp6       0      0 ::1:20011               :::*                    LISTEN
AF_INET6 connect to ::1:20011
  try ('::1', 20011, 0, 0) -> ('::1', 20011, 0, 0)
--doc- None
  getaddrinfo returns  (2, 1, 6, '', ('0.0.0.0', 20011))
  getaddrinfo returns  (10, 1, 6, '', ('::', 20011, 0, 0))
   netstat inet = 
   netstat inet6= tcp6       0      0 :::20011                :::*                    LISTEN
AF_INET6 connect to localhost:20011
  try ('127.0.0.1', 20011) -> ('::ffff:127.0.0.1', 20011)
    -> failed: [Errno 101] Network is unreachable
--doc- localhost
  getaddrinfo returns  (2, 1, 6, '', ('127.0.0.1', 20011))
   netstat inet = tcp        0      0 127.0.0.1:20011         0.0.0.0:*               LISTEN
   netstat inet6= 
AF_INET connect to localhost:20011
  try ('127.0.0.1', 20011)
AF_INET6 connect to localhost:20011
  try ('127.0.0.1', 20011) -> ('::ffff:127.0.0.1', 20011)
    -> failed: [Errno 101] Network is unreachable
--doc- ip6-localhost
  getaddrinfo returns  (10, 1, 6, '', ('::1', 20011, 0, 0))
   netstat inet = 
   netstat inet6= tcp6       0      0 ::1:20011               :::*                    LISTEN
AF_INET6 connect to ip6-localhost:20011
  try ('::1', 20011, 0, 0) -> ('::1', 20011, 0, 0)
--doc- 127.0.0.1
  getaddrinfo returns  (2, 1, 6, '', ('127.0.0.1', 20011))
   netstat inet = tcp        0      0 127.0.0.1:20011         0.0.0.0:*               LISTEN
   netstat inet6= 
AF_INET6 connect to 127.0.0.1:20011
  try ('::ffff:127.0.0.1', 20011, 0, 0) -> ('::ffff:127.0.0.1', 20011, 0, 0)
    -> failed: [Errno 101] Network is unreachable
--doc- ::1
  getaddrinfo returns  (10, 1, 6, '', ('::1', 20011, 0, 0))
   netstat inet = 
   netstat inet6= tcp6       0      0 ::1:20011               :::*                    LISTEN
AF_INET6 connect to ::1:20011
  try ('::1', 20011, 0, 0) -> ('::1', 20011, 0, 0)
sockettest.txt~freevo~bindv6only-is-0 (text/plain, 3.8 KB)
------ None
AF_INET bind to None:20011
  try ('127.0.0.1', 20011)
   netstat inet = tcp        0      0 127.0.0.1:20011         0.0.0.0:*               LISTEN
   netstat inet6= 
AF_INET connect to localhost:20011
  try ('127.0.0.1', 20011)
------ localhost
AF_INET bind to localhost:20011
  try ('127.0.0.1', 20011)
   netstat inet = tcp        0      0 127.0.0.1:20011         0.0.0.0:*               LISTEN
   netstat inet6= 
AF_INET connect to localhost:20011
  try ('127.0.0.1', 20011)
------ 127.0.0.1
AF_INET bind to 127.0.0.1:20011
  try ('127.0.0.1', 20011)
   netstat inet = tcp        0      0 127.0.0.1:20011         0.0.0.0:*               LISTEN
   netstat inet6= 
AF_INET connect to 127.0.0.1:20011
  try ('127.0.0.1', 20011)
------ None
AF_INET6 bind to None:20011
  try ('::1', 20011, 0, 0) -> ('::1', 20011, 0, 0)
   netstat inet = 
   netstat inet6= tcp6       0      0 ::1:20011               :::*                    LISTEN
AF_INET6 connect to localhost:20011
  try ('127.0.0.1', 20011) -> ('::ffff:127.0.0.1', 20011)
    -> failed: [Errno 111] Connection refused
------ localhost
AF_INET6 bind to localhost:20011
  try ('127.0.0.1', 20011) -> ('::ffff:127.0.0.1', 20011)
   netstat inet = 
   netstat inet6= tcp6       0      0 127.0.0.1:20011         :::*                    LISTEN
AF_INET connect to localhost:20011
  try ('127.0.0.1', 20011)
AF_INET6 connect to localhost:20011
  try ('127.0.0.1', 20011) -> ('::ffff:127.0.0.1', 20011)
------ ip6-localhost
AF_INET6 bind to ip6-localhost:20011
  try ('::1', 20011, 0, 0) -> ('::1', 20011, 0, 0)
   netstat inet = 
   netstat inet6= tcp6       0      0 ::1:20011               :::*                    LISTEN
AF_INET6 connect to ip6-localhost:20011
  try ('::1', 20011, 0, 0) -> ('::1', 20011, 0, 0)
------ 127.0.0.1
AF_INET6 bind to 127.0.0.1:20011
  try ('::ffff:127.0.0.1', 20011, 0, 0) -> ('::ffff:127.0.0.1', 20011, 0, 0)
   netstat inet = 
   netstat inet6= tcp6       0      0 127.0.0.1:20011         :::*                    LISTEN
AF_INET6 connect to 127.0.0.1:20011
  try ('::ffff:127.0.0.1', 20011, 0, 0) -> ('::ffff:127.0.0.1', 20011, 0, 0)
------ ::1
AF_INET6 bind to ::1:20011
  try ('::1', 20011, 0, 0) -> ('::1', 20011, 0, 0)
   netstat inet = 
   netstat inet6= tcp6       0      0 ::1:20011               :::*                    LISTEN
AF_INET6 connect to ::1:20011
  try ('::1', 20011, 0, 0) -> ('::1', 20011, 0, 0)
--doc- None
  getaddrinfo returns  (2, 1, 6, '', ('0.0.0.0', 20011))
  getaddrinfo returns  (10, 1, 6, '', ('::', 20011, 0, 0))
   netstat inet = 
   netstat inet6= tcp6       0      0 :::20011                :::*                    LISTEN
AF_INET6 connect to localhost:20011
  try ('127.0.0.1', 20011) -> ('::ffff:127.0.0.1', 20011)
--doc- localhost
  getaddrinfo returns  (2, 1, 6, '', ('127.0.0.1', 20011))
   netstat inet = tcp        0      0 127.0.0.1:20011         0.0.0.0:*               LISTEN
   netstat inet6= 
AF_INET connect to localhost:20011
  try ('127.0.0.1', 20011)
AF_INET6 connect to localhost:20011
  try ('127.0.0.1', 20011) -> ('::ffff:127.0.0.1', 20011)
--doc- ip6-localhost
  getaddrinfo returns  (10, 1, 6, '', ('::1', 20011, 0, 0))
   netstat inet = 
   netstat inet6= tcp6       0      0 ::1:20011               :::*                    LISTEN
AF_INET6 connect to ip6-localhost:20011
  try ('::1', 20011, 0, 0) -> ('::1', 20011, 0, 0)
--doc- 127.0.0.1
  getaddrinfo returns  (2, 1, 6, '', ('127.0.0.1', 20011))
   netstat inet = tcp        0      0 127.0.0.1:20011         0.0.0.0:*               LISTEN
   netstat inet6= 
AF_INET6 connect to 127.0.0.1:20011
  try ('::ffff:127.0.0.1', 20011, 0, 0) -> ('::ffff:127.0.0.1', 20011, 0, 0)
--doc- ::1
  getaddrinfo returns  (10, 1, 6, '', ('::1', 20011, 0, 0))
   netstat inet = 
   netstat inet6= tcp6       0      0 ::1:20011               :::*                    LISTEN
AF_INET6 connect to ::1:20011
  try ('::1', 20011, 0, 0) -> ('::1', 20011, 0, 0)
signature.asc (application/pgp-signature, 262 B)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk66bPIACgkQ9B/tjjP8QKSm2wCdE5l19RjiEKL8E4rBfq9qhqXU
0hEAniRnGVZ2HgieAg15jbuTO1TInaIJ
=vYrh
-----END PGP SIGNATURE-----