/* returns non-zero if switch set a prefix */ int handle_set_request( int fd, int itf, Msgs *msgs, Message *m ){ VarBindList *vbl; VarBind *varbind; AsnOid *netprefix_oid, *set_oid; /* use varbind to compare OIDs of incoming message and that of an address status message */ varbind = (VarBind *)FIRST_LIST_ELMT( m->data->a.get_request->variable_bindings ); if( AsnOidCompare( &atmfNetPrefixStatus, &varbind->name ) == AsnOidRoot ){ vbl = msgs->set->data->a.set_request->variable_bindings; set_oid = &((VarBind *)FIRST_LIST_ELMT( vbl ))->name; netprefix_oid = accessNetPrefix(); if( netprefix_oid != NULL ){ diag( COMPONENT, DIAG_INFO, "switch registered a network prefix"); set_oid->octetLen = ADDRESS_LEN + 1; AsnOidAppend( set_oid, netprefix_oid ); AsnOidAppend( set_oid, esi_oid ); update_nsap( itf, netprefix_oid, esi_oid ); return 1; } else{ diag( COMPONENT, DIAG_INFO, "switch did not register prefix?" ); } } return 0; }
AsnInt getNetPrefix(VarBind *varbind, Variable *var) { int cmp; NetPrefixNode *prefix; AsnOid *varBindName; diag(COMPONENT,DIAG_DEBUG,"getNetPrefix"); varBindName = &varbind->name; if(AsnOidSize(varBindName) != NETPREFIX_LEN + INDEX_LEN || varbind->name.octs[NETPREFIX_LEN] != LOCALUNI || varbind->name.octs[NETPREFIX_LEN + 1] != NETPREFIX_STRINGLEN) return NOSUCHNAME; for(prefix = (NetPrefixNode *) var->value, cmp = AsnOidLess; prefix != NULL && (cmp = AsnOidCompare(varBindName, prefix->name)) < AsnOidEqual; prefix = prefix->next); if(cmp != AsnOidEqual) return NOSUCHNAME; varbind->value = Asn1Alloc(sizeof(struct ObjectSyntax)); varbind->value->choiceId = OBJECTSYNTAX_SIMPLE; varbind->value->a.simple = Asn1Alloc(sizeof(struct SimpleSyntax)); varbind->value->a.simple->choiceId = SIMPLESYNTAX_NUMBER; varbind->value->a.simple->a.number = VALID; return NOERROR; }
AsnInt setNetPrefix(VarBind *varbind, Variable *var) { int cmp; NetPrefixNode *prefix, *newPrefix; AsnOid *varBindName; diag(COMPONENT,DIAG_DEBUG,"setNetPrefix"); varBindName = &varbind->name; if(varbind->value->choiceId != OBJECTSYNTAX_SIMPLE || varbind->value->a.simple->choiceId != SIMPLESYNTAX_NUMBER || (varbind->value->a.simple->a.number != VALID && varbind->value->a.simple->a.number != INVALID)) return BADVALUE; if(AsnOidSize(varBindName) != NETPREFIX_LEN + INDEX_LEN || varBindName->octs[NETPREFIX_LEN] != LOCALUNI || varBindName->octs[NETPREFIX_LEN + 1] != NETPREFIX_STRINGLEN) return NOSUCHNAME; for(prefix = (NetPrefixNode *) var->value, cmp = AsnOidLess; prefix != NULL && (cmp = AsnOidCompare(varBindName, prefix->name)) < AsnOidEqual; prefix = prefix->next); if(varbind->value->a.simple->a.number == VALID && cmp != AsnOidEqual) { newPrefix = alloc_t(NetPrefixNode); newPrefix->name = alloc_t(AsnOid); newPrefix->name->octs = alloc(varBindName->octetLen); AsnOidCopy(newPrefix->name, varBindName); { NetPrefixNode *tmp = (NetPrefixNode *) var->value; Q_INSERT_BEFORE(tmp, newPrefix, prefix); } if(atmNetPrefix.octs == NULL) { atmNetPrefix.octetLen = varBindName->octetLen - NETPREFIX_LEN - 2; atmNetPrefix.octs = alloc(atmNetPrefix.octetLen); memcpy(atmNetPrefix.octs, &varBindName->octs[NETPREFIX_LEN + 2], atmNetPrefix.octetLen); } } else if (varbind->value->a.simple->a.number == INVALID && cmp == AsnOidEqual) { { NetPrefixNode *tmp = (NetPrefixNode *) var->value; Q_REMOVE(tmp, prefix); } } return NOERROR; }
AsnInt getnextNetPrefix(VarBind *varbind, Variable *var) { NetPrefixNode *prefix; AsnOid *varBindName; varBindName = &varbind->name; for(prefix = (NetPrefixNode *) var->value; prefix != NULL && AsnOidCompare(prefix->name, varBindName) != AsnOidGreater; prefix = prefix->next); if(prefix == NULL) return NOSUCHNAME; varbind->name.octs = Asn1Alloc(prefix->name->octetLen); AsnOidCopy(varBindName, prefix->name); varbind->value = Asn1Alloc(sizeof(struct ObjectSyntax)); varbind->value->choiceId = OBJECTSYNTAX_SIMPLE; varbind->value->a.simple = Asn1Alloc(sizeof(struct SimpleSyntax)); varbind->value->a.simple->choiceId = SIMPLESYNTAX_NUMBER; varbind->value->a.simple->a.number = VALID; return NOERROR; }