[comp.sys.isis] Summary of bug fixes in isis_remote, isis_probe

ken@cs.cornell.edu (Ken Birman) (04/16/91)

A user at Bellcore asked if I could re-post the changes need to get
isis_remote and isis_probe working in V2.1 (he is aware that they are
slow compared with the V3.0 version, but just wants to make sure he
understands the interface).

1) in cl_inter.c, you want the code to look like this (changes flagged with
***)

   lines 393->425 of cl_inter.c/net_send(...):
        while(!aptr_isnull(to))
        {
            if(!addr_ismine(to))
            {
                register qnode *qp = pg_find(IOQS, to);
                register ioq *ioqp;
                if(qp == 0)
                {
***                 register msgid = msg_getid(mp);
***                 address save;
***                 save = my_address;
***                 if(exmode == -1 && (msgid&1)
***                     && to->addr_site == my_site_no && addr_isrclient(to))
                    {
                        /* ISIS -> remote_xxx */
                        register message *rmsg = msg_newmsg();
                        msg_addfield(rmsg, FLD_ISNULLREP, 0, 0, 0);
                        msg_setid(rmsg, msgid);
                        my_address = *to;
                        fbcast_l("mR", msg_getreplyto(mp), GENERIC_RCV_REPLY, rm
sg, 0);
                    }
                    my_address = save;
                    if(callback)
                        (*callback)(to, arg0, arg1);
                }
                else
                {
                    ioqp = qp->qu_ioq;
                    if(addr_cmp(to, &ioqp->io_claddr) == 0)
                        (void)intercl_trytosend(mp, ioqp, FALSE, callback, arg0,
 arg1);
                    else if(callback)
                        (*callback)(to, arg0, arg1);
                }
            }
            ++to;
        }

As for isis_probe, in clib/cl_isis.c, make the routine look like this:

static  probe_tid, probe_freq;

static void
isis_send_hello()
  {
        register message *msg;
        address addr;
        msg = msg_newmsg();
        addr = PRO(CL_HELLO);
        isis_send(&addr, msg);
        msg_delete(msg);
        probe_tid = isis_timeout_reschedule(probe_tid, probe_freq*1000, isis_sen
d_hello, NULLARG, NULLARG);
  }

int
isis_probe(freq, timeout)
  int freq, timeout;
  {
        register message *msg;
        address addr;
        static tid;
        ISIS_ENTER();
        msg = msg_gen("%d,%d", freq, timeout);
        addr = PRO(CL_PROBE);
        isis_send(&addr, msg);
        probe_freq = freq;
        probe_tid = isis_timeout_reschedule(probe_tid, probe_freq*1000, isis_sen
d_hello, NULLARG, NULLARG);
        msg_delete(msg);
        ISIS_RETURN(0);
  }

... note that failures will not be detected until the probe interval
expires.
-- 
Kenneth P. Birman                              E-mail:  ken@cs.cornell.edu
4105 Upson Hall, Dept. of Computer Science     TEL:     607 255-9199 (office)
Cornell University Ithaca, NY 14853 (USA)      FAX:     607 255-4428