cvs commit: src/sys/netinet sctp_bsd_addr.c sctp_crc32.c sctp_indata.c sctp_input.c sctp_output.c sctp_pcb.c sctp_structs.h sctp_uio.h sctputil.c sctputil.h src/sys/netinet6 sctp6_usrreq.c

Randall Stewart rrs at cisco.com
Sun Nov 5 14:16:04 UTC 2006


Randall Stewart wrote:
> rrs         2006-11-05 13:25:18 UTC
> 
>   FreeBSD src repository
> 
>   Modified files:
>     sys/netinet          sctp_bsd_addr.c sctp_crc32.c 
>                          sctp_indata.c sctp_input.c sctp_output.c 
>                          sctp_pcb.c sctp_structs.h sctp_uio.h 
>                          sctputil.c sctputil.h 
>     sys/netinet6         sctp6_usrreq.c 
>   Log:
>   Tons of fixes to get all the 64bit issues removed.
>   This also moves two 16 bit int's to become 32 bit
>   values so we do not have to use atomic_add_16.
>   Most of the changes are %p, casts and other various
>   nasty's that were in the orignal code base. With this
>   commit my machine will now do a build universe.. however
>   I as yet have not tested on a 64bit machine .. it may not work :-(
>   
>   Revision  Changes    Path
>   1.2       +7 -7      src/sys/netinet/sctp_bsd_addr.c
>   1.3       +1 -1      src/sys/netinet/sctp_crc32.c
>   1.2       +4 -4      src/sys/netinet/sctp_indata.c
>   1.4       +7 -5      src/sys/netinet/sctp_input.c
>   1.2       +9 -9      src/sys/netinet/sctp_output.c
>   1.4       +8 -8      src/sys/netinet/sctp_pcb.c
>   1.2       +5 -4      src/sys/netinet/sctp_structs.h
>   1.2       +8 -8      src/sys/netinet/sctp_uio.h
>   1.3       +35 -21    src/sys/netinet/sctputil.c
>   1.2       +2 -2      src/sys/netinet/sctputil.h
>   1.3       +5 -4      src/sys/netinet6/sctp6_usrreq.c
> 
A few notes about this commit.. if your playing with SCTP
everything should work fine with a couple of cavets (besides
64 bit machines.. which may or may-not work :-0)

1) If you want to play with "mobility" type issues where you
    can have addresses come and go dynamically by your SCTP
    stack you need to:
    a) bind all addresses (INADDR_ANY).
    b) You need to enable the behavior with a sysctl
       net.inet.sctp.auto_asconf..
    c) This should enable you to do ifconfig inf new-addr netmask newmask
       and the association you create with a peer will stay up and
       reconfigure the addresses dynamically...

   Why: Well the reason it is a sysctl and must be activated is that
        currently the code needs some tweaking to make it so that if
        you had 10,000 associations up  and added an address you would
        not sink the machine :-( ... In theory we need to move this to
        a thread.. and/or to use the iterator (or both more like to help
        keep supporting apple and other platforms that do not have
        k-threads).

2) Paritial reliability is fully supported and can be accessed by
    using the send options described in the sctp-sockets draft in
    the IETF :-D

3) Authentication (sort-a like TCP-MD5.. but not requiring shared
    keys.. they are optional) is also fully supported.. you may
    use socket options to enable additional chunks (besides the
    required dynamic addressing ones) to be auth'd. Note that if
    you auth data, performance will drop to 1/5 of what it was :-0
    Shared keys can be set also by socket option
   (see the draft-ietf-tsvwg-auth .. soon to be RFC)... for more
    details. Note also, that you MAY not work with older versions
    that do not support the latest auth-draft (the one that finished
    WG-LC).. they added the chunks being auth'd to the key material.
    If you hit this problem (I don't any but BSD and IOS support this
    but you never know).. there is a compile option that can get the
    old draft behavior... send me an email in the "unlikely event of
    a water landing" :-)

4) If you are deep into playing with "TCP emulation mode, you will be
    turning on SCTP_EEOR on you socket (Explicit End Of Record). And
    setting your partial delivery point to 1 byte. This is cool and works
    gaining a bit of performance in the mix .. however there is currently
    a bug I am chasing. If the peer is NOT in this same mode.. and is in
    the more traditional.. implied-EEOR (where each send is considered a
    message) and the PD-API point is NOT set (left to default).. when the
    guy that is SCTP_EEOR mode closes the socket without sending the last
    data with an explicit EOR.. the peer will get stuck.. waiting for
    data. There is a missing wakeup somewhere that I need to find. All
    other modes (EEOR -> EEOR), (NON-EEOR -> NON-EEOR),
    (NON-EEOR -> EEOR) work fine.. its only the one case I have yet to
    nail.. I will try to get this fixed (and approved by gnn) as soon
    as I trace down this item.. I am hoping I can find it on my laptop
    on loopback.. or debugging will be a bit of a challenge :-0

5) You are best to not compile in any options .. just option SCTP ...
    however.. if you want to see LOTS of msgs on the console you can
    add SCTP_DEBUG... then you can either play with the sysctl var:
    net.inet.sctp.debug. This int is a bit mask that turns on various
    prints in the code.. if you are a REAL glutton make it 0xffffffff
    .. each bit has a different meaning... but please note I usualy
    NEVER compile with this option.. it adds a LOT of
    if(sctp_debug_on & MASK_VALUE) to the code... without it they
    disappear from the code at compile time. The other option is
    a socket option to set this value too... contact me offline if
    you want to know it..

6) If you want to enable Sally Floyd's High Speed TCP Congestion Control
    its a compile options option SCTP_HIGH_SPEED. In the future we will
    be adding more "pluggable" congestion control with a varient of
    Doug Leith's H-TCP as well as Sally's.. and make it a sysctl to
    switch amongst the choices :-)

7) If you really really are a junky for fun, there are a set of various
    logging utilites. You first start with SCTP_STAT_LOGGING options.
    this enables a 80,000 entry chunk of memory and all the utilities to
    log dynamically with minimal overhead (no locks, just an atomic op).
    Once you turn this on, you must select one of the other logging
    entries to get some real logs. There are things on cwnd/flight
    blocking/locking.. and all sorts of things. I actually have some
    tools where you can watch the cwnd/flight/rwnd in a conversation
    between two machines over time graphically... you suck this data
    out and then dump it into files which then can be plotted.. its
    kinda-cool actually.. but you have to be a real junky to want
    to play with this... if you are such a guy send me a private email
    and I will send you code and further instructions.

8) I will try to figure out where libsctp.a should go (the extra SCTP
    non-system call, system calls)... and a few select test tools.
    (advice would be appreciated).....

    You should, in theory, be able to take ANY TCP program and change
    the sd = socket(AF_INET, SOCK_STREAM, 0) [the 0 is sloppy programming
    in my mind now] and replace it with
    sd = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP)
    and your program should work.. there are equivilants to TCP_NODELAY
    and other socket options (just change the TCP to SCTP :-D).

    Note I usually use the one-2-many model.. which is gotten via
    sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_SCTP). This looks like
    udp more than anything else.. You just send to who you want to
    and if no assoc exists.. you will get one setup implicitly for
    you (also carrying your first message piggyback on the 3rd leg
    of the 4-way handshake) :-)

9) Tell me about anything strange please.. if there are issues (which
    there may be even besides the 64 bit ones) I want to know about it
    and get my small team working on fixing them. Most of the sctp geeks
    will be at the IETF so any problems this next week can hopefully be
    fixed fairly quickly :-)



Have fun and
Happy SCTPing :-)
R
-- 
Randall Stewart
NSSTG - Cisco Systems Inc.
803-345-0369 <or> 803-317-4952 (cell)


More information about the cvs-all mailing list