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.

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'

------ 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)
------ 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)

Attachment: signature.asc
Description: OpenPGP digital signature

------------------------------------------------------------------------------
RSA(R) Conference 2012
Save $700 by Nov 18
Register now
http://p.sf.net/sfu/rsa-sfdev2dev1
_______________________________________________
Freevo-devel mailing list
Freevo-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/freevo-devel

Reply via email to