Here's a patch, it needs some serious testing:

        fetch http://apollo.backplane.com/DFlyMisc/tcp01.patch

    The patch:

        * Moves the socket pointer into the netmsg base structure, even
          though some things don't use it, I know

        * Adds a lwkt_port pointer to the socket structure and initializes
          it to cpu0_soport()

        * Expects network protocols to set so->so_port in their attach
          functions, plus I do that for tcp and udp.

        * Performs message chasing when the protocol port changes due to
          e.g.  a connect() or an implied connect or (I think) also an
          implied binding to INADDR_ANY.

          If a number of messages for a socket have built up on a protocol
          thread and some operation in the protocol changes the socket's
          protocol thread (aka implied connect), then any other messages
          queued to that protocol thread, or new messages which race the
          change, will automatically be forwarded to the correct protocol
          thread when they are encountered.

        * Fixes implied connects for TCP.  This is when you use sendmsg()
          with an address to imply a connect along with data, so data can
          be sent along with the SYN.

          Implied connects were completely broken and would crash the kernel.
          Example:  finger u...@target  (instant crash).  finger uses the
          implied connect feature.

        * Cleans up a bunch of stuff.  I was almost able to remove
          the proto->pr_mport field entirely but sendmsg() still needs
          to use it in the case where the passed address is non-NULL (aka
          sendto() style).  All other code that used to call proto->pr_mport()
          now simply snarf the port out of so->so_port.

          The mport functions themselves now basically just return so_port.
          I left the sendmsg code intact just in case we wanted to optimize
          it later on for UDP.

    I found a few other bugs in the code but haven't fixed them yet.  UDP
    is not MPSAFE due to the global inpcbinfo (udbinfo) structure it uses.

    This patch does need testing.  I don't know what I might have blown up.
    It's fairly straight forward so I would also appreciate a code review.

                                                -Matt

Reply via email to