From: chas w. <ch...@us...> - 2008-01-01 00:15:29
|
Update of /cvsroot/linux-atm/linux-atm/src/ilmid In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv24942/src/ilmid Modified Files: Makefile.am atmf_uni.c atmf_uni.h ilmid.c io.c io.h message.c message.h mib.c mib.h rfc1155_smi.h Added Files: .cvsignore actions.c actions.h ilmid.8 ilmid.h ilmidiag.c states.c states.h wait.c wait.h Log Message: merge 2.5.0 branch into the head Index: Makefile.am =================================================================== RCS file: /cvsroot/linux-atm/linux-atm/src/ilmid/Makefile.am,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** Makefile.am 9 Oct 2001 22:33:06 -0000 1.2 --- Makefile.am 1 Jan 2008 00:14:50 -0000 1.3 *************** *** 1,16 **** SUBDIRS = asn1 ! INCLUDES = -I$(top_builddir)/src/ilmid/asn1 ! sbin_PROGRAMS = ilmid ilmid_SOURCES = rfc1157_snmp.c rfc1157_snmp.h rfc1155_smi.c rfc1155_smi.h \ util.c util.h io.c io.h message.c message.h \ atmf_uni.c atmf_uni.h mib.c mib.h \ ! sysgroup.c sysgroup.h ilmid.c ilmid_LDADD = $(top_builddir)/src/lib/libatm.la \ $(top_builddir)/src/ilmid/asn1/libasn1.a ilmid_DEPENDENCIES = $(ilmid_LDADD) ! EXTRA_DIST = COPYRIGHT --- 1,23 ---- SUBDIRS = asn1 ! INCLUDES = -I$(srcdir)/../ilmid/asn1 ! sbin_PROGRAMS = ilmid ilmidiag ilmid_SOURCES = rfc1157_snmp.c rfc1157_snmp.h rfc1155_smi.c rfc1155_smi.h \ util.c util.h io.c io.h message.c message.h \ atmf_uni.c atmf_uni.h mib.c mib.h \ ! sysgroup.c sysgroup.h ilmid.c ilmid.h \ ! wait.c wait.h states.c states.h actions.c actions.h ilmid_LDADD = $(top_builddir)/src/lib/libatm.la \ $(top_builddir)/src/ilmid/asn1/libasn1.a ilmid_DEPENDENCIES = $(ilmid_LDADD) ! ilmidiag_SOURCES = ilmidiag.c ! ilmidiag_LDADD = $(top_builddir)/src/lib/libatm.la ! ilmidiag_DEPENDENCIES = $(ilmid_LDADD) ! ! man_MANS = ilmid.8 ! ! EXTRA_DIST = COPYRIGHT ilmid.8 Index: atmf_uni.c =================================================================== RCS file: /cvsroot/linux-atm/linux-atm/src/ilmid/atmf_uni.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** atmf_uni.c 9 Oct 2001 22:33:06 -0000 1.2 --- atmf_uni.c 1 Jan 2008 00:14:50 -0000 1.3 *************** *** 38,42 **** --- 38,47 ---- #define INVALID 2 + AsnOid foreQ2931AdminConfigType = + {19, "\53\06\01\04\01\202\106\02\02\02\01\06\02\01\01\01\13\00\00" }; + AsnOid foreQ2931NNIProto = + {19, "\53\06\01\04\01\202\106\02\02\02\01\06\02\01\01\01\102\00\00" }; AsnOid atmfPortIndex = {13, "\53\06\01\04\01\202\141\02\01\01\01\01\00"}; + AsnOid atmfPortMyIfName = {13, "\53\06\01\04\01\202\141\02\01\01\01\07\00"}; AsnOid atmfPortMyIdentifier = {13, "\53\06\01\04\01\202\141\02\01\01\01\10\00"}; AsnOid atmfMyIpNmAddress = {11, "\53\06\01\04\01\202\141\02\01\02\00"}; *************** *** 44,49 **** --- 49,84 ---- AsnOid atmfAtmLayerMaxVpiBits = {13, "\53\06\01\04\01\202\141\02\02\01\01\6\00"}; AsnOid atmfAtmLayerMaxVciBits = {13, "\53\06\01\04\01\202\141\02\02\01\01\7\00"}; + AsnOid atmfAtmLayerUniType = {13, "\53\06\01\04\01\202\141\02\02\01\01\10\00"}; AsnOid atmfAtmLayerUniVersion = {13, "\53\06\01\04\01\202\141\02\02\01\01\11\00"}; + AsnOid atmfAtmLayerDeviceType = {13, "\53\06\01\04\01\202\141\02\02\01\01\12\00"}; + AsnOid atmfAtmLayerIlmiVersion = {13, "\53\06\01\04\01\202\141\02\02\01\01\13\00"}; + AsnOid atmfAtmLayerNniSigVersion = {13, "\53\06\01\04\01\202\141\02\02\01\01\14\00"}; AsnOid atmfNetPrefixStatus = {NETPREFIX_LEN, "\53\06\01\04\01\202\141\02\07\01\01\03"}; + AsnOid atmfSrvcRegATMAddress = + // {26, "\53\06\01\04\01\202\141\02\10\01\01\03\00\12\01\03\06\01\04\01\202\141\01\05\01\01"}; + {25, "\53\06\01\04\01\202\141\02\10\01\01\03\00\12\01\03\06\01\04\01\202\141\01\05\01"}; + + + AsnOid atmfSrvcRegTable = { 10, "\53\06\01\04\01\202\141\02\10\01" }; + AsnOid atmfAddressTable = { 9, "\53\06\01\04\01\202\141\02\06" }; + AsnOid atmfAddressStatus = { 12, "\53\06\01\04\01\202\141\02\06\01\01\03" }; + AsnOid atmfAddressRegistrationAdminStatus = + { 13, "\53\06\01\04\01\202\141\02\13\01\01\02\00" }; + + /* 1 = PublicUNI + 2 = automode + 3 = iisp + 4 = ftPNNI + 5 = privateNNI + 6 = privateUNI + */ + AsnInt foreQ2931AdminConfigTypeValue = 6; /* private uni */ + + /* 1 = none + 2 = ftpnni + 3 = forum-pnni + 4 = iisp + */ + AsnInt foreQ2931NNIProtoValue = 1; /* none */ AsnInt atmfPortIndexValue = 0; *************** *** 55,59 **** AsnInt atmfAtmLayerMaxVpiBitsValue; AsnInt atmfAtmLayerMaxVciBitsValue; ! #if defined(UNI30) || defined(DYNAMIC_UNI) --- 90,97 ---- AsnInt atmfAtmLayerMaxVpiBitsValue; AsnInt atmfAtmLayerMaxVciBitsValue; ! AsnInt atmfAtmLayerUniTypeValue = 2; /* private */ ! AsnInt atmfAtmLayerDeviceTypeValue = 1; /* user (ATM End System) */ ! AsnInt atmfAtmLayerIlmiVersionValue = 2; /* version4point0 */ ! AsnInt atmfAtmLayerNniSigVersionValue = 1; /* unsupported */ #if defined(UNI30) || defined(DYNAMIC_UNI) *************** *** 68,71 **** --- 106,110 ---- static AsnOid atmNetPrefix = {0, NULL}; + static AsnOcts atmLecsAddress = {0, NULL}; typedef struct NetPrefixNode *************** *** 111,114 **** --- 150,154 ---- AsnOid *varBindName; + diag(COMPONENT,DIAG_DEBUG,"getNetPrefix"); varBindName = &varbind->name; if(AsnOidSize(varBindName) != NETPREFIX_LEN + INDEX_LEN || *************** *** 165,168 **** --- 205,209 ---- AsnOid *varBindName; + diag(COMPONENT,DIAG_DEBUG,"setNetPrefix"); varBindName = &varbind->name; if(varbind->value->choiceId != OBJECTSYNTAX_SIMPLE || *************** *** 188,192 **** newPrefix->name->octs = alloc(varBindName->octetLen); AsnOidCopy(newPrefix->name, varBindName); ! Q_INSERT_BEFORE((NetPrefixNode *) var->value, newPrefix, prefix); if(atmNetPrefix.octs == NULL) { --- 229,236 ---- 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) { *************** *** 198,204 **** else if (varbind->value->a.simple->a.number == INVALID && cmp == AsnOidEqual) { ! Q_REMOVE((NetPrefixNode *) var->value, prefix); } return NOERROR; } --- 242,281 ---- else if (varbind->value->a.simple->a.number == INVALID && cmp == AsnOidEqual) { ! { ! NetPrefixNode *tmp = (NetPrefixNode *) var->value; ! Q_REMOVE(tmp, prefix); ! } } return NOERROR; } + + AsnInt getLecsAddress(VarBind *varbind, Variable *var) + { + int cmp; + NetPrefixNode *prefix; + AsnOid *varBindName; + + diag(COMPONENT,DIAG_INFO,"getLecsAddress" ); + varBindName = &varbind->name; + if(AsnOidSize(varBindName) != 25 ) 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; + } + Index: atmf_uni.h =================================================================== RCS file: /cvsroot/linux-atm/linux-atm/src/ilmid/atmf_uni.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** atmf_uni.h 9 Oct 2001 22:33:06 -0000 1.2 --- atmf_uni.h 1 Jan 2008 00:14:50 -0000 1.3 *************** *** 30,34 **** --- 30,37 ---- #include "mib.h" + extern AsnOid foreQ2931NNIProto; + extern AsnOid foreQ2931AdminConfigType; extern AsnOid atmfPortIndex; + extern AsnOid atmfPortMyIfName; extern AsnOid atmfPortMyIdentifier; extern AsnOid atmfMyIpNmAddress; *************** *** 37,42 **** --- 40,56 ---- extern AsnOid atmfAtmLayerMaxVpiBits; extern AsnOid atmfAtmLayerMaxVciBits; + extern AsnOid atmfAtmLayerUniType; extern AsnOid atmfAtmLayerUniVersion; + extern AsnOid atmfAtmLayerDeviceType; + extern AsnOid atmfAtmLayerIlmiVersion; + extern AsnOid atmfAtmLayerNniSigVersion; + extern AsnOid atmfSrvcRegATMAddress; + extern AsnOid atmfSrvcRegTable; + extern AsnOid atmfAddressTable; + extern AsnOid atmfAddressStatus; + extern AsnOid atmfAddressRegistrationAdminStatus; + extern AsnInt foreQ2931NNIProtoValue; + extern AsnInt foreQ2931AdminConfigTypeValue; extern AsnInt atmfPortIndexValue; extern IpAddress atmfMyIpNmAddressValue; *************** *** 44,48 **** --- 58,66 ---- extern AsnInt atmfAtmLayerMaxVpiBitsValue; extern AsnInt atmfAtmLayerMaxVciBitsValue; + extern AsnInt atmfAtmLayerUniTypeValue; extern AsnInt atmfAtmLayerUniVersionValue; + extern AsnInt atmfAtmLayerDeviceTypeValue; + extern AsnInt atmfAtmLayerIlmiVersionValue; + extern AsnInt atmfAtmLayerNniSigVersionValue; AsnOid *accessNetPrefix(void); *************** *** 53,55 **** --- 71,77 ---- AsnInt getMyIp(VarBind *varbind, Variable *var); + AsnOid *accessLecsAddress( void ); + AsnInt setLecsAddress(VarBind *varbind, Variable *var); + AsnInt getLecsAddress(VarBind *varbind, Variable *var); + #endif Index: ilmid.c =================================================================== RCS file: /cvsroot/linux-atm/linux-atm/src/ilmid/ilmid.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** ilmid.c 9 Oct 2001 22:33:06 -0000 1.2 --- ilmid.c 1 Jan 2008 00:14:50 -0000 1.3 *************** *** 30,33 **** --- 30,37 ---- */ + /* + * Reference material used: af-ilmi-0065.000 + */ + #if HAVE_CONFIG_H #include <config.h> *************** *** 35,40 **** --- 39,49 ---- #include <unistd.h> + #include <stdlib.h> + #include <stdarg.h> #include <sys/time.h> + #include <sys/types.h> + #include <sys/wait.h> #include <errno.h> + #include <signal.h> #include "asn_incl.h" #include "rfc1155_smi.h" *************** *** 47,141 **** #include "atmf_uni.h" #include "sysgroup.h" #define RESPONSE_TIMEOUT 2 #define POLL_PERIOD 15 #define COMPONENT "ILMI" - typedef enum IlmiState { NO_CHANGE, RESTART, VERIFY, NET_PREFIX, - ADDRESS, POLL, IDLE } IlmiState; - const char *state2text[7] = { "NO_CHANGE", "RESTART", "VERIFY", "NET_PREFIX", - "ADDRESS", "POLL", "IDLE" }; - void usage(char *name); - void ilmi_loop(int fd, int itf); ! void usage(char *name) ! { fprintf(stderr, "usage: %s [-b] [-d] [-v] [-l logfile] [-x] [-q qos]\n" ! "%13s[ -i local_ip ] [ -u uni ] <interface>\n",name,""); fprintf(stderr, "%6s %s -V\n","",name); exit(1); } ! void ilmi_loop(int fd, int itf) ! { ! int no_response; ! long int requestID; ! Message *poll_message, *set_message, *coldstart_message, *in_message; ! AsnOid *set_oid, *netprefix_oid, *esi_oid; VarBind *varbind; ! struct timeval timeout; ! IlmiState state, new_state; ! ! resetUpTime(); ! poll_message = create_poll_message(); ! set_message = create_set_message(); ! set_oid = &((VarBind *) FIRST_LIST_ELMT(set_message->data->a.set_request->variable_bindings))->name; ! esi_oid = get_esi(fd,itf); ! coldstart_message = create_coldstart_message(); ! in_message = alloc_t(Message); ! ! /* Address registration state machine */ ! new_state = RESTART; ! for(;;) ! { ! state = new_state; ! diag(COMPONENT, DIAG_DEBUG, "entering state %s", state2text[state]); ! ! /* Output for the current state */ ! switch(state) ! { ! case RESTART: ! deleteNetPrefix(); ! diag(COMPONENT, DIAG_INFO, "sending cold-start"); ! coldstart_message->data->a.trap->time_stamp = accessUpTime(); ! send_message(fd, coldstart_message); ! no_response = 0; ! ! case VERIFY: ! diag(COMPONENT, DIAG_INFO, "sending get-next"); ! poll_message->data->a.get_next_request->request_id = ++requestID; ! send_message(fd, poll_message); ! break; ! case ADDRESS: ! diag(COMPONENT, DIAG_INFO, "setting the atm address on the switch"); ! set_message->data->a.set_request->request_id = ++requestID; ! send_message(fd, set_message); ! break; ! case POLL: ! diag(COMPONENT, DIAG_INFO, "sending get-next request"); ! poll_message->data->a.get_next_request->request_id = ++requestID; ! send_message(fd, poll_message); ! break; } ! /* Set the time-out period */ ! if(state == IDLE) ! timeout.tv_sec = POLL_PERIOD; ! else ! timeout.tv_sec = RESPONSE_TIMEOUT; ! timeout.tv_usec = 0; - new_state = NO_CHANGE; - /* Input handling loop */ - while(new_state == NO_CHANGE) - { - ResetNibbleMem(); - if(wait_for_message(fd, &timeout) && - !read_message(fd, in_message)) - { - switch(in_message->data->choiceId) - { case PDUS_GET_REQUEST: diag(COMPONENT, DIAG_INFO, "received get request"); --- 56,161 ---- #include "atmf_uni.h" #include "sysgroup.h" + #include "states.h" #define RESPONSE_TIMEOUT 2 #define POLL_PERIOD 15 #define COMPONENT "ILMI" + #ifndef MAX + # define MAX(a,b) ((a) > (b) ? (a) : (b)) + #endif ! /* Globals */ ! /* ! static const char *state_names[STATES] = { ! "Stopped", ! "Link Failing", ! "Establishing", ! "Configuring", ! "Retrieve Network Prefixes", ! "Registering Network Prefixes", ! "Retrieving Addresses", ! "Registering Addresses", ! "Verifying" ! }; ! */ ! ! typedef int (*Func)(int,int,Msgs *); ! static Func state_functions[STATES] = { ! state_stopped, ! state_failing, ! state_establishing, ! state_config, ! state_retrievePrefixes, ! state_registerPrefixes, ! state_retrieveAddresses, ! state_registerAddresses, ! state_verify ! }; ! ! AsnOid *esi_oid = NULL; ! int retries = 0; ! int ilmi_errno = 0; ! int alarm_flag = 0; ! long int requestID = 0; ! State ilmi_state = down; ! ! static int diagfd = -1; ! ! AttPoint _apoint; ! AttPoint *apoint = &_apoint; /* attachment point */ ! Config _config; ! Config *config = &_config; /* Remote IME configuration */ ! SysGroup _remsys; ! SysGroup *remsys = &_remsys; ! AttPoint _newapoint; ! AttPoint *newapoint = &_newapoint; ! ! void usage( char * ); ! void ilmi_loop( int, int ); ! ! void usage( char *name ){ fprintf(stderr, "usage: %s [-b] [-d] [-v] [-l logfile] [-x] [-q qos]\n" ! "%13s[ -i local_ip ] [ -u uni ] <itf>[.<vpi>.<vci>]\n",name,""); fprintf(stderr, "%6s %s -V\n","",name); exit(1); } ! /* 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; } ! /* returns E value (ECOLDSTART, . . .) */ ! int handle_request( int fd, int itf, Msgs *msgs, Message *in_message ){ ! int retval = 0; ! switch( in_message->data->choiceId ){ case PDUS_GET_REQUEST: diag(COMPONENT, DIAG_INFO, "received get request"); *************** *** 156,202 **** break; - case PDUS_GET_RESPONSE: - diag(COMPONENT, DIAG_INFO, "received get response"); - if(in_message->data->a.get_response->request_id == requestID) - { - varbind = (VarBind *) FIRST_LIST_ELMT(in_message->data->a.get_response->variable_bindings); - switch(state) - { - case RESTART: - case VERIFY: - if(in_message->data->a.get_response->error_status == NOERROR && - AsnOidCompare(&atmAddressStatus, &varbind->name) == AsnOidRoot) - new_state = RESTART; - else - new_state = NET_PREFIX; - break; - - case ADDRESS: - if(in_message->data->a.get_response->error_status == NOERROR) - { - diag(COMPONENT, DIAG_INFO, "ATM address registered"); - update_nsap(itf, netprefix_oid, esi_oid); - no_response = 0; - new_state = POLL; - } - else - new_state = RESTART; - break; - - case POLL: - if(in_message->data->a.get_response->error_status == NOERROR && - AsnOidCompare(&varbind->name, set_oid) == AsnOidEqual) - { - no_response = 0; - new_state = IDLE; - } - else - new_state = RESTART; - break; - } - } - else diag(COMPONENT, DIAG_ERROR, "received response with invalid request id"); - break; - case PDUS_SET_REQUEST: diag(COMPONENT, DIAG_INFO, "received set request"); --- 176,179 ---- *************** *** 205,277 **** &in_message->data->a.set_request->error_index); in_message->data->choiceId = PDUS_GET_RESPONSE; send_message(fd, in_message); break; case PDUS_TRAP: ! diag(COMPONENT, DIAG_INFO, "received trap"); ! if(in_message->data->a.trap->generic_trap == COLDSTART && ! state != RESTART) ! new_state = RESTART; break; ! default: ! diag(COMPONENT, DIAG_ERROR, "received message with invalid choice"); break; } ! if((state == NET_PREFIX || new_state == NET_PREFIX) && ! (netprefix_oid = accessNetPrefix()) != 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); ! new_state = ADDRESS; } ! } ! else /* Timeout occurred */ ! { ! switch(state) ! { ! case RESTART: ! case VERIFY: ! diag(COMPONENT, DIAG_INFO, "switch did not respond to get-next -- resending"); ! if(++no_response == 4) ! new_state = RESTART; ! else ! new_state = VERIFY; ! break; ! case NET_PREFIX: ! diag(COMPONENT, DIAG_INFO, "switch did not register a network prefix -- restarting"); ! new_state = RESTART; ! break; ! case ADDRESS: ! diag(COMPONENT, DIAG_INFO, "switch did not respond to set request -- resending"); ! new_state = ADDRESS; ! break; ! case POLL: ! if(++no_response == 4) ! { ! new_state = RESTART; ! diag(COMPONENT, DIAG_INFO, "switch is not responding"); ! } ! else ! new_state = IDLE; ! break; ! case IDLE: ! new_state = POLL; ! break; } } } } } int main(int argc, char *argv[]) { ! int fd, opt, itf = 0, bg = 0; pid_t pid; const char *qos; set_application("ilmid"); set_verbosity(NULL, DIAG_WARN); qos = NULL; while((opt = getopt(argc, argv, "bdhi:l:q:xvu:V")) != EOF) --- 182,381 ---- &in_message->data->a.set_request->error_index); in_message->data->choiceId = PDUS_GET_RESPONSE; + if( handle_set_request( fd, itf, msgs, in_message )) + retval = ESETPREFIX; send_message(fd, in_message); break; case PDUS_TRAP: ! if( in_message->data->a.trap->generic_trap == COLDSTART ){ ! diag( COMPONENT, DIAG_INFO, "received coldstart trap" ); ! retval = ECOLDSTART; ! } else diag( COMPONENT, DIAG_INFO, "received trap" ); break; ! ! case PDUS_GET_RESPONSE: break; } ! return retval; } ! ! /* if a non-null value is returned from this function, the caller must ! free that memory */ ! ! Message *wait_for_response( int fd, int itf, Msgs *msgs, int sec ){ ! Message *in_message; ! static Message m; ! struct timeval timeout; ! int numfds = 0; ! fd_set fdvar; ! ! in_message = (Message *)(&m); ! timeout.tv_sec = sec; ! timeout.tv_usec = 0; ! ! ilmi_errno = 0; ! wait_top: ! waitpid(0, NULL, WNOHANG); ! ResetNibbleMem(); ! FD_ZERO(&fdvar); ! FD_SET(fd, &fdvar); ! FD_SET(diagfd, &fdvar); ! numfds = select(MAX(fd,diagfd)+1, &fdvar, NULL, NULL, &timeout); ! ! if ((numfds > 0) && FD_ISSET(diagfd, &fdvar)) { ! if (fork() == 0) { ! close(fd); ! handle_ilmidiag(diagfd, apoint, config); ! exit(0); } + } + + if(( numfds > 0 ) && FD_ISSET(fd, &fdvar) && + !read_message( fd, in_message )){ + switch( in_message->data->choiceId ){ + case PDUS_GET_REQUEST: + case PDUS_GET_NEXT_REQUEST: + case PDUS_SET_REQUEST: + case PDUS_TRAP: + ilmi_errno = + handle_request( fd, itf, msgs, in_message ); + if( ilmi_errno > 0 ) return NULL; + else goto wait_top; + /* no more evil than "break" */ + case PDUS_GET_RESPONSE: + diag( COMPONENT, DIAG_INFO, + "received get-response" ); + return in_message; + default: + diag( COMPONENT, DIAG_ERROR, + "received message with invalid choice" ); + goto wait_top; + } + } else{ + if( numfds == 0 ) ilmi_errno = ETIMEOUT; + if(( numfds < 0 ) && ( errno == EINTR )) ilmi_errno = EALARM; + return NULL; /* no data read */ + } + } + + Msgs *create_msgs( void ){ + Msgs *m = alloc_t( Msgs ); + if( m == NULL ) return NULL; + + m->coldstart = create_coldstart_message(); + m->addrtable = create_va_getnext_message( 2, + &atmfAddressStatus, + &atmfSrvcRegTable ); + m->poll = create_getnext_message( atmfAddressTable ); + m->set = create_set_message(); + m->config = create_va_get_message( 6, + &atmfAtmLayerUniVersion, + &atmfAtmLayerMaxVpiBits, + &atmfAtmLayerMaxVciBits, + &atmfAtmLayerUniType, + &atmfAtmLayerDeviceType, + &atmfAddressRegistrationAdminStatus ); + m->apointmsg = create_va_get_message( 4, + &atmfPortMyIdentifier, + &atmfPortMyIfName, /* some extra adjacency info */ + &atmfMySystemIdentifier, + &sysUpTime ); + m->sysmsg = create_va_get_message( 7, + &sysDescr, + &sysObjectID, + &sysUpTime, + &sysContact, + &sysName, + &sysLocation, + &sysServices ); + + return m; + } + + void copy_attachment_point( AttPoint *dest, AttPoint *src ){ + dest->sysUpTime = src->sysUpTime; + dest->atmfPortMyIfIdentifier = src->atmfPortMyIfIdentifier; + + dest->atmfMySystemIdentifier.octs = + malloc( src->atmfMySystemIdentifier.octetLen ); + dest->atmfMySystemIdentifier.octetLen = + src->atmfMySystemIdentifier.octetLen; + if( dest->atmfMySystemIdentifier.octs != NULL ){ + memcpy( dest->atmfMySystemIdentifier.octs, + src->atmfMySystemIdentifier.octs, 6 ); + } else diag( COMPONENT, DIAG_FATAL, "malloc() failed" ); + + /* copy the port name */ + dest->atmfPortMyIfName.octs = + malloc( src->atmfPortMyIfName.octetLen + 1 ); + dest->atmfPortMyIfName.octetLen = src->atmfPortMyIfName.octetLen; + if( dest->atmfPortMyIfName.octs != NULL ){ + memcpy( dest->atmfPortMyIfName.octs, + src->atmfPortMyIfName.octs, + src->atmfPortMyIfName.octetLen ); + } else diag( COMPONENT, DIAG_FATAL, "malloc() failed" ); + } + + /* section 8.3.2 */ + int compare_attachment_point( a, b ) + AttPoint *a; /* current a'point */ + AttPoint *b; /* newly aquired a'point info */ + { + if(( a == NULL ) || ( b == NULL )) return -1; + if( a->atmfPortMyIfIdentifier != b->atmfPortMyIfIdentifier ) + return -1; + if( a->atmfMySystemIdentifier.octetLen != + b->atmfMySystemIdentifier.octetLen ) return -1; + if( memcmp( a->atmfMySystemIdentifier.octs, + b->atmfMySystemIdentifier.octs, + b->atmfMySystemIdentifier.octetLen ) != 0 ) return -1; + if( b->sysUpTime < a->sysUpTime ) return -1; + return 0; } + + void handler( int sig ){ + switch( sig ){ + case SIGALRM: + alarm_flag = 1; + diag( COMPONENT, DIAG_INFO, + "received alarm: time to poll for attachment point" ); + break; + case SIGTERM: + case SIGSTOP: + case SIGINT: + case SIGKILL: + ilmi_state = down; + exit( 1 ); } } + + void ilmi_loop( int fd, int itf ){ + int state = S1; + Msgs *msgs = create_msgs(); + struct itimerval setpoint; + esi_oid = get_esi( fd, itf); + // apoint->atmfMySystemIdentifier.octs = &(apoint->sysIdMem[0]); + + setpoint.it_interval.tv_sec = 30; + setpoint.it_interval.tv_usec = 0; + setpoint.it_value.tv_sec = 30; + setpoint.it_value.tv_usec = 0; + signal( SIGALRM, handler ); + setitimer( ITIMER_REAL, &setpoint, NULL ); + + for( ;; ) state = state_functions[state]( fd, itf, msgs ); } int main(int argc, char *argv[]) { ! int opt, bg = 0; ! int fd; pid_t pid; const char *qos; + struct sockaddr_atmpvc ilmipvc; set_application("ilmid"); set_verbosity(NULL, DIAG_WARN); + text2atm("0.0.16", (struct sockaddr *)&ilmipvc, sizeof(ilmipvc), T2A_PVC); qos = NULL; while((opt = getopt(argc, argv, "bdhi:l:q:xvu:V")) != EOF) *************** *** 307,311 **** case 'u': { ! int version; if (!strcmp(optarg,"3.0") || !strcmp(optarg,"30")) --- 411,415 ---- case 'u': { ! int version = 2; if (!strcmp(optarg,"3.0") || !strcmp(optarg,"30")) *************** *** 334,338 **** } if(argc == optind + 1) ! itf = atoi(argv[optind++]); if(argc != optind) --- 438,449 ---- } if(argc == optind + 1) ! if (text2atm(argv[optind++], (struct sockaddr *)&ilmipvc, ! sizeof(ilmipvc), T2A_PVC) < 0) { ! char *endp = NULL; ! int itf = strtoul(argv[optind-1], &endp, 0); ! if (argv[optind-1] == endp || *endp != '\0') ! diag(COMPONENT, DIAG_FATAL, "Invalid pvc or interface number."); ! ilmipvc.sap_addr.itf = itf; ! } if(argc != optind) *************** *** 349,355 **** } ! InitNibbleMem(512, 512); ! fd = open_ilmi(itf,qos); ! ilmi_loop(fd, itf); close(fd); return 0; --- 460,474 ---- } ! InitNibbleMem(1024, 512); ! memset( remsys, 0, sizeof( _remsys )); ! memset( apoint, 0, sizeof( _apoint )); ! memset( newapoint, 0, sizeof( _newapoint )); ! signal( SIGTERM, handler ); ! signal( SIGKILL, handler ); ! signal( SIGINT, handler ); ! signal( SIGSTOP, handler ); ! fd = open_ilmi(&ilmipvc,qos); ! open_ilmidiag(&diagfd, &ilmipvc); ! ilmi_loop(fd, ilmipvc.sap_addr.itf); close(fd); return 0; Index: io.c =================================================================== RCS file: /cvsroot/linux-atm/linux-atm/src/ilmid/io.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** io.c 9 Oct 2001 22:33:06 -0000 1.2 --- io.c 1 Jan 2008 00:14:50 -0000 1.3 *************** *** 26,30 **** --- 26,33 ---- #endif + #include <unistd.h> #include <sys/socket.h> + #include <sys/un.h> + #include <sys/types.h> #include <netinet/in.h> #include <sys/ioctl.h> *************** *** 33,36 **** --- 36,42 ---- #include <atm.h> #include <linux/atmdev.h> + #include <sys/types.h> + #include <sys/stat.h> + #include "ilmid.h" #include "io.h" #include "atmd.h" *************** *** 43,46 **** --- 49,54 ---- registered the "official" address) - HACK */ + extern SysGroup *remsys; + extern State ilmi_state; static short atm_itf = -1; /* bad value */ *************** *** 86,89 **** --- 94,129 ---- } + + void add_lecs(int itf, char *lecs) + { + int fd; + struct atmif_sioc req; + struct sockaddr_atmsvc addr; + + memset(&addr, 0, sizeof(addr)); + addr.sas_family = AF_ATMSVC; + memcpy(&addr.sas_addr.prv, lecs, 20); + + if ((fd = socket(AF_ATMSVC, SOCK_DGRAM, 0)) < 0){ + diag(COMPONENT, DIAG_ERROR, "socket: %s", strerror(errno)); + return; + } + + req.number = itf; + req.arg = &addr; + req.length = sizeof(addr); + + #ifdef ATM_ADDLECSADDR + if (ioctl(fd, ATM_ADDLECSADDR, &req) < 0) + diag(COMPONENT, DIAG_DEBUG, "ioctl ATM_ADDLECSADDR: %s", strerror(errno)); + #else + diag(COMPONENT, DIAG_DEBUG, "missing ATM_ADDLECSADDR support"); + #endif + + close(fd); + return; + } + + void update_nsap(int itf, AsnOid *netprefix, AsnOid *esi) { *************** *** 177,182 **** FD_SET(fd, &fdvar); ! if((numfds = select(fd + 1, &fdvar, 0, 0, timeout)) < 0) diag(COMPONENT, DIAG_FATAL, "select: %s", strerror(errno)); return numfds; --- 217,224 ---- FD_SET(fd, &fdvar); ! if((numfds = select(fd + 1, &fdvar, 0, 0, timeout)) < 0){ ! if( errno != EINTR ) diag(COMPONENT, DIAG_FATAL, "select: %s", strerror(errno)); + } return numfds; *************** *** 251,257 **** ! int open_ilmi(int itf,const char *qos_spec) { - struct sockaddr_atmpvc addr; struct atm_qos qos; int fd; --- 293,298 ---- ! int open_ilmi(struct sockaddr_atmpvc *pvc, const char *qos_spec) { struct atm_qos qos; int fd; *************** *** 260,264 **** diag(COMPONENT, DIAG_FATAL, "socket: %s", strerror(errno)); ! atm_itf = itf; memset(&qos, 0, sizeof(qos)); qos.rxtp.max_sdu = MAX_ILMI_MSG; --- 301,305 ---- diag(COMPONENT, DIAG_FATAL, "socket: %s", strerror(errno)); ! atm_itf = pvc->sap_addr.itf; memset(&qos, 0, sizeof(qos)); qos.rxtp.max_sdu = MAX_ILMI_MSG; *************** *** 271,281 **** diag(COMPONENT,DIAG_FATAL,"setsockopt SO_ATMQOS: %s",strerror(errno)); ! memset(&addr, 0, sizeof(addr)); ! addr.sap_family = AF_ATMPVC; ! addr.sap_addr.itf = itf; ! addr.sap_addr.vpi = 0; ! addr.sap_addr.vci = SNMP_VCI; ! ! if(bind(fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) diag(COMPONENT, DIAG_FATAL, "bind: %s", strerror(errno)); --- 312,316 ---- diag(COMPONENT,DIAG_FATAL,"setsockopt SO_ATMQOS: %s",strerror(errno)); ! if(bind(fd, (struct sockaddr *) pvc, sizeof(*pvc)) < 0) diag(COMPONENT, DIAG_FATAL, "bind: %s", strerror(errno)); *************** *** 300,302 **** --- 335,434 ---- return error; } + return 0; + } + + int open_ilmidiag(int *listenfd, const struct sockaddr_atmpvc *vc) { + int fd = -1; + struct sockaddr_un addr; + struct stat dir; + mode_t oldumask; + + /* check for directory that holds the sockets */ + if ((stat(ILMIDIAG_DIR, &dir) < 0) && (errno == ENOENT)) { + if (mkdir(ILMIDIAG_DIR, 0755) < 0) return -1; + else diag(COMPONENT, DIAG_DEBUG, + "Created directory " ILMIDIAG_DIR); + } + + fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (fd < 0) return -1; + + memset(&addr, 0, sizeof(addr)); + snprintf(addr.sun_path, sizeof(addr.sun_path) - 1, + "%s/%d.%d.%d", + ILMIDIAG_DIR, + vc->sap_addr.itf, + vc->sap_addr.vpi, + vc->sap_addr.vci); + addr.sun_family = AF_UNIX; + unlink(addr.sun_path); + oldumask = umask(0); + if (bind(fd, (struct sockaddr *)&addr, SUN_LEN(&addr)) < 0) { + diag(COMPONENT, DIAG_ERROR, "unable to bind ilmidiag socket: " + "%s", strerror(errno)); + close(fd); + unlink(addr.sun_path); + umask(oldumask); + return -1; + } + umask(oldumask); + + if (listen(fd, ILMIDIAG_BACKLOG) < 0) { + diag(COMPONENT, DIAG_FATAL, "Unable to listen on diag socket:" + " %s", strerror(errno)); + close(fd); + unlink(addr.sun_path); + return -1; + } + *listenfd = fd; + return 0; } + + int handle_ilmidiag(int fd, AttPoint *apoint, Config *config) { + struct sockaddr_un incoming; + socklen_t inlen = sizeof(incoming); + struct atm_cirange cir; + struct ilmi_state ic; + int newfd = accept(fd, (struct sockaddr *)&incoming, &inlen); + + if (newfd < 0) return -1; + /* Since this is a unix socket, there's no need to be portable. */ + + memset( &ic, 0, sizeof( ic )); + ic.ilmi_version = 2; /* version4point0 */ + ic.uni_version = atmfAtmLayerUniVersionValue & 0xff; + + if( get_ci_range( &cir ) < 0 ) + diag( COMPONENT, DIAG_ERROR, "get_ci_range() failed" ); + else{ + if( cir.vpi_bits < config->atmfAtmLayerMaxVpiBits ) + ic.vpi_bits = cir.vpi_bits; + else ic.vpi_bits = config->atmfAtmLayerMaxVpiBits & 0xff; + if( cir.vci_bits < config->atmfAtmLayerMaxVciBits ) + ic.vci_bits = cir.vci_bits; + else ic.vci_bits = config->atmfAtmLayerMaxVciBits & 0xff; + } + + ic.state = ( ilmi_state == down ) ? 0 : 1; + if( remsys->sysName.octs ) strncpy( ic.remote_sysname, + remsys->sysName.octs, + ( remsys->sysName.octetLen < ATM_REMOTE_SYSNAME_LEN ) + ? remsys->sysName.octetLen : ATM_REMOTE_SYSNAME_LEN ); + else strncpy( ic.remote_sysname, "(empty)", 7 ); + if( remsys->sysContact.octs ) strncpy( ic.remote_contact, + remsys->sysContact.octs, + ( remsys->sysContact.octetLen < ATM_REMOTE_CONTACT_LEN ) + ? remsys->sysContact.octetLen : ATM_REMOTE_CONTACT_LEN ); + else strncpy( ic.remote_contact, "(empty)", 7 ); + ic.remote_portid = apoint->atmfPortMyIfIdentifier; + if( apoint->atmfPortMyIfName.octs ) strncpy( + ic.remote_portname, apoint->atmfPortMyIfName.octs, + ( apoint->atmfPortMyIfName.octetLen < ATM_REMOTE_PORTNAME_LEN ) + ? apoint->atmfPortMyIfName.octetLen : ATM_REMOTE_PORTNAME_LEN ); + else strncpy( ic.remote_portname, "(empty)", 7 ); + + write(newfd, &ic, sizeof(ic)); + close(newfd); + exit(0); + } + Index: io.h =================================================================== RCS file: /cvsroot/linux-atm/linux-atm/src/ilmid/io.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** io.h 9 Oct 2001 22:33:06 -0000 1.2 --- io.h 1 Jan 2008 00:14:50 -0000 1.3 *************** *** 28,31 **** --- 28,32 ---- #include <atm.h> #include <linux/atmdev.h> + #include "ilmid.h" #include "asn_incl.h" #include "rfc1155_smi.h" *************** *** 39,44 **** int read_message(int fd, Message *message); int send_message(int fd, Message *message); ! int open_ilmi(int itf,const char *qos_spec); int get_ci_range(struct atm_cirange *ci); #endif --- 40,48 ---- int read_message(int fd, Message *message); int send_message(int fd, Message *message); ! int open_ilmi(struct sockaddr_atmpvc *, const char *qos_spec); int get_ci_range(struct atm_cirange *ci); + void add_lecs(int itf, char *lecs); + int open_ilmidiag(int *listenfd, const struct sockaddr_atmpvc *); + int handle_ilmidiag(int fd, AttPoint *apoint, Config *config); #endif Index: message.c =================================================================== RCS file: /cvsroot/linux-atm/linux-atm/src/ilmid/message.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** message.c 9 Oct 2001 22:33:06 -0000 1.2 --- message.c 1 Jan 2008 00:14:50 -0000 1.3 *************** *** 28,39 **** #endif #include "message.h" #include "atmf_uni.h" #include "util.h" int no_var_bindings = 0; ! AsnOid atmAddressStatus = {ADDRESS_LEN, ADDRESS_OID}; Message *create_poll_message(void) { --- 28,129 ---- #endif + #include <unistd.h> + #include <stdarg.h> + #include "message.h" #include "atmf_uni.h" #include "util.h" + #include "sysgroup.h" int no_var_bindings = 0; ! // AsnOid atmAddressStatus = {ADDRESS_LEN, ADDRESS_OID}; ! ! Message *create_va_getnext_message( int n, ... ){ ! Message *m = alloc_t( Message ); ! VarBind *entry; ! AsnOid *what; ! va_list ap; ! int count; + if( m == NULL ) return NULL; + m->version = VERSION_1; + m->community.octs = "ILMI"; + m->community.octetLen = 4; + m->data = alloc_t( PDUs ); + m->data->choiceId = PDUS_GET_NEXT_REQUEST; + m->data->a.get_next_request = alloc_t( GetRequest_PDU ); + m->data->a.get_next_request->error_status = 0; + m->data->a.get_next_request->error_index = 0; + m->data->a.get_next_request->variable_bindings = alloc_t( VarBindList ); + AsnListInit( m->data->a.get_next_request->variable_bindings, + sizeof( VarBind )); + va_start( ap, n ); + count = 0; + while( count < n ){ + what = va_arg( ap, AsnOid* ); + entry = AppendVarBind( + m->data->a.get_next_request->variable_bindings ); + entry->name.octs = alloc( what->octetLen ); + entry->name.octetLen = what->octetLen; + memcpy( entry->name.octs, what->octs, what->octetLen ); + entry->value = alloc_t( ObjectSyntax ); + entry->value->choiceId = OBJECTSYNTAX_SIMPLE; + entry->value->a.simple = alloc_t( SimpleSyntax ); + entry->value->a.simple->choiceId = SIMPLESYNTAX_NUMBER; + count++; + } + va_end(ap); + return m; + } + + Message *create_va_get_message( int n, ... ){ + Message *m = alloc_t( Message ); + VarBind *entry; + AsnOid *what; + va_list ap; + int count; + + if( m == NULL ) return NULL; + m->version = VERSION_1; + m->community.octs = "ILMI"; + m->community.octetLen = 4; + m->data = alloc_t( PDUs ); + m->data->choiceId = PDUS_GET_REQUEST; + m->data->a.get_request = alloc_t( GetRequest_PDU ); + m->data->a.get_request->error_status = 0; + m->data->a.get_request->error_index = 0; + m->data->a.get_request->variable_bindings = alloc_t( VarBindList ); + AsnListInit( m->data->a.get_request->variable_bindings, + sizeof( VarBind )); + va_start( ap, n ); + count = 0; + while( count < n ){ + what = va_arg( ap, AsnOid* ); + entry = AppendVarBind( + m->data->a.get_request->variable_bindings ); + entry->name.octs = alloc( what->octetLen ); + entry->name.octetLen = what->octetLen; + memcpy( entry->name.octs, what->octs, what->octetLen ); + entry->value = alloc_t( ObjectSyntax ); + entry->value->choiceId = OBJECTSYNTAX_SIMPLE; + entry->value->a.simple = alloc_t( SimpleSyntax ); + entry->value->a.simple->choiceId = SIMPLESYNTAX_NUMBER; + count++; + } + va_end(ap); + return m; + } + + + Message *create_get_message( AsnOid what ){ + return create_va_get_message( 1, &what ); + } + + Message *create_getnext_message( AsnOid what ){ + return create_va_getnext_message( 1, &what ); + } + + #ifdef notdef Message *create_poll_message(void) { *************** *** 65,68 **** --- 155,159 ---- return poll_message; } + #endif Message *create_set_message(void) Index: message.h =================================================================== RCS file: /cvsroot/linux-atm/linux-atm/src/ilmid/message.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** message.h 9 Oct 2001 22:33:06 -0000 1.2 --- message.h 1 Jan 2008 00:14:50 -0000 1.3 *************** *** 34,42 **** extern int no_var_bindings; ! AsnOid atmAddressStatus; Message *create_poll_message(void); Message *create_set_message(void); Message *create_coldstart_message(void); #endif --- 34,47 ---- extern int no_var_bindings; ! //AsnOid atmAddressStatus; Message *create_poll_message(void); Message *create_set_message(void); Message *create_coldstart_message(void); + Message *create_va_getnext_message( int, ... ); + Message *create_va_get_message( int, ... ); + Message *create_getnext_message( AsnOid ); + Message *create_get_message( AsnOid ); + void free_message( Message *m ); #endif Index: mib.c =================================================================== RCS file: /cvsroot/linux-atm/linux-atm/src/ilmid/mib.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** mib.c 9 Oct 2001 22:33:06 -0000 1.2 --- mib.c 1 Jan 2008 00:14:50 -0000 1.3 *************** *** 47,50 **** --- 47,53 ---- { &sysLocation, getString, NULL, NULL, &sysLocationValue }, { &sysServices, getInteger, NULL, NULL, &sysServicesValue }, + { &foreQ2931AdminConfigType, getInteger, NULL, NULL, + &foreQ2931AdminConfigTypeValue }, + { &foreQ2931NNIProto, getInteger, NULL, NULL, &foreQ2931NNIProtoValue }, { &atmfPortIndex, getInteger, NULL, NULL, &atmfPortIndexValue }, { &atmfPortMyIdentifier, getInteger, NULL, NULL, &atmfPortIndexValue }, *************** *** 53,63 **** { &atmfAtmLayerMaxVpiBits, getVpiRange, NULL, NULL, &atmfAtmLayerMaxVpiBitsValue }, { &atmfAtmLayerMaxVciBits, getVciRange, NULL, NULL, &atmfAtmLayerMaxVciBitsValue }, { &atmfAtmLayerUniVersion, getInteger, NULL, NULL, &atmfAtmLayerUniVersionValue }, { &atmfNetPrefixStatus, getNetPrefix, getnextNetPrefix, setNetPrefix, NULL }, { NULL } }; ! void MIBget(VarBindList *list, PDUInt *status, AsnInt *index) { VarBind *varbind; --- 56,75 ---- { &atmfAtmLayerMaxVpiBits, getVpiRange, NULL, NULL, &atmfAtmLayerMaxVpiBitsValue }, { &atmfAtmLayerMaxVciBits, getVciRange, NULL, NULL, &atmfAtmLayerMaxVciBitsValue }, + { &atmfAtmLayerUniType, getInteger, NULL, NULL, &atmfAtmLayerUniTypeValue}, { &atmfAtmLayerUniVersion, getInteger, NULL, NULL, &atmfAtmLayerUniVersionValue }, + { &atmfAtmLayerDeviceType, getInteger, NULL, NULL, + &atmfAtmLayerDeviceTypeValue}, + { &atmfAtmLayerIlmiVersion, getInteger, NULL, NULL, + &atmfAtmLayerIlmiVersionValue}, + { &atmfAtmLayerNniSigVersion, getInteger, NULL, NULL, + &atmfAtmLayerNniSigVersionValue}, { &atmfNetPrefixStatus, getNetPrefix, getnextNetPrefix, setNetPrefix, NULL }, { NULL } }; ! ! ! void MIBget(VarBindList *list, PDUInt *status, AsnInt *offset) { VarBind *varbind; *************** *** 65,69 **** AsnOidResult result; ! *index = 1; FOR_EACH_LIST_ELMT(varbind, list) { --- 77,81 ---- AsnOidResult result; ! *offset = 1; FOR_EACH_LIST_ELMT(varbind, list) { *************** *** 92,103 **** return; ! (*index)++; } ! *index = 0; return; } ! void MIBgetnext(VarBindList *list, PDUInt *status, AsnInt *index) { VarBind *varbind; --- 104,115 ---- return; ! (*offset)++; } ! *offset = 0; return; } ! void MIBgetnext(VarBindList *list, PDUInt *status, AsnInt *offset) { VarBind *varbind; *************** *** 105,109 **** AsnOidResult result; ! *index = 1; FOR_EACH_LIST_ELMT(varbind, list) { --- 117,121 ---- AsnOidResult result; ! *offset = 1; FOR_EACH_LIST_ELMT(varbind, list) { *************** *** 140,150 **** return; ! (*index)++; } ! *index = 0; return; } ! void MIBset(VarBindList *list, PDUInt *status, AsnInt *index) { VarBind *varbind; --- 152,162 ---- return; ! (*offset)++; } ! *offset = 0; return; } ! void MIBset(VarBindList *list, PDUInt *status, AsnInt *offset) { VarBind *varbind; *************** *** 152,156 **** AsnOidResult result; ! *index = 1; FOR_EACH_LIST_ELMT(varbind, list) { --- 164,168 ---- AsnOidResult result; ! *offset = 1; FOR_EACH_LIST_ELMT(varbind, list) { *************** *** 183,189 **** return; ! (*index)++; } ! *index = 0; return; } --- 195,201 ---- return; ! (*offset)++; } ! *offset = 0; return; } *************** *** 246,250 **** } - #include <stdint.h> #include <string.h> --- 258,261 ---- Index: mib.h =================================================================== RCS file: /cvsroot/linux-atm/linux-atm/src/ilmid/mib.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** mib.h 9 Oct 2001 22:33:06 -0000 1.2 --- mib.h 1 Jan 2008 00:14:50 -0000 1.3 *************** *** 40,46 **** } Variable; ! void MIBget(VarBindList *list, PDUInt *status, AsnInt *index); ! void MIBgetnext(VarBindList *list, PDUInt *status, AsnInt *index); ! void MIBset(VarBindList *list, PDUInt *status, AsnInt *index); void *MIBdelete(AsnOid *oid); --- 40,46 ---- } Variable; ! void MIBget(VarBindList *list, PDUInt *status, AsnInt *offset); ! void MIBgetnext(VarBindList *list, PDUInt *status, AsnInt *offset); ! void MIBset(VarBindList *list, PDUInt *status, AsnInt *offset); void *MIBdelete(AsnOid *oid); Index: rfc1155_smi.h =================================================================== RCS file: /cvsroot/linux-atm/linux-atm/src/ilmid/rfc1155_smi.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** rfc1155_smi.h 9 Oct 2001 22:33:06 -0000 1.2 --- rfc1155_smi.h 1 Jan 2008 00:14:50 -0000 1.3 *************** *** 62,72 **** ! typedef AsnInt TimeTicks; /* [APPLICATION 3] IMPLICIT INTEGER (0..2147483647) */ ! #define BEncTimeTicksContent BEncAsnIntContent ! #define BDecTimeTicksContent BDecAsnIntContent ! #define PrintTimeTicks PrintAsnInt --- 62,72 ---- ! typedef UAsnInt TimeTicks; /* [APPLICATION 3] IMPLICIT INTEGER (0..2147483647) */ ! #define BEncTimeTicksContent BEncUAsnIntContent ! #define BDecTimeTicksContent BDecUAsnIntContent ! #define PrintTimeTicks PrintUAsnInt |