1*a9e8ce38SDavid du Colombier /* 2*a9e8ce38SDavid du Colombier * iscsi - scsi over tcp/ip 3*a9e8ce38SDavid du Colombier * 4*a9e8ce38SDavid du Colombier * observations: 5*a9e8ce38SDavid du Colombier * iscsi names may be 223 bytes long. 6*a9e8ce38SDavid du Colombier * two namespaces, "iqn." and "eui.". 7*a9e8ce38SDavid du Colombier * don't need FIM when using tcp. 8*a9e8ce38SDavid du Colombier * rfc3720 §3.2.8.1 demonstrates that the authors don't understand (or 9*a9e8ce38SDavid du Colombier * don't trust) tcp: data isn't quietly dropped. 10*a9e8ce38SDavid du Colombier * 11*a9e8ce38SDavid du Colombier * we're not going to implement the optional digests (crcs), 12*a9e8ce38SDavid du Colombier * so those are omitted. 13*a9e8ce38SDavid du Colombier */ 14*a9e8ce38SDavid du Colombier 15*a9e8ce38SDavid du Colombier enum { 16*a9e8ce38SDavid du Colombier Bhdrsz = 48, 17*a9e8ce38SDavid du Colombier 18*a9e8ce38SDavid du Colombier /* initiator opcodes (requests) */ 19*a9e8ce38SDavid du Colombier Iopnopout= 0, 20*a9e8ce38SDavid du Colombier Iopcmd, 21*a9e8ce38SDavid du Colombier Ioptask, 22*a9e8ce38SDavid du Colombier Ioplogin, 23*a9e8ce38SDavid du Colombier Ioptext, 24*a9e8ce38SDavid du Colombier Iopdataout, /* write */ 25*a9e8ce38SDavid du Colombier Ioplogout, 26*a9e8ce38SDavid du Colombier Iopsnack= 0x10, 27*a9e8ce38SDavid du Colombier 28*a9e8ce38SDavid du Colombier /* target opcodes (responses) */ 29*a9e8ce38SDavid du Colombier Topnopin= 0x20, 30*a9e8ce38SDavid du Colombier Topresp, 31*a9e8ce38SDavid du Colombier Toptask, 32*a9e8ce38SDavid du Colombier Toplogin, 33*a9e8ce38SDavid du Colombier Toptext, 34*a9e8ce38SDavid du Colombier Topdatain, /* read */ 35*a9e8ce38SDavid du Colombier Toplogout, 36*a9e8ce38SDavid du Colombier Topr2t = 0x31, 37*a9e8ce38SDavid du Colombier Topasync, 38*a9e8ce38SDavid du Colombier Topreject= 0x3f, 39*a9e8ce38SDavid du Colombier 40*a9e8ce38SDavid du Colombier Immed = 1<<6, 41*a9e8ce38SDavid du Colombier Oprsrvd = 1<<7, 42*a9e8ce38SDavid du Colombier 43*a9e8ce38SDavid du Colombier /* opspfc */ 44*a9e8ce38SDavid du Colombier Finalpkt= 1<<7, 45*a9e8ce38SDavid du Colombier }; 46*a9e8ce38SDavid du Colombier 47*a9e8ce38SDavid du Colombier typedef struct Datainpkt Datainpkt; 48*a9e8ce38SDavid du Colombier typedef struct Iscsiasynch Iscsiasynch; 49*a9e8ce38SDavid du Colombier typedef struct Iscsicmdreq Iscsicmdreq; 50*a9e8ce38SDavid du Colombier typedef struct Iscsicmdresp Iscsicmdresp; 51*a9e8ce38SDavid du Colombier typedef struct Iscsidatain Iscsidatain; 52*a9e8ce38SDavid du Colombier typedef struct Iscsidataout Iscsidataout; 53*a9e8ce38SDavid du Colombier typedef struct Iscsijustbhdr Iscsijustbhdr; 54*a9e8ce38SDavid du Colombier typedef struct Iscsiloginreq Iscsiloginreq; 55*a9e8ce38SDavid du Colombier typedef struct Iscsiloginresp Iscsiloginresp; 56*a9e8ce38SDavid du Colombier typedef struct Iscsilogoutreq Iscsilogoutreq; 57*a9e8ce38SDavid du Colombier typedef struct Iscsilogoutresp Iscsilogoutresp; 58*a9e8ce38SDavid du Colombier typedef struct Iscsinopreq Iscsinopreq; /* nop out */ 59*a9e8ce38SDavid du Colombier typedef struct Iscsinopresp Iscsinopresp; /* nop in */ 60*a9e8ce38SDavid du Colombier typedef struct Iscsiready Iscsiready; 61*a9e8ce38SDavid du Colombier typedef struct Iscsireject Iscsireject; 62*a9e8ce38SDavid du Colombier typedef struct Iscsisnackreq Iscsisnackreq; 63*a9e8ce38SDavid du Colombier typedef struct Iscsistate Iscsistate; 64*a9e8ce38SDavid du Colombier typedef struct Iscsitaskreq Iscsitaskreq; 65*a9e8ce38SDavid du Colombier typedef struct Iscsitaskresp Iscsitaskresp; 66*a9e8ce38SDavid du Colombier typedef struct Iscsitextreq Iscsitextreq; 67*a9e8ce38SDavid du Colombier typedef struct Iscsitextresp Iscsitextresp; 68*a9e8ce38SDavid du Colombier typedef struct Pkt Pkt; 69*a9e8ce38SDavid du Colombier typedef struct Pkts Pkts; 70*a9e8ce38SDavid du Colombier typedef struct Resppkt Resppkt; 71*a9e8ce38SDavid du Colombier 72*a9e8ce38SDavid du Colombier /* 73*a9e8ce38SDavid du Colombier * iscsi on-the-wire packet formats 74*a9e8ce38SDavid du Colombier * 75*a9e8ce38SDavid du Colombier * all integers are stored big-endian. 76*a9e8ce38SDavid du Colombier * common pkt start is bhs, 48 bytes. 77*a9e8ce38SDavid du Colombier */ 78*a9e8ce38SDavid du Colombier 79*a9e8ce38SDavid du Colombier /* 80*a9e8ce38SDavid du Colombier * first 20 bytes are common *and* defined; another 28 follow but vary. 81*a9e8ce38SDavid du Colombier */ 82*a9e8ce38SDavid du Colombier #define Iscsibhdr \ 83*a9e8ce38SDavid du Colombier uchar op; \ 84*a9e8ce38SDavid du Colombier uchar opspfc[3]; \ 85*a9e8ce38SDavid du Colombier uchar totahslen; \ 86*a9e8ce38SDavid du Colombier uchar dseglen[3]; \ 87*a9e8ce38SDavid du Colombier uchar lun[8]; \ 88*a9e8ce38SDavid du Colombier uchar itt[4] /* initiator task tag */ 89*a9e8ce38SDavid du Colombier 90*a9e8ce38SDavid du Colombier struct Iscsijustbhdr { 91*a9e8ce38SDavid du Colombier Iscsibhdr; 92*a9e8ce38SDavid du Colombier }; 93*a9e8ce38SDavid du Colombier 94*a9e8ce38SDavid du Colombier struct Iscsiasynch { 95*a9e8ce38SDavid du Colombier Iscsibhdr; 96*a9e8ce38SDavid du Colombier 97*a9e8ce38SDavid du Colombier uchar _pad1[4]; 98*a9e8ce38SDavid du Colombier uchar stsseq[4]; 99*a9e8ce38SDavid du Colombier uchar expcmdseq[4]; 100*a9e8ce38SDavid du Colombier uchar maxcmdseq[4]; 101*a9e8ce38SDavid du Colombier 102*a9e8ce38SDavid du Colombier uchar event; 103*a9e8ce38SDavid du Colombier uchar vcode; 104*a9e8ce38SDavid du Colombier uchar param1[2]; 105*a9e8ce38SDavid du Colombier uchar param2[2]; 106*a9e8ce38SDavid du Colombier uchar param3[2]; 107*a9e8ce38SDavid du Colombier uchar _pad2[4]; 108*a9e8ce38SDavid du Colombier uchar dseg[]; /* dseg[dseglen] */ 109*a9e8ce38SDavid du Colombier }; 110*a9e8ce38SDavid du Colombier 111*a9e8ce38SDavid du Colombier 112*a9e8ce38SDavid du Colombier struct Iscsiloginreq { 113*a9e8ce38SDavid du Colombier Iscsibhdr; 114*a9e8ce38SDavid du Colombier 115*a9e8ce38SDavid du Colombier uchar cid[2]; 116*a9e8ce38SDavid du Colombier uchar _pad1[2]; 117*a9e8ce38SDavid du Colombier uchar cmdseq[4]; 118*a9e8ce38SDavid du Colombier uchar expstsseq[4]; 119*a9e8ce38SDavid du Colombier 120*a9e8ce38SDavid du Colombier uchar _pad2[16]; 121*a9e8ce38SDavid du Colombier uchar dseg[]; /* dseg[dseglen] */ 122*a9e8ce38SDavid du Colombier }; 123*a9e8ce38SDavid du Colombier 124*a9e8ce38SDavid du Colombier struct Iscsiloginresp { 125*a9e8ce38SDavid du Colombier Iscsibhdr; 126*a9e8ce38SDavid du Colombier 127*a9e8ce38SDavid du Colombier uchar _pad1[4]; 128*a9e8ce38SDavid du Colombier uchar stsseq[4]; 129*a9e8ce38SDavid du Colombier uchar expstsseq[4]; 130*a9e8ce38SDavid du Colombier uchar maxstsseq[4]; 131*a9e8ce38SDavid du Colombier 132*a9e8ce38SDavid du Colombier uchar stsclass; 133*a9e8ce38SDavid du Colombier uchar stsdetail; 134*a9e8ce38SDavid du Colombier uchar _pad2[10]; 135*a9e8ce38SDavid du Colombier uchar dseg[]; /* dseg[dseglen] */ 136*a9e8ce38SDavid du Colombier }; 137*a9e8ce38SDavid du Colombier 138*a9e8ce38SDavid du Colombier 139*a9e8ce38SDavid du Colombier struct Iscsilogoutreq { 140*a9e8ce38SDavid du Colombier Iscsibhdr; 141*a9e8ce38SDavid du Colombier 142*a9e8ce38SDavid du Colombier uchar cid[2]; 143*a9e8ce38SDavid du Colombier uchar _pad1[2]; 144*a9e8ce38SDavid du Colombier uchar cmdseq[4]; 145*a9e8ce38SDavid du Colombier uchar expstsseq[4]; 146*a9e8ce38SDavid du Colombier uchar _pad2[16]; 147*a9e8ce38SDavid du Colombier }; 148*a9e8ce38SDavid du Colombier 149*a9e8ce38SDavid du Colombier struct Iscsilogoutresp { 150*a9e8ce38SDavid du Colombier Iscsibhdr; 151*a9e8ce38SDavid du Colombier 152*a9e8ce38SDavid du Colombier uchar _pad1[4]; 153*a9e8ce38SDavid du Colombier uchar stsseq[4]; 154*a9e8ce38SDavid du Colombier uchar expcmdseq[4]; 155*a9e8ce38SDavid du Colombier uchar maxcmdseq[4]; 156*a9e8ce38SDavid du Colombier uchar _pad2[4]; 157*a9e8ce38SDavid du Colombier uchar waittime[2]; 158*a9e8ce38SDavid du Colombier uchar retaintime[2]; 159*a9e8ce38SDavid du Colombier uchar _pad3[4]; 160*a9e8ce38SDavid du Colombier }; 161*a9e8ce38SDavid du Colombier 162*a9e8ce38SDavid du Colombier 163*a9e8ce38SDavid du Colombier struct Iscsinopreq { /* nop-out */ 164*a9e8ce38SDavid du Colombier Iscsibhdr; 165*a9e8ce38SDavid du Colombier 166*a9e8ce38SDavid du Colombier uchar ttt[4]; 167*a9e8ce38SDavid du Colombier uchar cmdseq[4]; 168*a9e8ce38SDavid du Colombier uchar expcmdseq[4]; 169*a9e8ce38SDavid du Colombier uchar _pad2[16]; 170*a9e8ce38SDavid du Colombier uchar dseg[]; /* dseg[dseglen] */ 171*a9e8ce38SDavid du Colombier }; 172*a9e8ce38SDavid du Colombier 173*a9e8ce38SDavid du Colombier struct Iscsinopresp { /* nop-in */ 174*a9e8ce38SDavid du Colombier Iscsibhdr; 175*a9e8ce38SDavid du Colombier 176*a9e8ce38SDavid du Colombier uchar ttt[4]; 177*a9e8ce38SDavid du Colombier uchar stsseq[4]; 178*a9e8ce38SDavid du Colombier uchar expcmdseq[4]; 179*a9e8ce38SDavid du Colombier uchar maxcmdseq[4]; 180*a9e8ce38SDavid du Colombier uchar _pad2[12]; 181*a9e8ce38SDavid du Colombier uchar dseg[]; /* dseg[dseglen] */ 182*a9e8ce38SDavid du Colombier }; 183*a9e8ce38SDavid du Colombier 184*a9e8ce38SDavid du Colombier 185*a9e8ce38SDavid du Colombier struct Iscsiready { 186*a9e8ce38SDavid du Colombier Iscsibhdr; 187*a9e8ce38SDavid du Colombier 188*a9e8ce38SDavid du Colombier uchar ttt[4]; 189*a9e8ce38SDavid du Colombier uchar stsseq[4]; 190*a9e8ce38SDavid du Colombier uchar expcmdseq[4]; 191*a9e8ce38SDavid du Colombier uchar r2tseq[4]; 192*a9e8ce38SDavid du Colombier uchar bufoff[4]; 193*a9e8ce38SDavid du Colombier uchar xferlen[4]; 194*a9e8ce38SDavid du Colombier }; 195*a9e8ce38SDavid du Colombier 196*a9e8ce38SDavid du Colombier struct Iscsireject { 197*a9e8ce38SDavid du Colombier Iscsibhdr; 198*a9e8ce38SDavid du Colombier 199*a9e8ce38SDavid du Colombier uchar _pad2[4]; 200*a9e8ce38SDavid du Colombier uchar stsseq[4]; 201*a9e8ce38SDavid du Colombier uchar expcmdseq[4]; 202*a9e8ce38SDavid du Colombier uchar maxcmdseq[4]; 203*a9e8ce38SDavid du Colombier uchar r2tseq[4]; 204*a9e8ce38SDavid du Colombier uchar _pad3[4+4]; 205*a9e8ce38SDavid du Colombier uchar dseg[]; /* dseg[dseglen] */ 206*a9e8ce38SDavid du Colombier }; 207*a9e8ce38SDavid du Colombier 208*a9e8ce38SDavid du Colombier 209*a9e8ce38SDavid du Colombier struct Iscsicmdreq { 210*a9e8ce38SDavid du Colombier Iscsibhdr; 211*a9e8ce38SDavid du Colombier 212*a9e8ce38SDavid du Colombier uchar expxferlen[4]; 213*a9e8ce38SDavid du Colombier uchar cmdseq[4]; 214*a9e8ce38SDavid du Colombier uchar expstsseq[4]; 215*a9e8ce38SDavid du Colombier 216*a9e8ce38SDavid du Colombier uchar cdb[16]; 217*a9e8ce38SDavid du Colombier uchar dseg[]; /* dseg[dseglen] */ 218*a9e8ce38SDavid du Colombier }; 219*a9e8ce38SDavid du Colombier 220*a9e8ce38SDavid du Colombier struct Iscsicmdresp { 221*a9e8ce38SDavid du Colombier Iscsibhdr; 222*a9e8ce38SDavid du Colombier 223*a9e8ce38SDavid du Colombier uchar snacktag[4]; 224*a9e8ce38SDavid du Colombier uchar stsseq[4]; 225*a9e8ce38SDavid du Colombier uchar expcmdseq[4]; 226*a9e8ce38SDavid du Colombier uchar maxcmdseq[4]; 227*a9e8ce38SDavid du Colombier uchar expdataseq[4]; 228*a9e8ce38SDavid du Colombier uchar readresid[4]; 229*a9e8ce38SDavid du Colombier uchar resid[4]; 230*a9e8ce38SDavid du Colombier uchar dseg[]; /* dseg[dseglen] */ 231*a9e8ce38SDavid du Colombier }; 232*a9e8ce38SDavid du Colombier 233*a9e8ce38SDavid du Colombier 234*a9e8ce38SDavid du Colombier struct Iscsidatain { 235*a9e8ce38SDavid du Colombier Iscsibhdr; 236*a9e8ce38SDavid du Colombier 237*a9e8ce38SDavid du Colombier uchar ttt[4]; 238*a9e8ce38SDavid du Colombier uchar stsseq[4]; 239*a9e8ce38SDavid du Colombier uchar expcmdseq[4]; 240*a9e8ce38SDavid du Colombier uchar maxcmdseq[4]; 241*a9e8ce38SDavid du Colombier uchar dataseq[4]; 242*a9e8ce38SDavid du Colombier uchar buffoff[4]; 243*a9e8ce38SDavid du Colombier uchar resid[4]; 244*a9e8ce38SDavid du Colombier uchar dseg[]; /* dseg[dseglen] */ 245*a9e8ce38SDavid du Colombier }; 246*a9e8ce38SDavid du Colombier 247*a9e8ce38SDavid du Colombier struct Iscsidataout { /* a.k.a. data-out */ 248*a9e8ce38SDavid du Colombier Iscsibhdr; 249*a9e8ce38SDavid du Colombier 250*a9e8ce38SDavid du Colombier uchar ttt[4]; 251*a9e8ce38SDavid du Colombier uchar _pad1[4]; 252*a9e8ce38SDavid du Colombier uchar expstsseq[4]; 253*a9e8ce38SDavid du Colombier uchar _pad2[4]; 254*a9e8ce38SDavid du Colombier uchar dataseq[4]; 255*a9e8ce38SDavid du Colombier uchar buffoff[4]; 256*a9e8ce38SDavid du Colombier uchar _pad3[4]; 257*a9e8ce38SDavid du Colombier uchar dseg[]; /* dseg[dseglen] */ 258*a9e8ce38SDavid du Colombier }; 259*a9e8ce38SDavid du Colombier 260*a9e8ce38SDavid du Colombier 261*a9e8ce38SDavid du Colombier struct Iscsisnackreq { 262*a9e8ce38SDavid du Colombier Iscsibhdr; 263*a9e8ce38SDavid du Colombier 264*a9e8ce38SDavid du Colombier uchar ttt[4]; 265*a9e8ce38SDavid du Colombier uchar _pad1[4]; 266*a9e8ce38SDavid du Colombier uchar expstsseq[4]; 267*a9e8ce38SDavid du Colombier uchar _pad2[8]; 268*a9e8ce38SDavid du Colombier uchar begrun[4]; 269*a9e8ce38SDavid du Colombier uchar runlen[4]; 270*a9e8ce38SDavid du Colombier }; 271*a9e8ce38SDavid du Colombier 272*a9e8ce38SDavid du Colombier 273*a9e8ce38SDavid du Colombier struct Iscsitaskreq { 274*a9e8ce38SDavid du Colombier Iscsibhdr; 275*a9e8ce38SDavid du Colombier 276*a9e8ce38SDavid du Colombier uchar rtt[4]; 277*a9e8ce38SDavid du Colombier uchar cmdseq[4]; 278*a9e8ce38SDavid du Colombier uchar expstsseq[4]; 279*a9e8ce38SDavid du Colombier uchar refcmdseq[4]; 280*a9e8ce38SDavid du Colombier uchar expdataseq[4]; 281*a9e8ce38SDavid du Colombier uchar _pad1[8]; 282*a9e8ce38SDavid du Colombier }; 283*a9e8ce38SDavid du Colombier 284*a9e8ce38SDavid du Colombier struct Iscsitaskresp { 285*a9e8ce38SDavid du Colombier Iscsibhdr; 286*a9e8ce38SDavid du Colombier 287*a9e8ce38SDavid du Colombier uchar _pad2[4]; 288*a9e8ce38SDavid du Colombier uchar stsseq[4]; 289*a9e8ce38SDavid du Colombier uchar expcmdseq[4]; 290*a9e8ce38SDavid du Colombier uchar maxcmdseq[4]; 291*a9e8ce38SDavid du Colombier uchar _pad4[12]; 292*a9e8ce38SDavid du Colombier }; 293*a9e8ce38SDavid du Colombier 294*a9e8ce38SDavid du Colombier 295*a9e8ce38SDavid du Colombier /* req & resp identical? */ 296*a9e8ce38SDavid du Colombier struct Iscsitextreq { 297*a9e8ce38SDavid du Colombier Iscsibhdr; 298*a9e8ce38SDavid du Colombier 299*a9e8ce38SDavid du Colombier uchar ttt[4]; 300*a9e8ce38SDavid du Colombier uchar cmdseq[4]; 301*a9e8ce38SDavid du Colombier uchar expstsseq[4]; 302*a9e8ce38SDavid du Colombier uchar _pad1[16]; 303*a9e8ce38SDavid du Colombier uchar dseg[]; /* dseg[dseglen] */ 304*a9e8ce38SDavid du Colombier }; 305*a9e8ce38SDavid du Colombier 306*a9e8ce38SDavid du Colombier struct Iscsitextresp { 307*a9e8ce38SDavid du Colombier Iscsibhdr; 308*a9e8ce38SDavid du Colombier 309*a9e8ce38SDavid du Colombier uchar ttt[4]; 310*a9e8ce38SDavid du Colombier uchar cmdseq[4]; 311*a9e8ce38SDavid du Colombier uchar expstsseq[4]; 312*a9e8ce38SDavid du Colombier uchar _pad1[16]; 313*a9e8ce38SDavid du Colombier uchar dseg[]; /* dseg[dseglen] */ 314*a9e8ce38SDavid du Colombier }; 315*a9e8ce38SDavid du Colombier 316*a9e8ce38SDavid du Colombier /* 317*a9e8ce38SDavid du Colombier * packet-specific data 318*a9e8ce38SDavid du Colombier */ 319*a9e8ce38SDavid du Colombier struct Pkt { 320*a9e8ce38SDavid du Colombier union { 321*a9e8ce38SDavid du Colombier Iscsijustbhdr *pkthdr; 322*a9e8ce38SDavid du Colombier uchar *pkt; 323*a9e8ce38SDavid du Colombier }; 324*a9e8ce38SDavid du Colombier uint len; 325*a9e8ce38SDavid du Colombier }; 326*a9e8ce38SDavid du Colombier struct Resppkt { 327*a9e8ce38SDavid du Colombier Iscsicmdresp *resppkt; 328*a9e8ce38SDavid du Colombier uint resplen; 329*a9e8ce38SDavid du Colombier }; 330*a9e8ce38SDavid du Colombier struct Datainpkt { 331*a9e8ce38SDavid du Colombier Iscsidatain *datapkt; 332*a9e8ce38SDavid du Colombier uint datalen; 333*a9e8ce38SDavid du Colombier }; 334*a9e8ce38SDavid du Colombier 335*a9e8ce38SDavid du Colombier /* 336*a9e8ce38SDavid du Colombier * a request packet (pkt), its response packet (Resppkt), 337*a9e8ce38SDavid du Colombier * and an optional data-in packet for cmd read operations. 338*a9e8ce38SDavid du Colombier */ 339*a9e8ce38SDavid du Colombier struct Pkts { 340*a9e8ce38SDavid du Colombier int op; 341*a9e8ce38SDavid du Colombier int immed; 342*a9e8ce38SDavid du Colombier ulong totahslen; 343*a9e8ce38SDavid du Colombier ulong dseglen; 344*a9e8ce38SDavid du Colombier ulong itt; 345*a9e8ce38SDavid du Colombier 346*a9e8ce38SDavid du Colombier Pkt; 347*a9e8ce38SDavid du Colombier Datainpkt; 348*a9e8ce38SDavid du Colombier Resppkt; 349*a9e8ce38SDavid du Colombier }; 350*a9e8ce38SDavid du Colombier 351*a9e8ce38SDavid du Colombier /* 352*a9e8ce38SDavid du Colombier * iscsi state, maintained by both parties. 353*a9e8ce38SDavid du Colombier * some are per-connection, some per-session. 354*a9e8ce38SDavid du Colombier */ 355*a9e8ce38SDavid du Colombier struct Iscsistate { 356*a9e8ce38SDavid du Colombier ulong cmdseq; /* to be assigned to next command pkt */ 357*a9e8ce38SDavid du Colombier ulong expcmdseq; /* next cmd expected by target; previous done */ 358*a9e8ce38SDavid du Colombier ulong maxcmdseq; /* maxcmdseq-expcmdseq+1 is target's queue depth */ 359*a9e8ce38SDavid du Colombier 360*a9e8ce38SDavid du Colombier ulong stsseq; 361*a9e8ce38SDavid du Colombier ulong expstsseq; /* all previous sts seen */ 362*a9e8ce38SDavid du Colombier 363*a9e8ce38SDavid du Colombier ulong dataseq; 364*a9e8ce38SDavid du Colombier ulong r2tseq; 365*a9e8ce38SDavid du Colombier 366*a9e8ce38SDavid du Colombier ulong maxrcvseglen; 367*a9e8ce38SDavid du Colombier }; 368