- Handle the 'GET PREFIX' request.

- Deal with MADGE_OBJECT1 requests.
- Move code inside of switch cases to separate functions.

Submitted by:	 Richard Hodges <rh@matriplex.com>
This commit is contained in:
Matthew N. Dodd 2003-03-25 20:34:46 +00:00
parent a5454382a3
commit d66e94ca99

View File

@ -2116,11 +2116,34 @@ process_get ( hdr, intf )
{
Variable *var;
int idx;
int x;
int oidlen;
var = hdr->head;
while ( var ) {
/* Handle the 'GET PREFIX' request */
oidlen = Objids[SETPFX_OBJID].oid[0];
if (oid_ncmp(&var->oid, &Objids[SETPFX_OBJID], oidlen) == 0) {
var->var.ival = 2; /* assume not valid */
for(x = 0; x < 13; x++)
if (var->oid.oid[oidlen + x + 2] !=
addressEntry[intf].oid[x + 1])
break;
/* Address Match */
if (x == 13)
hdr->head->var.ival = 1;
var = var->next;
continue;
}
idx = find_var ( var );
switch ( idx ) {
case MADGE_OBJECT1:
/* reply with NO SUCH OBJECT */
var->type = ASN_NULL;
break;
case SYS_OBJID:
var->type = ASN_OBJID;
bcopy ( (caddr_t)&Objids[MY_OBJID],
@ -2192,6 +2215,138 @@ process_get ( hdr, intf )
}
/******************************************************************************
*
* Find an OBJID from known ones
*
* in: Variable with valid OID
* out: OID number (index), -1 = not found
*/
static int
lmi_object_find(Variable *var)
{
Objid * obj_var;
Objid * obj_cur;
int x;
int y;
obj_var = &var->oid;
for (x = 0; x < NUM_OIDS; x++) {
obj_cur = &Objids[x];
for (y = 0; y < 128; y++) {
if (obj_var->oid[y] != obj_cur->oid[y])
break;
if (obj_var->oid[y] == 0) /* object ID endmark */
return (x);
}
}
return (-1);
}
/******************************************************************************
*
* Append instance number to OID
*
* in: Variable, instance number
* out: zero = success
*
*/
static int
lmi_object_instance(Variable *var, int instnum)
{
int * oidptr;
int curlen;
oidptr = var->oid.oid;
curlen = oidptr[0]; /* current length */
if (curlen > 126)
return (1);
curlen++;
oidptr[curlen] = instnum;
oidptr[0] = curlen;
return (0);
}
/******************************************************************************
*
* Handle received GETNEXT
*
* in: Header with valid fields, interface number
* out: zero = success
*
*/
static int
lmi_rcvcmd_getnext(Snmp_Header *header, int intf)
{
int * oidptr;
int oidlen;
int oidnum;
int x;
oidnum = lmi_object_find(header->head);
oidptr = header->head->oid.oid;
oidlen = oidptr[0];
switch(oidnum) {
/* Should be because the remote side is attempting
* to verify that our table is empty
*/
case ADDRESS_OBJID:
if ( addressEntry[intf].oid[0] ) {
/* XXX - FIXME */
/* Our table is not empty - return address */
}
break;
/* Madge Collage sends GETNEXT for this */
case SETPFX_OBJID:
if(addressEntry[intf].oid[0]) { /* we have a prefix */
oidptr[0] += 14;
oidptr += oidlen; /* skip to last number */
oidptr++;
*oidptr++ = 13; /* length of prefix */
/* fill in the prefix */
for(x = 0; x < 13; x++) {
*oidptr++ = addressEntry[intf].oid[x+1];
}
header->head->type = ASN_INTEGER;
/* 1=valid, 2=invalid -- only 2 values */
header->head->var.ival = 1;
} else { /* no prefix available */
header->head->type = ASN_NULL;
}
break;
default:
return (1); /* unknown object ID */
}
build_pdu(header, PDU_TYPE_GETRESP);
send_resp(intf, header, Resp_Buf);
return (0);
}
/******************************************************************************
*
* Handle received TRAP
*
* in: Header with valid fields, interface number
* out: zero = success
*
*/
static int
lmi_rcvcmd_trap(Snmp_Header *header, int intf)
{
bzero((caddr_t)&addressEntry[intf], sizeof(Objid));
return (0);
}
/*
* ILMI State Processing Loop
*
@ -2346,20 +2501,7 @@ ilmi_do_state ()
/* The only messages we care about are GETNEXTs, GETRESPs, and TRAPs */
switch ( Hdr->pdutype ) {
case PDU_TYPE_GETNEXT:
/*
* Should be because the remote side is attempting
* to verify that our table is empty
*/
if ( oid_ncmp ( (caddr_t)&Hdr->head->oid,
(caddr_t)&Objids[ADDRESS_OBJID],
Objids[ADDRESS_OBJID].oid[0] ) == 0 ) {
if ( addressEntry[intf].oid[0] ) {
/* XXX - FIXME */
/* Our table is not empty - return address */
}
}
build_pdu ( Hdr, PDU_TYPE_GETRESP );
send_resp ( intf, Hdr, Resp_Buf );
lmi_rcvcmd_getnext(Hdr, intf);
break;
case PDU_TYPE_GETRESP:
/*
@ -2421,6 +2563,7 @@ ilmi_do_state ()
break;
case PDU_TYPE_TRAP:
/* Remote side wants us to start fresh */
lmi_rcvcmd_trap(Hdr, intf);
free_pdu ( Hdr );
break;
default:
@ -2442,8 +2585,7 @@ ilmi_do_state ()
free_pdu ( Hdr );
break;
case PDU_TYPE_GETNEXT:
build_pdu ( Hdr, PDU_TYPE_GETRESP );
send_resp ( intf, Hdr, Resp_Buf );
lmi_rcvcmd_getnext(Hdr, intf);
break;
case PDU_TYPE_SET:
/* Look for SET_PREFIX Objid */
@ -2461,6 +2603,7 @@ ilmi_do_state ()
}
break;
case PDU_TYPE_TRAP:
lmi_rcvcmd_trap(Hdr, intf);
free_pdu ( Hdr );
break;
}