Hi,

On Solaris 10-U2 I have observed some issues with the TCP streams module 
interaction with Sybase ASE database server, If any module is pushed in between 
tcp and sockfs modules and also tcp fusion is enabled on that box.

More details

I have written a dummy streams module “testm” (doing nothing) and pushed it on 
top of tcp module as follows,

#autopush –f  /etc/testm.ap         ## Content of testm.ap ----“         
tcp    -1      0       testm”

As a side effect of pushing this module if I started SybaseASE server, 
generating heavy traffic especially new concurrent TCPconnections causes the 
ASE to drop some user sessions with thefollowing error,

“ct_connect():protocol specific layer: external error: There is a tds protocol 
error.Premature end of the datastream was encountered”.

In normal conditions without large concurrent TCP open/Close calls everything 
works fine.

Please note if I take out the module from tcp stack then everything works fine, 
also if I disable the tcp fusion (by setting set ip:do_tcp_fusion = 0x0 in 
/etec/system) then ASE works fine.

I have enclosed the driver source below for reference

Regards,

Laxmi

 

-------------------------------------------------------------------------------

static struct fmodsw fsw = {

      "testm",          /* module name */

      &testm_info,      /* streams information */

      (D_NEW | D_MP | D_MTQPAIR)    /* D_NEW - new-style driver, D_MP - MT Safe 
module, */

      /* D_MTQPAIR - Inner exclusive perimeter around individual Q Pair */

};

 

int

_init()

{
      return (mod_install(&modlinkage));
}

 
static int

testmopen(queue_t * q, dev_t * devp, int oflag, int sflag,

          cred_t * credp)

{

      qprocson(q);

      return (0);

}

static int

testmclose(queue_t * q, int flag, cred_t * credp)

{

      qprocsoff(q);

      return (0);

}

 
static int

testmwput(register queue_t * q, register mblk_t * mp)

{

      (void) putnext(q, mp);  /* pass it down the line */

      return (0);

}

 
static int

testmrput(queue_t * q, mblk_t * mp)

{

      (void) putnext(q, mp);  /* pass it down the line */

      return (0);

}

-------------------------------------------------------------------------------

 
_______________________________________________
networking-discuss mailing list
[email protected]

Reply via email to