sctp.h

Go to the documentation of this file.
00001 //
00002 // Copyright (C) 2008 Irene Ruengeler
00003 //
00004 // This program is free software; you can redistribute it and/or
00005 // modify it under the terms of the GNU General Public License
00006 // as published by the Free Software Foundation; either version 2
00007 // of the License, or (at your option) any later version.
00008 //
00009 // This program is distributed in the hope that it will be useful,
00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012 // GNU General Public License for more details.
00013 //
00014 // You should have received a copy of the GNU General Public License
00015 // along with this program; if not, see <http://www.gnu.org/licenses/>.
00016 //
00017 
00018 #ifndef OPPSIM_NETINET_SCTP_H_
00019 #define OPPSIM_NETINET_SCTP_H_
00020 
00021 //#include "platdep/intxtypes.h"
00022 //cd gesamter #define und struct Block neu:
00023 
00024 #define UNORDERED_BIT 0x04
00025 #define BEGIN_BIT     0x02
00026 #define END_BIT       0x01
00027 #define T_BIT         0x01
00028 #define C_FLAG        0x08
00029 #define T_FLAG        0x04
00030 #define B_FLAG        0x02
00031 #define M_FLAG        0x01
00032 
00033 
00034 #define CRC32C(c,d) (c=(c>>8)^crc_c[(c^(d))&0xFF])
00035 static unsigned int crc_c[256] =
00036 {
00037 0x00000000L, 0xF26B8303L, 0xE13B70F7L, 0x1350F3F4L,
00038 0xC79A971FL, 0x35F1141CL, 0x26A1E7E8L, 0xD4CA64EBL,
00039 0x8AD958CFL, 0x78B2DBCCL, 0x6BE22838L, 0x9989AB3BL,
00040 0x4D43CFD0L, 0xBF284CD3L, 0xAC78BF27L, 0x5E133C24L,
00041 0x105EC76FL, 0xE235446CL, 0xF165B798L, 0x030E349BL,
00042 0xD7C45070L, 0x25AFD373L, 0x36FF2087L, 0xC494A384L,
00043 0x9A879FA0L, 0x68EC1CA3L, 0x7BBCEF57L, 0x89D76C54L,
00044 0x5D1D08BFL, 0xAF768BBCL, 0xBC267848L, 0x4E4DFB4BL,
00045 0x20BD8EDEL, 0xD2D60DDDL, 0xC186FE29L, 0x33ED7D2AL,
00046 0xE72719C1L, 0x154C9AC2L, 0x061C6936L, 0xF477EA35L,
00047 0xAA64D611L, 0x580F5512L, 0x4B5FA6E6L, 0xB93425E5L,
00048 0x6DFE410EL, 0x9F95C20DL, 0x8CC531F9L, 0x7EAEB2FAL,
00049 0x30E349B1L, 0xC288CAB2L, 0xD1D83946L, 0x23B3BA45L,
00050 0xF779DEAEL, 0x05125DADL, 0x1642AE59L, 0xE4292D5AL,
00051 0xBA3A117EL, 0x4851927DL, 0x5B016189L, 0xA96AE28AL,
00052 0x7DA08661L, 0x8FCB0562L, 0x9C9BF696L, 0x6EF07595L,
00053 0x417B1DBCL, 0xB3109EBFL, 0xA0406D4BL, 0x522BEE48L,
00054 0x86E18AA3L, 0x748A09A0L, 0x67DAFA54L, 0x95B17957L,
00055 0xCBA24573L, 0x39C9C670L, 0x2A993584L, 0xD8F2B687L,
00056 0x0C38D26CL, 0xFE53516FL, 0xED03A29BL, 0x1F682198L,
00057 0x5125DAD3L, 0xA34E59D0L, 0xB01EAA24L, 0x42752927L,
00058 0x96BF4DCCL, 0x64D4CECFL, 0x77843D3BL, 0x85EFBE38L,
00059 0xDBFC821CL, 0x2997011FL, 0x3AC7F2EBL, 0xC8AC71E8L,
00060 0x1C661503L, 0xEE0D9600L, 0xFD5D65F4L, 0x0F36E6F7L,
00061 0x61C69362L, 0x93AD1061L, 0x80FDE395L, 0x72966096L,
00062 0xA65C047DL, 0x5437877EL, 0x4767748AL, 0xB50CF789L,
00063 0xEB1FCBADL, 0x197448AEL, 0x0A24BB5AL, 0xF84F3859L,
00064 0x2C855CB2L, 0xDEEEDFB1L, 0xCDBE2C45L, 0x3FD5AF46L,
00065 0x7198540DL, 0x83F3D70EL, 0x90A324FAL, 0x62C8A7F9L,
00066 0xB602C312L, 0x44694011L, 0x5739B3E5L, 0xA55230E6L,
00067 0xFB410CC2L, 0x092A8FC1L, 0x1A7A7C35L, 0xE811FF36L,
00068 0x3CDB9BDDL, 0xCEB018DEL, 0xDDE0EB2AL, 0x2F8B6829L,
00069 0x82F63B78L, 0x709DB87BL, 0x63CD4B8FL, 0x91A6C88CL,
00070 0x456CAC67L, 0xB7072F64L, 0xA457DC90L, 0x563C5F93L,
00071 0x082F63B7L, 0xFA44E0B4L, 0xE9141340L, 0x1B7F9043L,
00072 0xCFB5F4A8L, 0x3DDE77ABL, 0x2E8E845FL, 0xDCE5075CL,
00073 0x92A8FC17L, 0x60C37F14L, 0x73938CE0L, 0x81F80FE3L,
00074 0x55326B08L, 0xA759E80BL, 0xB4091BFFL, 0x466298FCL,
00075 0x1871A4D8L, 0xEA1A27DBL, 0xF94AD42FL, 0x0B21572CL,
00076 0xDFEB33C7L, 0x2D80B0C4L, 0x3ED04330L, 0xCCBBC033L,
00077 0xA24BB5A6L, 0x502036A5L, 0x4370C551L, 0xB11B4652L,
00078 0x65D122B9L, 0x97BAA1BAL, 0x84EA524EL, 0x7681D14DL,
00079 0x2892ED69L, 0xDAF96E6AL, 0xC9A99D9EL, 0x3BC21E9DL,
00080 0xEF087A76L, 0x1D63F975L, 0x0E330A81L, 0xFC588982L,
00081 0xB21572C9L, 0x407EF1CAL, 0x532E023EL, 0xA145813DL,
00082 0x758FE5D6L, 0x87E466D5L, 0x94B49521L, 0x66DF1622L,
00083 0x38CC2A06L, 0xCAA7A905L, 0xD9F75AF1L, 0x2B9CD9F2L,
00084 0xFF56BD19L, 0x0D3D3E1AL, 0x1E6DCDEEL, 0xEC064EEDL,
00085 0xC38D26C4L, 0x31E6A5C7L, 0x22B65633L, 0xD0DDD530L,
00086 0x0417B1DBL, 0xF67C32D8L, 0xE52CC12CL, 0x1747422FL,
00087 0x49547E0BL, 0xBB3FFD08L, 0xA86F0EFCL, 0x5A048DFFL,
00088 0x8ECEE914L, 0x7CA56A17L, 0x6FF599E3L, 0x9D9E1AE0L,
00089 0xD3D3E1ABL, 0x21B862A8L, 0x32E8915CL, 0xC083125FL,
00090 0x144976B4L, 0xE622F5B7L, 0xF5720643L, 0x07198540L,
00091 0x590AB964L, 0xAB613A67L, 0xB831C993L, 0x4A5A4A90L,
00092 0x9E902E7BL, 0x6CFBAD78L, 0x7FAB5E8CL, 0x8DC0DD8FL,
00093 0xE330A81AL, 0x115B2B19L, 0x020BD8EDL, 0xF0605BEEL,
00094 0x24AA3F05L, 0xD6C1BC06L, 0xC5914FF2L, 0x37FACCF1L,
00095 0x69E9F0D5L, 0x9B8273D6L, 0x88D28022L, 0x7AB90321L,
00096 0xAE7367CAL, 0x5C18E4C9L, 0x4F48173DL, 0xBD23943EL,
00097 0xF36E6F75L, 0x0105EC76L, 0x12551F82L, 0xE03E9C81L,
00098 0x34F4F86AL, 0xC69F7B69L, 0xD5CF889DL, 0x27A40B9EL,
00099 0x79B737BAL, 0x8BDCB4B9L, 0x988C474DL, 0x6AE7C44EL,
00100 0xBE2DA0A5L, 0x4C4623A6L, 0x5F16D052L, 0xAD7D5351L,
00101 };
00102 
00103 
00104 struct common_header {
00105     unsigned short source_port;
00106     unsigned short destination_port;
00107     unsigned int  verification_tag;
00108     unsigned int  checksum;
00109 };
00110 
00111 struct chunk {
00112     unsigned char  type;
00113     unsigned char  flags;
00114     unsigned short length;
00115 };
00116 
00117 struct data_chunk {
00118     unsigned char  type;
00119     unsigned char  flags;
00120     unsigned short length;
00121     unsigned int  tsn;
00122     unsigned short sid;
00123     unsigned short ssn;
00124     unsigned int  ppi;
00125     unsigned char  user_data[0];
00126 };
00127 
00128 struct init_chunk {
00129     unsigned char  type;
00130     unsigned char  flags;
00131     unsigned short length;
00132     unsigned int  initiate_tag;
00133     unsigned int  a_rwnd;
00134     unsigned short mos;
00135     unsigned short mis;
00136     unsigned int  initial_tsn;
00137     unsigned char  parameter[0];
00138 };
00139 
00140 struct init_ack_chunk {
00141     unsigned char  type;
00142     unsigned char  flags;
00143     unsigned short length;
00144     unsigned int  initiate_tag;
00145     unsigned int  a_rwnd;
00146     unsigned short mos;
00147     unsigned short mis;
00148     unsigned int  initial_tsn;
00149     unsigned char  parameter[0];
00150 };
00151 
00152 struct sack_chunk {
00153     unsigned char  type;
00154     unsigned char  flags;
00155     unsigned short length;
00156     unsigned int  cum_tsn_ack;
00157     unsigned int  a_rwnd;
00158     unsigned short nr_of_gaps;
00159     unsigned short nr_of_dups;
00160     unsigned char  tsns[0];
00161 };
00162 
00163 struct heartbeat_chunk {
00164     unsigned char  type;
00165     unsigned char  flags;
00166     unsigned short length;
00167     unsigned char heartbeat_info[0];
00168 };
00169 
00170 struct heartbeat_ack_chunk {
00171     unsigned char  type;
00172     unsigned char  flags;
00173     unsigned short length;
00174     unsigned char heartbeat_info[0];
00175 };
00176 
00177 struct abort_chunk {
00178     unsigned char  type;
00179     unsigned char  flags;
00180     unsigned short length;
00181     unsigned char  error_causes[0];
00182 };
00183 
00184 struct shutdown_chunk {
00185     unsigned char  type;
00186     unsigned char  flags;
00187     unsigned short length;
00188     unsigned int  cumulative_tsn_ack;
00189 };
00190 
00191 struct shutdown_ack_chunk {
00192     unsigned char  type;
00193     unsigned char  flags;
00194     unsigned short length;
00195 };
00196 
00197 struct shutdown_complete_chunk {
00198     unsigned char  type;
00199     unsigned char  flags;
00200     unsigned short length;
00201 };
00202 
00203 struct cookie_echo_chunk {
00204     unsigned char  type;
00205     unsigned char  flags;
00206     unsigned short length;
00207     unsigned char  state_cookie[0];
00208 };
00209 
00210 struct cookie_ack_chunk {
00211     unsigned char  type;
00212     unsigned char  flags;
00213     unsigned short length;
00214 };
00215 
00216 struct error_chunk {
00217     unsigned char  type;
00218     unsigned char  flags;
00219     unsigned short length;
00220     unsigned char  error_causes[0];
00221 };
00222 
00223 
00224 // variable length parameters in INIT chunk:
00225 #define INIT_PARAM_IPV4 5
00226 #define INIT_PARAM_IPV6 6
00227 #define INIT_PARAM_COOKIE 7
00228 #define INIT_SUPPORTED_ADDRESS 12
00229 
00230 struct init_ipv4_address_parameter {
00231     unsigned short type;
00232     unsigned short length;
00233     unsigned int address;
00234 };
00235 
00236 struct init_ipv6_address_parameter {
00237     unsigned short type;
00238     unsigned short length;
00239     unsigned int address[4];
00240 };
00241 
00242 struct init_cookie_parameter {
00243     unsigned short type;
00244     unsigned short length;
00245     unsigned int creationTime;
00246     unsigned int localTag;
00247     unsigned int peerTag;
00248     unsigned char localTieTag[32];
00249     unsigned char peerTieTag[32];
00250     //unsigned char cookie[0];
00251 };
00252 
00253 struct cookie_parameter {
00254     unsigned int creationTime;
00255     unsigned int localTag;
00256     unsigned int peerTag;
00257     unsigned char localTieTag[32];
00258     unsigned char peerTieTag[32];
00259     //unsigned char cookie[0];
00260 };
00261 
00262 struct tlv {
00263     unsigned short type;
00264     unsigned short length;
00265     unsigned char value[0];
00266 };
00267 
00268 
00269 struct supported_address_types_parameter {
00270     unsigned short type;
00271     unsigned short length;
00272     unsigned short address_type;
00273 };
00274 
00275 
00276 // Heartbeat info TLV:
00277 struct heartbeat_info {
00278     unsigned short type;
00279     unsigned short length;
00280     union {
00281       unsigned char info[];
00282       struct {
00283         unsigned int addr;
00284         unsigned int time;
00285       } addr_and_time;
00286     } heartbeat_info_union;
00287 };
00288 
00289 #define HBI_INFO(hbi) ((hbi)->heartbeat_info_union.info)
00290 #define HBI_ADDR(hbi) ((hbi)->heartbeat_info_union.addr_and_time.addr)
00291 #define HBI_TIME(hbi) ((hbi)->heartbeat_info_union.addr_and_time.time)
00292 
00293 struct error_cause {
00294     unsigned short cause_code;
00295     unsigned short length;
00296     unsigned char info[0];
00297 };
00298 
00299 // SACK GAP:
00300 struct sack_gap {
00301     unsigned short start;
00302     unsigned short stop;
00303 };
00304 
00305 // SACK DUP TSN:
00306 struct sack_duptsn {
00307     unsigned int tsn;
00308 };
00309 
00310 
00311 struct data_vector {
00312 unsigned char  data[0];
00313 };
00314 
00315 #endif