Menu

#166 RFC2217 connections always fail

v2.7
closed-fixed
None
5
2015-08-05
2014-07-28
TJ
No

Also reported as Ubuntu bug:

https://bugs.launchpad.net/ubuntu/+source/python-serial/+bug/1349525

Trying to connect to an RFC2217 access server:

$ python -m serial.tools.miniterm -D rfc2217://10.254.1.143:4001/logging=debug
DEBUG:pySerial.rfc2217:enabled logging
INFO:pySerial.rfc2217:NOTIFY_MODEMSTATE: 30
could not open port 'rfc2217://10.254.1.143:4001/logging=debug': Remote does not seem to support RFC2217 or BINARY mode [we-BINARY:False(INACTIVE), we-RFC2217:True(ACTIVE)]

Examining the code it seems that RFC2217Serial.open() has an incorrect test for connection completion.

    # negotiate Telnet/RFC 2217 -> send initial requests
    for option in self._telnet_options:
        if option.state is REQUESTED:
            self.telnetSendOption(option.send_yes, option.option)
    # now wait until important options are negotiated
    timeout_time = time.time() + self._network_timeout
    while time.time() < timeout_time:
        time.sleep(0.05) # prevent 100% CPU load
        if sum(o.active for o in mandadory_options) == len(mandadory_options):
            break
    else:
        raise SerialException("Remote does not seem to support RFC2217 or BINARY mode %r" % mandadory_options)

The problem is the " == len(mandadory_options)" test. The mandadory_options array has 2 elements, but since only state == REQUESTED will be sent in the prior 'for' loop one of them remains INACTIVE and therefore active == False, but the test compares against a count of the active options which reduces to

        if 1 == 2

which will therefore always fall through to the SerialException.

$ python -m serial.tools.miniterm -D rfc2217://10.254.1.143:4001/logging=debug
DEBUG:pySerial.rfc2217:enabled logging
INFO:pySerial.rfc2217:NOTIFY_MODEMSTATE: 30
DEBUG:pySerial.rfc2217:ENTER process_incoming( ECHO REQUESTED 0)
DEBUG:pySerial.rfc2217:LEAVE process_incoming( ECHO INACTIVE 0)
DEBUG:pySerial.rfc2217:ENTER process_incoming( we-SGA REQUESTED 0)
DEBUG:pySerial.rfc2217:LEAVE process_incoming( we-SGA INACTIVE 0)
DEBUG:pySerial.rfc2217:ENTER process_incoming( they-SGA REQUESTED 0)
DEBUG:pySerial.rfc2217:LEAVE process_incoming( they-SGA REQUESTED 0)
DEBUG:pySerial.rfc2217:ENTER process_incoming( we-SGA INACTIVE 0)
DEBUG:pySerial.rfc2217:LEAVE process_incoming( we-SGA INACTIVE 0)
DEBUG:pySerial.rfc2217:ENTER process_incoming( they-SGA REQUESTED 0)
DEBUG:pySerial.rfc2217:LEAVE process_incoming( they-SGA INACTIVE 0)
DEBUG:pySerial.rfc2217:ENTER process_incoming( they-RFC2217 REQUESTED 0)
DEBUG:pySerial.rfc2217:LEAVE process_incoming( they-RFC2217 ACTIVE 1)
DEBUG:pySerial.rfc2217:ENTER process_incoming( we-RFC2217 REQUESTED 0)
DEBUG:pySerial.rfc2217:LEAVE process_incoming( we-RFC2217 REQUESTED 0)
DEBUG:pySerial.rfc2217:ENTER process_incoming( they-RFC2217 ACTIVE 1)
DEBUG:pySerial.rfc2217:LEAVE process_incoming( they-RFC2217 ACTIVE 1)
DEBUG:pySerial.rfc2217:ENTER process_incoming( we-RFC2217 REQUESTED 0)
DEBUG:pySerial.rfc2217:LEAVE process_incoming( we-RFC2217 ACTIVE 1)
could not open port 'rfc2217://10.254.1.143:4001/logging=debug': Remote does not seem to support RFC2217 or BINARY mode [we-BINARY:False(INACTIVE), we-RFC2217:True(ACTIVE)]

summing on options that are not INACTIVE allows the connection to be established:

       if sum(o.active for o in mandadory_options) == sum(o.state != INACTIVE for o in mandadory_options):

$ python -m serial.tools.miniterm -D rfc2217://10.254.1.143:4001/logging=debug
DEBUG:pySerial.rfc2217:enabled logging
INFO:pySerial.rfc2217:NOTIFY_MODEMSTATE: 30
DEBUG:pySerial.rfc2217:ENTER process_incoming( ECHO REQUESTED 0)
DEBUG:pySerial.rfc2217:LEAVE process_incoming( ECHO INACTIVE 0)
DEBUG:pySerial.rfc2217:ENTER process_incoming( we-SGA REQUESTED 0)
DEBUG:pySerial.rfc2217:LEAVE process_incoming( we-SGA INACTIVE 0)
DEBUG:pySerial.rfc2217:ENTER process_incoming( they-SGA REQUESTED 0)
DEBUG:pySerial.rfc2217:LEAVE process_incoming( they-SGA REQUESTED 0)
DEBUG:pySerial.rfc2217:ENTER process_incoming( we-SGA INACTIVE 0)
DEBUG:pySerial.rfc2217:LEAVE process_incoming( we-SGA INACTIVE 0)
DEBUG:pySerial.rfc2217:ENTER process_incoming( they-SGA REQUESTED 0)
DEBUG:pySerial.rfc2217:LEAVE process_incoming( they-SGA INACTIVE 0)
DEBUG:pySerial.rfc2217:ENTER process_incoming( they-RFC2217 REQUESTED 0)
DEBUG:pySerial.rfc2217:LEAVE process_incoming( they-RFC2217 ACTIVE 1)
DEBUG:pySerial.rfc2217:ENTER process_incoming( we-RFC2217 REQUESTED 0)
DEBUG:pySerial.rfc2217:LEAVE process_incoming( we-RFC2217 REQUESTED 0)
DEBUG:pySerial.rfc2217:ENTER process_incoming( they-RFC2217 ACTIVE 1)
DEBUG:pySerial.rfc2217:LEAVE process_incoming( they-RFC2217 ACTIVE 1)
DEBUG:pySerial.rfc2217:ENTER process_incoming( we-RFC2217 REQUESTED 0)
DEBUG:pySerial.rfc2217:LEAVE process_incoming( we-RFC2217 ACTIVE 1)
INFO:pySerial.rfc2217:Negotiated options: [ECHO:False(INACTIVE), we-SGA:False(INACTIVE), they-SGA:False(INACTIVE), they-BINARY:False(INACTIVE), they-RFC2217:True(ACTIVE), we-BINARY:False(INACTIVE), we-RFC2217:True(ACTIVE)]
DEBUG:pySerial.rfc2217:SB Requesting baudrate -> '\x00\x00%\x80'
DEBUG:pySerial.rfc2217:SB Requesting datasize -> '\x08'
DEBUG:pySerial.rfc2217:SB Requesting parity -> '\x01'
DEBUG:pySerial.rfc2217:SB Requesting stopsize -> '\x01'
DEBUG:pySerial.rfc2217:Negotiating settings: [stopsize:REQUESTED, parity:REQUESTED, baudrate:REQUESTED, datasize:REQUESTED]
DEBUG:pySerial.rfc2217:SB Answer baudrate -> '\x00\x00%\x80' -> ACTIVE
DEBUG:pySerial.rfc2217:SB Answer datasize -> '\x08' -> ACTIVE
DEBUG:pySerial.rfc2217:SB Answer parity -> '\x01' -> ACTIVE
DEBUG:pySerial.rfc2217:SB Answer stopsize -> '\x01' -> ACTIVE
INFO:pySerial.rfc2217:Negotiated settings: [stopsize:ACTIVE, parity:ACTIVE, baudrate:ACTIVE, datasize:ACTIVE]
DEBUG:pySerial.rfc2217:SB Requesting control -> '\x01'
DEBUG:pySerial.rfc2217:SB Answer control -> '\x01' -> ACTIVE
INFO:pySerial.rfc2217:NOTIFY_MODEMSTATE: 1
INFO:pySerial.rfc2217:set RTS to active
DEBUG:pySerial.rfc2217:SB Requesting control -> '\x0b'
DEBUG:pySerial.rfc2217:SB Answer control -> '\x0b' -> ACTIVE
INFO:pySerial.rfc2217:set DTR to active
DEBUG:pySerial.rfc2217:SB Requesting control -> '\x08'
DEBUG:pySerial.rfc2217:SB Answer control -> '\x08' -> ACTIVE
DEBUG:pySerial.rfc2217:SB Requesting purge -> '\x01'
DEBUG:pySerial.rfc2217:SB Answer purge -> '\x01' -> ACTIVE
DEBUG:pySerial.rfc2217:SB Requesting purge -> '\x02'
DEBUG:pySerial.rfc2217:SB Answer purge -> '\x02' -> ACTIVE
--- Miniterm on rfc2217://10.254.1.143:4001/logging=debug: 9600,8,N,1 ---
--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---

Discussion

  • Chris Liechti

    Chris Liechti - 2014-07-31

    OK fix committed. Though that also seems to be a problem with the RFC-2217 server you are using because the code was working with other servers. But it seems that those RFC-2217 servers all work slightly different...

     
    • Pavel

      Pavel - 2015-01-28

      It's broken in 2.7 for the example rfc2217 server scripts provided with PySerial.

       
  • Chris Liechti

    Chris Liechti - 2014-07-31
    • status: open --> pending-fixed
    • assigned_to: Chris Liechti
     
  • Chris Liechti

    Chris Liechti - 2015-08-05
    • status: pending-fixed --> closed-fixed
     

Log in to post a comment.