Ethereal-dev: Re: [ethereal-dev] Diameter (using new prefs.c)

Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.

From: David Frascone <dave@xxxxxxxxxxxx>
Date: Mon, 17 Jul 2000 18:01:04 -0500
Comments?  Should I include a new tarball?  Are my changes going in?  I'm       
hesitant to make any new changes till I'm sure these are going in.  I still     
need to add support for Diameter over TCP and eventually SCTP                   

On Fri, Jul 14, 2000 at 09:29:48AM -0500, David Frascone wrote:
> On Thu, Jul 13, 2000 at 10:58:40PM -0500, Gilbert Ramirez wrote:
> > We really do need a global way of modifying port registrations, for all
> > protocols. This is a novel technique that will work well for this
> > situation (diameter), but we still need to come up with code for
> > doing it globally. 
> > 
> > When are you going to post the diameter dissector?
> > 
> 
> It's been attached to the last two messages, in the tarball.  In case the 
> mailing list has been dropping attachments, I'll include it here.
> 
> ---------------------packet-diameter.c-----------------------
> /* packet-diameter.c
>  * Routines for DIAMETER packet disassembly
>  *
>  * $Id$
>  *
>  * Copyright (c) 2000 by David Frascone <chaos@xxxxxxxxxxxxxx>
>  *
>  * Ethereal - Network traffic analyzer
>  * By Johan Feyaerts
>  * Copyright 1999 Johan Feyaerts
>  * This program is free software; you can redistribute it and/or
>  * modify it under the terms of the GNU General Public License
>  * as published by the Free Software Foundation; either version 2
>  * of the License, or (at your option) any later version.
>  *
>  * This program is distributed in the hope that it will be useful,
>  * but WITHOUT ANY WARRANTY; without even the implied warranty of
>  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>  * GNU General Public License for more details.
>  *
>  * You should have received a copy of the GNU General Public License
>  * along with this program; if not, write to the Free Software
>  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
>  */
> 
> #ifdef HAVE_CONFIG_H
> #include "config.h"
> #endif
> 
> #ifdef HAVE_SYS_TYPES_H
> # include <sys/types.h>
> #endif
> 
> #ifdef HAVE_NETINET_IN_H
> #include <netinet/in.h>
> #endif
> 
> #include <stdio.h>
> #include <stdlib.h>
> #include <ctype.h>
> #include <glib.h>
> #include "packet.h"
> #include "resolv.h"
> #include "prefs.h"
> 
> /* This must be defined before we include our dictionary defs */
> 
> typedef struct _value_value_pair {
>         guint16 val1;
>         guint16 val2;
> } value_value_pair;
> 
> typedef enum {
> 	DIAMETER_DATA=1,
> 	DIAMETER_STRING,
> 	DIAMETER_ADDRESS,
> 	DIAMETER_INTEGER32,
> 	DIAMETER_INTEGER64,
> 	DIAMETER_TIME,
> 	DIAMETER_COMPLEX
> } diameterDataTypes;
> 
> #include "packet-diameter.h"
> 
> #define COMMAND_CODE_OFFSET 20
> #define  NTP_TIME_DIFF                   (2208988800UL)
> 
> #define UDP_PORT_DIAMETER	2645
> /* #define UDP_PORT_DIAMETER	1812  -- Compiling this in breaks RADIUS */
> 
> static int proto_diameter = -1;
> static int hf_diameter_length = -1;
> static int hf_diameter_code = -1;
> static int hf_diameter_id =-1;
> static int hf_diameter_flags = -1;
> static int hf_diameter_ns = -1;
> static int hf_diameter_nr = -1;
> 
> static gint ett_diameter = -1;
> static gint ett_diameter_avp = -1;
> static gint ett_diameter_avpinfo = -1;
> 
> static char gbl_diameterString[200];
> static int gbl_diameterPort=UDP_PORT_DIAMETER;
> gboolean gbl_commandCodeInHeader = FALSE;
> 
> typedef struct _e_diameterhdr {
>   guint8 code;                   /* Must be 254 for diameter */
>   guint8 flagsVer;
>   guint16 pktLength;
>   guint32 identifier;
>   union {
>     struct {
>       guint16 nextSend;
>       guint16 nextReceived;
>     } old;
>     struct {
>       guint32 commandCode;
>       guint32 vendorId;
>       guint16 nextSend;
>       guint16 nextReceived;
>     } new;
>   } u;
> } e_diameterhdr;
> 
> typedef struct _e_avphdr {
>   guint32 avp_type;
>   guint16 avp_length;
>   guint16 avp_flags;
>   guint32 avp_vendorId;           /* optional */
>   guint32 avp_tag;                /* optional */
>   
> } e_avphdr;
> 
> #define AUTHENTICATOR_LENGTH 12
> 
> #define DIAM_FLAGS_A 0x10
> #define DIAM_FLAGS_W 0x08
> #define AVP_FLAGS_P 0x0010
> #define AVP_FLAGS_T 0x0008
> #define AVP_FLAGS_V 0x0004
> #define AVP_FLAGS_R 0x0002
> #define AVP_FLAGS_M 0x0001
> 
> void proto_reg_handoff_diameter(void);
> 
> static guint32 match_numval(guint32 val, const value_value_pair *vs)
> {
>   guint32 i = 0;
> 
>   while (vs[i].val1) {
>     if (vs[i].val1 == val)
>       return(vs[i].val2);
>     i++;
>   }
> 
>   return(0);
> }
> 
> static gchar *rdconvertbufftostr(gchar *dest,guint8 length,const guint8 *pd)
> {
> /*converts the raw buffer into printable text */
> guint32 i;
> guint32 totlen=0;
> 
>         dest[0]='"';
>         dest[1]=0;
>         totlen=1;
>         for (i=0; i < (guint32)length; i++)
>         {
>                 if( isalnum((int)pd[i])||ispunct((int)pd[i])
>                                 ||((int)pd[i]==' '))            {
>                         dest[totlen]=(gchar)pd[i];
>                         totlen++;
>                 }
>                 else
>                 {
>                         sprintf(&(dest[totlen]), "\\%03u", pd[i]);
>                         totlen=totlen+strlen(&(dest[totlen]));
>                 }
>         }
>         dest[totlen]='"';
>         dest[totlen+1]=0;
>         return dest;
> }
> 
> static gchar *rd_match_strval(guint32 val, const value_string *vs) {
> 	gchar		*result;
> 	result=match_strval(val,vs);
> 	if (result == NULL ) {
> 		result="Undefined";
> 	}
> 	return result;
> }
> static char *complexValCheck(e_avphdr *avp, const char *data, size_t dataLen)
> {
> 	const char *rawData;
> 	static char returnStr[1024];
> 
> 	switch (avp->avp_type) {
> 	case DIAMETER_ATT_INTEGRITY_CHECK_VALUE:
> 	{
> 		struct {
> 			guint32 transform;
> 			guint32 keyid;
> 		} icv;
> 		
> 		memcpy(&icv, data, 8);
> 		icv.transform=ntohl(icv.transform);
> 		icv.keyid=ntohl(icv.keyid);
> 		rawData = &data[8];
> 
> 		sprintf(returnStr, 
> 		    "transform: 0x%08x (%d) keyid: 0x%08x (%d) Hash: ",
> 		    icv.transform, icv.transform, icv.keyid, icv.keyid);
> 		
> 		rdconvertbufftostr(&returnStr[strlen(returnStr)],
> 		    dataLen-8,
> 		    rawData);
> 		return returnStr;
> 	}
> 	}
> 
> 	return NULL;;
> } /* complexValCheck */
> static char *customValCheck(int code, int value)
> {
> 	switch (code) {
> 	case DIAMETER_ATT_QOS_SERVICE_TYPE:
> 		return rd_match_strval(value, diameter_qos_service_type_vals);
> 		break;
> 	case DIAMETER_ATT_SERVICE_TYPE:
> 		return rd_match_strval(value, diameter_service_type_vals);
> 		break;
> 	case DIAMETER_ATT_PROHIBIT:
> 		return rd_match_strval(value, diameter_prohibit_vals);
> 		break;
> 	case DIAMETER_ATT_PROMPT:
> 		return rd_match_strval(value, diameter_prompt_vals);
> 		break;
> 	case DIAMETER_ATT_SOURCE_PORT:
> 		return rd_match_strval(value, diameter_source_port_vals);
> 		break;
> 	case DIAMETER_ATT_NAS_PORT_TYPE:
> 		return rd_match_strval(value, diameter_nas_port_type_vals);
> 		break;
> 	case DIAMETER_ATT_INTERFACE_ADDRESS:
> 		return rd_match_strval(value, diameter_interface_address_vals);
> 		break;
> 	case DIAMETER_ATT_FRAMED_ROUTING:
> 		return rd_match_strval(value, diameter_framed_routing_vals);
> 		break;
> 	case DIAMETER_ATT_COMMAND_CODE:
> 		return rd_match_strval(value, diameter_command_code_vals);
> 		break;
> 	case DIAMETER_ATT_FRAMED_IP_ADDRESS:
> 		return rd_match_strval(value, diameter_framed_ip_address_vals);
> 		break;
> 	case DIAMETER_ATT_ARAP_ZONE_ACCESS:
> 		return rd_match_strval(value, diameter_arap_zone_access_vals);
> 		break;
> 	case DIAMETER_ATT_ACCT_AUTHENTIC:
> 		return rd_match_strval(value, diameter_acct_authentic_vals);
> 		break;
> 	case DIAMETER_ATT_FRAMED_PROTOCOL:
> 		return rd_match_strval(value, diameter_framed_protocol_vals);
> 		break;
> 	case DIAMETER_ATT_FRAMED_COMPRESSION:
> 		return rd_match_strval(value, diameter_framed_compression_vals);
> 		break;
> 	case DIAMETER_ATT_AUTHENTICATION_TYPE:
> 		return rd_match_strval(value, diameter_authentication_type_vals);
> 		break;
> 	case DIAMETER_ATT_ACCT_TERMINATE_CAUSE:
> 		return rd_match_strval(value, diameter_acct_terminate_cause_vals);
> 		break;
> 	case DIAMETER_ATT_PROTOCOL:
> 		return rd_match_strval(value, diameter_protocol_vals);
> 		break;
> 	case DIAMETER_ATT_DESTINATION_PORT:
> 		return rd_match_strval(value, diameter_destination_port_vals);
> 		break;
> 	case DIAMETER_ATT_TERMINATION_ACTION:
> 		return rd_match_strval(value, diameter_termination_action_vals);
> 		break;
> 	case DIAMETER_ATT_EXTENSION_ID:
> 		return rd_match_strval(value, diameter_extension_id_vals);
> 		break;
> 	case DIAMETER_ATT_MERIT_LAS_CODE:
> 		return rd_match_strval(value, diameter_merit_las_code_vals);
> 		break;
> 	case DIAMETER_ATT_LOGIN_SERVICE:
> 		return rd_match_strval(value, diameter_login_service_vals);
> 		break;
> 	case DIAMETER_ATT_RSVP_SERVICE_TYPE:
> 		return rd_match_strval(value, diameter_rsvp_service_type_vals);
> 		break;
> 	case DIAMETER_ATT_REBOOT_TYPE:
> 		return rd_match_strval(value, diameter_reboot_type_vals);
> 		break;
> 	case DIAMETER_ATT_ACCT_STATUS_TYPE:
> 		return rd_match_strval(value, diameter_acct_status_type_vals);
> 		break;
> 	}
> 
> 	return NULL;
> }
> 
> static gchar *rd_value_to_str(e_avphdr *avph,const u_char *pd, int offset)
> {
> 	int print_type;
> 	gchar *cont;
> 	guint32 intval;
> 	int dataLen;
> 	char *valstr;
> 	static char buffer[1024];
> 
> 	dataLen = avph->avp_length - sizeof(e_avphdr);
> 
> 	if (!(avph->avp_flags & AVP_FLAGS_V))
> 		dataLen += 4;
> 	if (!(avph->avp_flags & AVP_FLAGS_T))
> 		dataLen += 4;
> 
> /* prints the values of the attribute value pairs into a text buffer */
> 	
> 	print_type=match_numval(avph->avp_type,diameter_printinfo);
> 	/* Default begin */
> 	sprintf(buffer,"Value: ");
> 	cont=&buffer[strlen(buffer)];
> 	switch(print_type)
> 		{
> 		case DIAMETER_COMPLEX:
> 			valstr=complexValCheck(avph, &(pd[offset]), dataLen);
> 			if (valstr) {
> 				strcpy(cont, valstr);
> 				break;
> 			}
> 				
> 			/* Intentional fall through */
> 		case DIAMETER_DATA:
> 		case DIAMETER_STRING:
> 			rdconvertbufftostr(cont,dataLen,
> 			    &(pd[offset]));
> 			break;
> 		case DIAMETER_ADDRESS:
> 			sprintf(cont,"%u.%u.%u.%u",(guint8)pd[offset],
> 			    (guint8)pd[offset+1],(guint8)pd[offset+2],
> 			    (guint8)pd[offset+3]);
> 			break;
> 		case DIAMETER_INTEGER32:
> 			/* Check for custom values */
> 			intval=pntohl(&(pd[offset]));
> 			valstr=customValCheck(avph->avp_type, intval);
> 			if (valstr) {
> 				sprintf(cont,"%s (%u)", valstr, intval);
> 			} else {
> 				sprintf(cont,"%u", intval);
> 			}
> 			break;
> 		case DIAMETER_INTEGER64:
> 			sprintf(cont,"Unsupported Conversion");
> 			break;
> 		case DIAMETER_TIME:
> 		{
> 			struct tm lt;
> 			intval=pntohl(&(pd[offset]));
> 			intval -= NTP_TIME_DIFF;
> 			lt=*localtime((time_t *)&intval);
> 			strftime(cont, 1024, 
> 			    "%a, %d %b %Y %H:%M:%S %z",&lt);
> 		}
> 		break;
> 			
> 		default:
> 			rdconvertbufftostr(cont,dataLen,
> 			    &(pd[offset]));
> 			break;
> 		}
> 	if (cont == buffer) {
> 		strcpy(cont,"Unknown Value");
> 	}
> 	return buffer;
> }
> 
> 
> static void dissect_attribute_value_pairs(const u_char *pd, int offset,
>     frame_data *fd, proto_tree *tree, int avplength) {
> /* adds the attribute value pairs to the tree */
> 	e_avphdr avph;
> 	gchar *avptpstrval;
> 	gchar *valstr;
> 	guint32 tag=0;
> 	guint32 vendorId=0;
> 	int dataOffset;
> 	int fixAmt;
> 	proto_item *avptf;
> 	proto_tree *avptree;
> 	int vendorOffset, tagOffset;
> 	
> 	if (avplength==0) {
> 		proto_tree_add_text(tree, NullTVB,offset,0,
> 		    "No Attribute Value Pairs Found");
> 		return;
> 	}
> 	
> 	while (avplength > 0 ) {
> 		vendorOffset = tagOffset = 0;
> 		memcpy(&avph,&pd[offset],sizeof(e_avphdr));
> 		avph.avp_type = ntohl(avph.avp_type);
> 		avph.avp_length = ntohs(avph.avp_length);
> 		avph.avp_flags = ntohs(avph.avp_flags);
> 		
> 		if (avph.avp_flags & AVP_FLAGS_V) {
> 			vendorId = ntohl(avph.avp_vendorId);
> 			vendorOffset = 8;
> 			if (avph.avp_flags & AVP_FLAGS_T) {
> 				tag = ntohl(avph.avp_tag);
> 				tagOffset = 12;
> 				dataOffset = sizeof(e_avphdr);
> 			} else {
> 				/* only a vendor id */
> 				dataOffset = sizeof(e_avphdr) - sizeof(guint32);
> 			}
> 		} else {
> 			if (avph.avp_flags & AVP_FLAGS_T) {
> 				/* tag in vendor field */
> 				tag = ntohl(avph.avp_vendorId);
> 				tagOffset = 8;
> 				dataOffset = sizeof(e_avphdr) - sizeof(guint32);
> 			} else {
> 				/* No vendor or tag info */
> 				dataOffset = sizeof(e_avphdr) -
> 				    (2*sizeof(guint32));
> 			}
> 		}
> 		
> 	        /*
> 		 * Fix byte-alignment
> 		 */
> 		fixAmt = 4 - (avph.avp_length % 4);
> 		if (fixAmt == 4) fixAmt = 0;
> 		avplength=avplength - (avph.avp_length + fixAmt);
> 		avptpstrval=match_strval(avph.avp_type, diameter_attrib_type_vals);
> 		if (avptpstrval == NULL) avptpstrval="Unknown Type";
> 		if (!BYTES_ARE_IN_FRAME(offset, avph.avp_length)) {
> 			break;
> 		}
> 		avptf = proto_tree_add_text(tree,NullTVB,
> 		    offset, avph.avp_length,
> 		    "%s(%d) l:0x%x (%d bytes)",
> 		    avptpstrval,avph.avp_type,avph.avp_length,
> 		    avph.avp_length);
> 		avptree = proto_item_add_subtree(avptf,
> 		    ett_diameter_avpinfo);
> 		if (avptree !=NULL) {
> 			proto_tree_add_text(avptree,NullTVB,
> 			    offset, 4,
> 			    "AVP Code: %s(%d)",
> 			    avptpstrval,avph.avp_type);
> 			proto_tree_add_text(avptree,NullTVB,
> 			    offset+4 , 2,
> 			    "Length: 0x%x(%d bytes)",
> 			    avph.avp_length, avph.avp_length);
> 			proto_tree_add_text(avptree,NullTVB,
> 			    offset+6, 2,
> 			    "Flags: P:%d T:%d V:%d R:%d M:%d",
> 			    (avph.avp_flags & AVP_FLAGS_P)?1:0,
> 			    (avph.avp_flags & AVP_FLAGS_T)?1:0,
> 			    (avph.avp_flags & AVP_FLAGS_V)?1:0,
> 			    (avph.avp_flags & AVP_FLAGS_R)?1:0,
> 			    (avph.avp_flags & AVP_FLAGS_M)?1:0);
> 			if (vendorOffset) {
> 				proto_tree_add_text(avptree,NullTVB,
> 				    offset+vendorOffset, 4,
> 				    "VendorId: 0x%08x (%d)",
> 				    vendorId, vendorId);
> 			}
> 			if (tagOffset) {
> 				proto_tree_add_text(avptree,NullTVB,
> 				    offset+tagOffset, 4,
> 				    "Tag: 0x%08x (%d)",
> 				    tag, tag);
> 			}
> 			valstr=rd_value_to_str(&avph, pd, offset+dataOffset);
> 			proto_tree_add_text(avptree,NullTVB,
> 			    offset+dataOffset, avph.avp_length - dataOffset,
> 			    "Data: (%d bytes) %s",
> 			    avph.avp_length - dataOffset, valstr);
> 		}
> 		offset=offset+avph.avp_length + fixAmt;
> 		if (avph.avp_length == 0) {
> 			break;
> 		}
> 	}
> }
> 
> static void dissect_diameter(const u_char *pd, int offset, frame_data *fd, 
>     proto_tree *tree)
> {
>   proto_tree *diameter_tree,*avptree;
>   proto_item *ti,*avptf;
>   int avplength,hdrlength, offsetavp;
>   e_diameterhdr dh;
>   int commandCode;
>   char buffer[2000];
>   int nextSend, nextReceived;
>   
>   gchar *codestrval;
>   
>   
>   if (gbl_commandCodeInHeader) 
>     hdrlength=sizeof(e_diameterhdr);
>   else
>     hdrlength = sizeof(e_diameterhdr) - (2 * sizeof(uint32_t));
>   
>   memcpy(&dh,&pd[offset],hdrlength);
>   /* Fix byte ordering in our static structure */
>   dh.pktLength = ntohs(dh.pktLength);
>   dh.identifier = ntohl(dh.identifier);
>   
>   /* Our code is in first avp */
>   if (gbl_commandCodeInHeader) {
>     dh.u.new.nextSend = ntohs(dh.u.new.nextSend);
>     dh.u.new.nextReceived = ntohs(dh.u.new.nextReceived);
>     dh.u.new.commandCode = ntohl(dh.u.new.commandCode);
>     dh.u.new.vendorId = ntohl(dh.u.new.vendorId);
>     nextSend = dh.u.new.nextSend;
>     nextReceived = dh.u.new.nextReceived;
>     commandCode = dh.u.new.commandCode;
>   } else {
>     dh.u.old.nextSend = ntohs(dh.u.old.nextSend);
>     dh.u.old.nextReceived = ntohs(dh.u.old.nextReceived);
>     nextSend = dh.u.old.nextSend;
>     nextReceived = dh.u.old.nextReceived;
>     memcpy(&commandCode, &pd[offset+COMMAND_CODE_OFFSET], 4);
>     commandCode = ntohl(commandCode);
>   }
>   
>   codestrval=  match_strval(commandCode,diameter_command_code_vals);
>   if (codestrval==NULL) {
>     codestrval="Unknown Packet";
>   }
>   if (check_col(fd, COL_PROTOCOL))
>     col_add_str(fd, COL_PROTOCOL, "DIAMETER");
>   if (check_col(fd, COL_INFO)) {
>     if (DIAM_FLAGS_A & dh.flagsVer) {
>       sprintf(buffer,"ACK (id=%d, l=%d, s=%d, r=%d)",
> 	      dh.identifier, dh.pktLength, nextSend,
> 	      nextReceived);
>     } else {
>       sprintf(buffer,"%s(%d) (id=%d, l=%d, s=%d, r=%d)",
> 	      codestrval,commandCode, dh.identifier, dh.pktLength,
> 	      nextSend, nextReceived);
>     }
>     col_add_fstr(fd,COL_INFO,buffer);
>   }
>   
>   if (tree) {
>     
>     ti = proto_tree_add_protocol_format(tree, proto_diameter, NullTVB,
> 					offset, dh.pktLength, "%s",
> 					gbl_diameterString);
>     diameter_tree = proto_item_add_subtree(ti, ett_diameter);
>     
>     if (!(DIAM_FLAGS_A & dh.flagsVer)) {
>       proto_tree_add_uint_format(diameter_tree,
> 				 hf_diameter_code,
> 				 NullTVB,
> 				 offset+0,
> 				 1, dh.code, "Packet code:0x%02x",
> 				 dh.code);
>     }
>     
>     proto_tree_add_uint_format(diameter_tree,
> 			       hf_diameter_flags,
> 			       NullTVB, offset+1, 1,
> 			       dh.flagsVer,
> 			       "Packet flags/Version: 0x%02x (Flags:0x%x,"
> 			       " A:%d W:%d Version=0x%1x (%d)",
> 			       dh.flagsVer, (dh.flagsVer&0xf8)>>3,
> 			       (DIAM_FLAGS_A & dh.flagsVer)?1:0,
> 			       (DIAM_FLAGS_W & dh.flagsVer)?1:0,
> 			       dh.flagsVer&0x07, dh.flagsVer&0x07);
>     proto_tree_add_uint_format(diameter_tree,
> 			       hf_diameter_length, NullTVB,
> 			       offset+2, 2,
> 			       dh.pktLength, 
> 			       "Packet length: 0x%04x (%d)",dh.pktLength,
> 			       dh.pktLength); 
>     proto_tree_add_uint_format(diameter_tree,hf_diameter_id,
> 			       NullTVB, offset+4, 4,
> 			       dh.identifier, "Packet identifier: 0x%08x (%d)",
> 			       dh.identifier, dh.identifier);         
>     if (gbl_commandCodeInHeader) {
>       proto_tree_add_uint_format(diameter_tree,hf_diameter_id,
> 				 NullTVB, offset+8, 4,
> 				 dh.identifier, "Command Code: 0x%08x (%d:%s)",
> 				 dh.u.new.commandCode, dh.u.new.commandCode,
> 				 codestrval);         
>       proto_tree_add_uint_format(diameter_tree,hf_diameter_id,
> 				 NullTVB, offset+12, 4,
> 				 dh.identifier, "VendorId: 0x%08x (%d)",
> 				 dh.u.new.vendorId, dh.u.new.vendorId);         
>       proto_tree_add_uint_format(diameter_tree,
> 				 hf_diameter_ns, NullTVB,
> 				 offset+16, 2,
> 				 nextSend, 
> 				 "Ns: 0x%02x(%d)",nextSend, nextSend);
>       
>       proto_tree_add_uint_format(diameter_tree,
> 				 hf_diameter_nr, NullTVB,
> 				 offset+20, 2,
> 				 nextReceived, 
> 				 "Nr: 0x%02x(%d)", nextReceived,
> 				 nextReceived); 
>     } else {
>       proto_tree_add_uint_format(diameter_tree,
> 				 hf_diameter_ns, NullTVB,
> 				 offset+8, 2,
> 				 nextSend, 
> 				 "Ns: 0x%02x(%d)",nextSend, nextSend);
>       
>       proto_tree_add_uint_format(diameter_tree,
> 				 hf_diameter_nr, NullTVB,
> 				 offset+10, 2,
> 				 nextReceived, 
> 				 "Nr: 0x%02x(%d)", nextReceived,
> 				 nextReceived); 
>     }
>     
> 		/* Update the lengths */
> 		avplength= dh.pktLength -hdrlength;
> 		offsetavp=offset+hdrlength;
> 		
> 		/* list the attribute value pairs */
> 		
> 		avptf = proto_tree_add_text(diameter_tree,
> 		    NullTVB,offset+hdrlength,avplength,
> 		    "Attribute value pairs");
> 		avptree = proto_item_add_subtree(avptf,
> 		    ett_diameter_avp);
> 		if (avptree !=NULL) {
> 			dissect_attribute_value_pairs( pd,
> 			    offsetavp,fd,avptree,avplength);
> 		}
> 	}
> }
> 
> /* registration with the filtering engine */
> void
> proto_register_diameter(void)
> {
> 	static hf_register_info hf[] = {
> 		{ &hf_diameter_code,
> 		  { "Code","diameter.code", FT_UINT8, BASE_DEC, NULL, 0x0,
> 		    "" }},
> 		
> 		{ &hf_diameter_flags,
> 		  { "Flags+Version", "diameter.flags", FT_UINT8, BASE_DEC, NULL, 0x0,
> 		    "" }},
> 		
> 		{ &hf_diameter_length,
> 		{ "Length","diameter.length", FT_UINT32, BASE_DEC, NULL, 0x0,
> 		  "" }},
> 		
> 		{ &hf_diameter_id,
> 		{ "Identifier",	"diameter.id", FT_UINT32, BASE_DEC, NULL, 0x0,
> 		  "" }},
> 
> 		{ &hf_diameter_ns,
> 		  { "Next Send",	"diameter.ns", FT_UINT16, BASE_DEC, NULL, 0x0,
> 		    "" }},
> 		{ &hf_diameter_nr,
> 		  { "Next Received",	"diameter.nr", FT_UINT16, BASE_DEC, NULL, 0x0,
> 		    "" }},
> 
> 	};
> 	static gint *ett[] = {
> 		&ett_diameter,
> 		&ett_diameter_avp,
> 		&ett_diameter_avpinfo
> 	};
> 	module_t *diameter_module;
> 	
> 	/* Register a configuration option for port */
> #if 0
> 	g_warning ("DIAMETER Registering configuration option (port = %d)",
> 	    gbl_diameterPort);
> #endif
> 	diameter_module = prefs_register_module("Diameter", "Diameter",
> 	    proto_reg_handoff_diameter);
> 	prefs_register_uint_preference(diameter_module, "port",
> 	    "DIAMETER Port",
> 	    "Set the port for DIAMETER messages", 10,
> 	    &gbl_diameterPort);
> 	prefs_register_bool_preference(diameter_module, "command_in_header",
> 				       "Command code in header",
> 				       "Whether the command code is in the header, or in the first AVP",
> 				       &gbl_commandCodeInHeader);
> 
> #if 0
> 	g_warning ("DIAMETER Registering protocol (port = %d)",
> 	    gbl_diameterPort);
> #endif
> 	proto_diameter = proto_register_protocol (gbl_diameterString, "diameter");
> 	proto_register_field_array(proto_diameter, hf, array_length(hf));
> 	proto_register_subtree_array(ett, array_length(ett));
> }
> 
> void
> proto_reg_handoff_diameter(void)
> {
> 	static int Initialized=FALSE;
> 	static int port=0;
> 
> 	if (Initialized) {
> #if 0
> 		g_warning ("DIAMETER re-registering handoff (port = %d)",
> 		    gbl_diameterPort);
> #endif
> 		dissector_delete("udp.port", port, dissect_diameter);
> 	} else {
> #if 0
> 		g_warning ("DIAMETER Registering handoff (port = %d)",
> 		    gbl_diameterPort);
> #endif
> 		Initialized=TRUE;
> 	}
> 
> 	/* set port for future deletes */
> 	port=gbl_diameterPort;
> 
> 	sprintf(gbl_diameterString, "Diameter Protocol (port %d)",
> 		gbl_diameterPort);
> 	dissector_add("udp.port", gbl_diameterPort, dissect_diameter);
> }
> -------------------------------end packet-diameter.c-----------------
> --------------------packet-diameter.h-----------------------
> /*
>  * Filename: packet-diameter.h
>  * WARNING:  This file was automatically generated by dict2h.pl.  Modifications
>  *           will be erased by next invocation of dictionary parser.
>  */
> 
> #ifndef _PACKET_DIAMETER_H
> #define _PACKET_DIAMETER_H
> 
> /* Attributes */
> #define DIAMETER_ATT_USER_NAME 1
> #define DIAMETER_ATT_USER_PASSWORD 2
> #define DIAMETER_ATT_CHAP_PASSWORD 3
> #define DIAMETER_ATT_NAS_IP_ADDRESS 4
> #define DIAMETER_ATT_NAS_PORT 5
> #define DIAMETER_ATT_SERVICE_TYPE 6
> #define DIAMETER_ATT_FRAMED_PROTOCOL 7
> #define DIAMETER_ATT_FRAMED_IP_ADDRESS 8
> #define DIAMETER_ATT_FRAMED_IP_NETMASK 9
> #define DIAMETER_ATT_FRAMED_ROUTING 10
> #define DIAMETER_ATT_FILTER_ID 11
> #define DIAMETER_ATT_FRAMED_MTU 12
> #define DIAMETER_ATT_FRAMED_COMPRESSION 13
> #define DIAMETER_ATT_LOGIN_IP_HOST 14
> #define DIAMETER_ATT_LOGIN_SERVICE 15
> #define DIAMETER_ATT_LOGIN_TCP_PORT 16
> #define DIAMETER_ATT_OLD_PASSWORD 17
> #define DIAMETER_ATT_REPLY_MESSAGE 18
> #define DIAMETER_ATT_CALLBACK_NUMBER 19
> #define DIAMETER_ATT_CALLBACK_ID 20
> #define DIAMETER_ATT_FRAMED_ROUTE 22
> #define DIAMETER_ATT_FRAMED_IPX_NETWORK 23
> #define DIAMETER_ATT_STATE 24
> #define DIAMETER_ATT_CLASS 25
> #define DIAMETER_ATT_SESSION_TIMEOUT 27
> #define DIAMETER_ATT_IDLE_TIMEOUT 28
> #define DIAMETER_ATT_TERMINATION_ACTION 29
> #define DIAMETER_ATT_CALLED_STATION_ID 30
> #define DIAMETER_ATT_CALLING_STATION_ID 31
> #define DIAMETER_ATT_NAS_IDENTIFIER 32
> #define DIAMETER_ATT_PROXY_STATE 33
> #define DIAMETER_ATT_LOGIN_LAT_SERVICE 34
> #define DIAMETER_ATT_LOGIN_LAT_NODE 35
> #define DIAMETER_ATT_LOGIN_LAT_GROUP 36
> #define DIAMETER_ATT_FRAMED_APPLETALK_LINK 37
> #define DIAMETER_ATT_FRAMED_APPLETALK_NETWORK 38
> #define DIAMETER_ATT_FRAMED_APPLETALK_ZONE 39
> #define DIAMETER_ATT_CHAP_CHALLENGE 60
> #define DIAMETER_ATT_NAS_PORT_TYPE 61
> #define DIAMETER_ATT_PORT_LIMIT 62
> #define DIAMETER_ATT_LOGIN_LAT_PORT 63
> #define DIAMETER_ATT_TUNNEL_TYPE 64
> #define DIAMETER_ATT_TUNNEL_MEDIUM_TYPE 65
> #define DIAMETER_ATT_ACCT_TUNNEL_CLIENT_ENDPOINT 66
> #define DIAMETER_ATT_TUNNEL_SERVER_ENDPOINT 67
> #define DIAMETER_ATT_ACCT_TUNNEL_CONNECTION_ID 68
> #define DIAMETER_ATT_TUNNEL_PASSWORD 69
> #define DIAMETER_ATT_ARAP_PASSWORD 70
> #define DIAMETER_ATT_ARAP_FEATURES 71
> #define DIAMETER_ATT_ARAP_ZONE_ACCESS 72
> #define DIAMETER_ATT_ARAP_SECURITY 73
> #define DIAMETER_ATT_ARAP_SECURITY_DATA 74
> #define DIAMETER_ATT_PASSWORD_RETRY 75
> #define DIAMETER_ATT_PROMPT 76
> #define DIAMETER_ATT_CONNECT_INFO 77
> #define DIAMETER_ATT_CONFIGURATION_TOKEN 78
> #define DIAMETER_ATT_EAP_MESSAGE 79
> #define DIAMETER_ATT_SIGNATURE 80
> #define DIAMETER_ATT_ACCT_STATUS_TYPE 40
> #define DIAMETER_ATT_ACCT_DELAY_TIME 41
> #define DIAMETER_ATT_ACCT_INPUT_OCTETS 42
> #define DIAMETER_ATT_ACCT_OUTPUT_OCTETS 43
> #define DIAMETER_ATT_ACCT_SESSION_ID 44
> #define DIAMETER_ATT_ACCT_AUTHENTIC 45
> #define DIAMETER_ATT_ACCT_SESSION_TIME 46
> #define DIAMETER_ATT_ACCT_INPUT_PACKETS 47
> #define DIAMETER_ATT_ACCT_OUTPUT_PACKETS 48
> #define DIAMETER_ATT_ACCT_TERMINATE_CAUSE 49
> #define DIAMETER_ATT_ACCT_MULTI_SESSION_ID 50
> #define DIAMETER_ATT_ACCT_LINK_COUNT 51
> #define DIAMETER_ATT_MERIT_ENCAPSULATED 141
> #define DIAMETER_ATT_MERIT_REPLY_IF_ACK_MESSAGE 144
> #define DIAMETER_ATT_MERIT_LAS_START_TIME 145
> #define DIAMETER_ATT_MERIT_LAS_CODE 146
> #define DIAMETER_ATT_MERIT_LAS_DURATION 147
> #define DIAMETER_ATT_MERIT_LOCAL_DURATION 148
> #define DIAMETER_ATT_MERIT_HUNTGROUP_SERVICE 149
> #define DIAMETER_ATT_MERIT_PORT_ENTRY 150
> #define DIAMETER_ATT_MERIT_PROXY_ACTION 211
> #define DIAMETER_ATT_MERIT_TOKEN 213
> #define DIAMETER_ATT_MERIT_OWNERSHIP 219
> #define DIAMETER_ATT_MERIT_SUBGROUP 220
> #define DIAMETER_ATT_MERIT_HUNTGROUP_NAME 221
> #define DIAMETER_ATT_MERIT_USER_ID 222
> #define DIAMETER_ATT_MERIT_USER_REALM 223
> #define DIAMETER_ATT_COMMAND_CODE 256
> #define DIAMETER_ATT_EXTENSION_ID 258
> #define DIAMETER_ATT_INTEGRITY_CHECK_VALUE 259
> #define DIAMETER_ATT_ENCRYPTED_PAYLOAD 260
> #define DIAMETER_ATT_NONCE 261
> #define DIAMETER_ATT_TIMESTAMP 262
> #define DIAMETER_ATT_SESSION_ID 263
> #define DIAMETER_ATT_VENDOR_NAME 266
> #define DIAMETER_ATT_FIRMWARE_REVISION 267
> #define DIAMETER_ATT_RESULT_CODE 268
> #define DIAMETER_ATT_DESTINATION_NAI 269
> #define DIAMETER_ATT_REBOOT_TYPE 271
> #define DIAMETER_ATT_REBOOT_TIME 272
> #define DIAMETER_ATT_FAILED_AVP 279
> #define DIAMETER_ATT_RECEIVE_WINDOW 277
> #define DIAMETER_ATT_REDIRECT_HOST 278
> #define DIAMETER_ATT_IP_PORT 281
> #define DIAMETER_ATT_ACCOUNTING_RECORD_TYPE 480
> #define DIAMETER_ATT_ADIF_RECORD 481
> #define DIAMETER_ATT_ACCOUNTING_INTERIM_INTERVAL 482
> #define DIAMETER_ATT_ACCOUNTING_DELIVERY_MAX_BATCH 483
> #define DIAMETER_ATT_ACCOUNTING_DELIVERY_MAX_DELAY 484
> #define DIAMETER_ATT_ACCOUNTING_RECORD_NUMBER 485
> #define DIAMETER_ATT_MIP_REGISTRATION_REQUEST 320
> #define DIAMETER_ATT_MIP_REGISTRATION_REPLY 321
> #define DIAMETER_ATT_MN_FA_CHALLENGE_LENGTH 322
> #define DIAMETER_ATT_MN_FA_RESPONSE 323
> #define DIAMETER_ATT_MOBILE_NODE_ADDRESS 333
> #define DIAMETER_ATT_HOME_AGENT_ADDRESS 334
> #define DIAMETER_ATT_PREVIOUS_FA_NAI 335
> #define DIAMETER_ATT_MN_AAA_SPI 336
> #define DIAMETER_ATT_FOREIGN_HA_AVAIL 337
> #define DIAMETER_ATT_MN_TO_FA_KEY 325
> #define DIAMETER_ATT_MN_TO_HA_KEY 331
> #define DIAMETER_ATT_FA_TO_MN_KEY 326
> #define DIAMETER_ATT_FA_TO_HA_KEY 328
> #define DIAMETER_ATT_HA_TO_MN_KEY 332
> #define DIAMETER_ATT_HA_TO_FA_KEY 329
> #define DIAMETER_ATT_FA_MN_PREFERRED_SPI 324
> #define DIAMETER_ATT_FA_HA_PREFERRED_SPI 327
> #define DIAMETER_ATT_FILTER_RULE 400
> #define DIAMETER_ATT_REQUEST_TYPE 401
> #define DIAMETER_ATT_EAP_PAYLOAD 402
> #define DIAMETER_ATT_CMS_DATA 310
> #define DIAMETER_ATT_RES_MGMT_INDEX 573
> #define DIAMETER_ATT_RES_MGMT_TOKEN 574
> #define DIAMETER_ATT_SOURCE_HOST 600
> #define DIAMETER_ATT_DESTINATION_HOST 601
> #define DIAMETER_ATT_SOURCE_PORT 602
> #define DIAMETER_ATT_DESTINATION_PORT 603
> #define DIAMETER_ATT_PROTOCOL 604
> #define DIAMETER_ATT_RSVP_SERVICE_TYPE 605
> #define DIAMETER_ATT_TOKEN_BUCKET_RATE 606
> #define DIAMETER_ATT_TOKEN_BUCKET_SIZE 607
> #define DIAMETER_ATT_PEAK_DATA_RATE 608
> #define DIAMETER_ATT_MINIMUM_POLICED_UNIT 609
> #define DIAMETER_ATT_MAXIMUM_PACKET_SIZE 610
> #define DIAMETER_ATT_QOS_RATE 611
> #define DIAMETER_ATT_SLACK_TERM 612
> #define DIAMETER_ATT_TOS_DS_VALUE 613
> #define DIAMETER_ATT_INTERFACE_ADDRESS 614
> #define DIAMETER_ATT_QOS_SERVICE_TYPE 615
> #define DIAMETER_ATT_VOIP_CALLER 686
> #define DIAMETER_ATT_VOIP_CALLEE 687
> #define DIAMETER_ATT_VOIP_CHALLENGE 688
> #define DIAMETER_ATT_VOIP_RESPONSE 689
> #define DIAMETER_ATT_VOIP_SESSION_LENGTH 690
> #define DIAMETER_ATT_COMMENT 1024
> #define DIAMETER_ATT_XVALUE 1025
> #define DIAMETER_ATT_XSTRING 1026
> #define DIAMETER_ATT_AUTHENTICATION_TYPE 1027
> #define DIAMETER_ATT_PROHIBIT 1028
> #define DIAMETER_ATT_USER_CATEGORY 1029
> #define DIAMETER_ATT_GROUP_NAME 1030
> #define DIAMETER_ATT_ENCRYPTED_PASSWORD 1031
> #define DIAMETER_ATT_EXPIRATION 1032
> #define DIAMETER_ATT_PASSWORD 1033
> #define DIAMETER_ATT_SIMULTANEOUS_USE 1034
> #define DIAMETER_ATT_SESSION_LIMIT 1034
> #define DIAMETER_ATT_SERVER_NAME 1035
> #define DIAMETER_ATT_FRAMED_IP_ADDRESS_POOL_NAME 1036
> #define DIAMETER_ATT_SERVICE_CLASS 1037
> #define DIAMETER_ATT_DENY_MESSAGE 1038
> #define DIAMETER_ATT_SOURCE_SUBNET 1039
> #define DIAMETER_ATT_DESTINATION_SUBNET 1040
> #define DIAMETER_ATT_MAX_QOS_RATE 1041
> #define DIAMETER_ATT_ACCOUNTING_ADIF_RECORD 2000
> 
> 
>             /* Attribute to String table */
> 
> static value_string diameter_attrib_type_vals[] = {
>    {DIAMETER_ATT_USER_NAME, "User-Name"},
>    {DIAMETER_ATT_USER_PASSWORD, "User-Password"},
>    {DIAMETER_ATT_CHAP_PASSWORD, "CHAP-Password"},
>    {DIAMETER_ATT_NAS_IP_ADDRESS, "NAS-IP-Address"},
>    {DIAMETER_ATT_NAS_PORT, "NAS-Port"},
>    {DIAMETER_ATT_SERVICE_TYPE, "Service-Type"},
>    {DIAMETER_ATT_FRAMED_PROTOCOL, "Framed-Protocol"},
>    {DIAMETER_ATT_FRAMED_IP_ADDRESS, "Framed-IP-Address"},
>    {DIAMETER_ATT_FRAMED_IP_NETMASK, "Framed-IP-Netmask"},
>    {DIAMETER_ATT_FRAMED_ROUTING, "Framed-Routing"},
>    {DIAMETER_ATT_FILTER_ID, "Filter-Id"},
>    {DIAMETER_ATT_FRAMED_MTU, "Framed-MTU"},
>    {DIAMETER_ATT_FRAMED_COMPRESSION, "Framed-Compression"},
>    {DIAMETER_ATT_LOGIN_IP_HOST, "Login-IP-Host"},
>    {DIAMETER_ATT_LOGIN_SERVICE, "Login-Service"},
>    {DIAMETER_ATT_LOGIN_TCP_PORT, "Login-TCP-Port"},
>    {DIAMETER_ATT_OLD_PASSWORD, "Old-Password"},
>    {DIAMETER_ATT_REPLY_MESSAGE, "Reply-Message"},
>    {DIAMETER_ATT_CALLBACK_NUMBER, "Callback-Number"},
>    {DIAMETER_ATT_CALLBACK_ID, "Callback-Id"},
>    {DIAMETER_ATT_FRAMED_ROUTE, "Framed-Route"},
>    {DIAMETER_ATT_FRAMED_IPX_NETWORK, "Framed-IPX-Network"},
>    {DIAMETER_ATT_STATE, "State"},
>    {DIAMETER_ATT_CLASS, "Class"},
>    {DIAMETER_ATT_SESSION_TIMEOUT, "Session-Timeout"},
>    {DIAMETER_ATT_IDLE_TIMEOUT, "Idle-Timeout"},
>    {DIAMETER_ATT_TERMINATION_ACTION, "Termination-Action"},
>    {DIAMETER_ATT_CALLED_STATION_ID, "Called-Station-Id"},
>    {DIAMETER_ATT_CALLING_STATION_ID, "Calling-Station-Id"},
>    {DIAMETER_ATT_NAS_IDENTIFIER, "NAS-Identifier"},
>    {DIAMETER_ATT_PROXY_STATE, "Proxy-State"},
>    {DIAMETER_ATT_LOGIN_LAT_SERVICE, "Login-LAT-Service"},
>    {DIAMETER_ATT_LOGIN_LAT_NODE, "Login-LAT-Node"},
>    {DIAMETER_ATT_LOGIN_LAT_GROUP, "Login-LAT-Group"},
>    {DIAMETER_ATT_FRAMED_APPLETALK_LINK, "Framed-AppleTalk-Link"},
>    {DIAMETER_ATT_FRAMED_APPLETALK_NETWORK, "Framed-AppleTalk-Network"},
>    {DIAMETER_ATT_FRAMED_APPLETALK_ZONE, "Framed-AppleTalk-Zone"},
>    {DIAMETER_ATT_CHAP_CHALLENGE, "CHAP-Challenge"},
>    {DIAMETER_ATT_NAS_PORT_TYPE, "NAS-Port-Type"},
>    {DIAMETER_ATT_PORT_LIMIT, "Port-Limit"},
>    {DIAMETER_ATT_LOGIN_LAT_PORT, "Login-LAT-Port"},
>    {DIAMETER_ATT_TUNNEL_TYPE, "Tunnel-Type"},
>    {DIAMETER_ATT_TUNNEL_MEDIUM_TYPE, "Tunnel-Medium-Type"},
>    {DIAMETER_ATT_ACCT_TUNNEL_CLIENT_ENDPOINT, "Acct-Tunnel-Client-Endpoint"},
>    {DIAMETER_ATT_TUNNEL_SERVER_ENDPOINT, "Tunnel-Server-Endpoint"},
>    {DIAMETER_ATT_ACCT_TUNNEL_CONNECTION_ID, "Acct-Tunnel-Connection-ID"},
>    {DIAMETER_ATT_TUNNEL_PASSWORD, "Tunnel-Password"},
>    {DIAMETER_ATT_ARAP_PASSWORD, "ARAP-Password"},
>    {DIAMETER_ATT_ARAP_FEATURES, "ARAP-Features"},
>    {DIAMETER_ATT_ARAP_ZONE_ACCESS, "ARAP-Zone-Access"},
>    {DIAMETER_ATT_ARAP_SECURITY, "ARAP-Security"},
>    {DIAMETER_ATT_ARAP_SECURITY_DATA, "ARAP-Security-Data"},
>    {DIAMETER_ATT_PASSWORD_RETRY, "Password-Retry"},
>    {DIAMETER_ATT_PROMPT, "Prompt"},
>    {DIAMETER_ATT_CONNECT_INFO, "Connect-Info"},
>    {DIAMETER_ATT_CONFIGURATION_TOKEN, "Configuration-Token"},
>    {DIAMETER_ATT_EAP_MESSAGE, "EAP-Message"},
>    {DIAMETER_ATT_SIGNATURE, "Signature"},
>    {DIAMETER_ATT_ACCT_STATUS_TYPE, "Acct-Status-Type"},
>    {DIAMETER_ATT_ACCT_DELAY_TIME, "Acct-Delay-Time"},
>    {DIAMETER_ATT_ACCT_INPUT_OCTETS, "Acct-Input-Octets"},
>    {DIAMETER_ATT_ACCT_OUTPUT_OCTETS, "Acct-Output-Octets"},
>    {DIAMETER_ATT_ACCT_SESSION_ID, "Acct-Session-Id"},
>    {DIAMETER_ATT_ACCT_AUTHENTIC, "Acct-Authentic"},
>    {DIAMETER_ATT_ACCT_SESSION_TIME, "Acct-Session-Time"},
>    {DIAMETER_ATT_ACCT_INPUT_PACKETS, "Acct-Input-Packets"},
>    {DIAMETER_ATT_ACCT_OUTPUT_PACKETS, "Acct-Output-Packets"},
>    {DIAMETER_ATT_ACCT_TERMINATE_CAUSE, "Acct-Terminate-Cause"},
>    {DIAMETER_ATT_ACCT_MULTI_SESSION_ID, "Acct-Multi-Session-Id"},
>    {DIAMETER_ATT_ACCT_LINK_COUNT, "Acct-Link-Count"},
>    {DIAMETER_ATT_MERIT_ENCAPSULATED, "Merit.Encapsulated"},
>    {DIAMETER_ATT_MERIT_REPLY_IF_ACK_MESSAGE, "Merit.Reply-If-Ack-Message"},
>    {DIAMETER_ATT_MERIT_LAS_START_TIME, "Merit.LAS-Start-Time"},
>    {DIAMETER_ATT_MERIT_LAS_CODE, "Merit.LAS-Code"},
>    {DIAMETER_ATT_MERIT_LAS_DURATION, "Merit.LAS-Duration"},
>    {DIAMETER_ATT_MERIT_LOCAL_DURATION, "Merit.Local-Duration"},
>    {DIAMETER_ATT_MERIT_HUNTGROUP_SERVICE, "Merit.Huntgroup-Service"},
>    {DIAMETER_ATT_MERIT_PORT_ENTRY, "Merit.Port-Entry"},
>    {DIAMETER_ATT_MERIT_PROXY_ACTION, "Merit.Proxy-Action"},
>    {DIAMETER_ATT_MERIT_TOKEN, "Merit.Token"},
>    {DIAMETER_ATT_MERIT_OWNERSHIP, "Merit.Ownership"},
>    {DIAMETER_ATT_MERIT_SUBGROUP, "Merit.Subgroup"},
>    {DIAMETER_ATT_MERIT_HUNTGROUP_NAME, "Merit.Huntgroup-Name"},
>    {DIAMETER_ATT_MERIT_USER_ID, "Merit.User-Id"},
>    {DIAMETER_ATT_MERIT_USER_REALM, "Merit.User-Realm"},
>    {DIAMETER_ATT_COMMAND_CODE, "Command-Code"},
>    {DIAMETER_ATT_EXTENSION_ID, "Extension-Id"},
>    {DIAMETER_ATT_INTEGRITY_CHECK_VALUE, "Integrity-Check-Value"},
>    {DIAMETER_ATT_ENCRYPTED_PAYLOAD, "Encrypted-Payload"},
>    {DIAMETER_ATT_NONCE, "Nonce"},
>    {DIAMETER_ATT_TIMESTAMP, "Timestamp"},
>    {DIAMETER_ATT_SESSION_ID, "Session-Id"},
>    {DIAMETER_ATT_VENDOR_NAME, "Vendor-Name"},
>    {DIAMETER_ATT_FIRMWARE_REVISION, "Firmware-Revision"},
>    {DIAMETER_ATT_RESULT_CODE, "Result-Code"},
>    {DIAMETER_ATT_DESTINATION_NAI, "Destination-NAI"},
>    {DIAMETER_ATT_REBOOT_TYPE, "Reboot-Type"},
>    {DIAMETER_ATT_REBOOT_TIME, "Reboot-Time"},
>    {DIAMETER_ATT_FAILED_AVP, "Failed-AVP"},
>    {DIAMETER_ATT_RECEIVE_WINDOW, "Receive-Window"},
>    {DIAMETER_ATT_REDIRECT_HOST, "Redirect-Host"},
>    {DIAMETER_ATT_IP_PORT, "IP-Port"},
>    {DIAMETER_ATT_ACCOUNTING_RECORD_TYPE, "Accounting-Record-Type"},
>    {DIAMETER_ATT_ADIF_RECORD, "ADIF-Record"},
>    {DIAMETER_ATT_ACCOUNTING_INTERIM_INTERVAL, "Accounting-Interim-Interval"},
>    {DIAMETER_ATT_ACCOUNTING_DELIVERY_MAX_BATCH, "Accounting-Delivery-Max-Batch"},
>    {DIAMETER_ATT_ACCOUNTING_DELIVERY_MAX_DELAY, "Accounting-Delivery-Max-Delay"},
>    {DIAMETER_ATT_ACCOUNTING_RECORD_NUMBER, "Accounting-Record-Number"},
>    {DIAMETER_ATT_MIP_REGISTRATION_REQUEST, "MIP-Registration-Request"},
>    {DIAMETER_ATT_MIP_REGISTRATION_REPLY, "MIP-Registration-Reply"},
>    {DIAMETER_ATT_MN_FA_CHALLENGE_LENGTH, "MN-FA-Challenge-Length"},
>    {DIAMETER_ATT_MN_FA_RESPONSE, "MN-FA-Response"},
>    {DIAMETER_ATT_MOBILE_NODE_ADDRESS, "Mobile-Node-Address"},
>    {DIAMETER_ATT_HOME_AGENT_ADDRESS, "Home-Agent-Address"},
>    {DIAMETER_ATT_PREVIOUS_FA_NAI, "Previous-FA-NAI"},
>    {DIAMETER_ATT_MN_AAA_SPI, "MN-AAA-SPI"},
>    {DIAMETER_ATT_FOREIGN_HA_AVAIL, "Foreign-HA-Avail"},
>    {DIAMETER_ATT_MN_TO_FA_KEY, "MN-to-FA-Key"},
>    {DIAMETER_ATT_MN_TO_HA_KEY, "MN-to-HA-Key"},
>    {DIAMETER_ATT_FA_TO_MN_KEY, "FA-to-MN-Key"},
>    {DIAMETER_ATT_FA_TO_HA_KEY, "FA-to-HA-Key"},
>    {DIAMETER_ATT_HA_TO_MN_KEY, "HA-to-MN-Key"},
>    {DIAMETER_ATT_HA_TO_FA_KEY, "HA-to-FA-Key"},
>    {DIAMETER_ATT_FA_MN_PREFERRED_SPI, "FA-MN-Preferred-SPI"},
>    {DIAMETER_ATT_FA_HA_PREFERRED_SPI, "FA-HA-Preferred-SPI"},
>    {DIAMETER_ATT_FILTER_RULE, "Filter-Rule"},
>    {DIAMETER_ATT_REQUEST_TYPE, "Request-Type"},
>    {DIAMETER_ATT_EAP_PAYLOAD, "EAP-Payload"},
>    {DIAMETER_ATT_CMS_DATA, "CMS-Data"},
>    {DIAMETER_ATT_RES_MGMT_INDEX, "Res-Mgmt-Index"},
>    {DIAMETER_ATT_RES_MGMT_TOKEN, "Res-Mgmt-Token"},
>    {DIAMETER_ATT_SOURCE_HOST, "Source-Host"},
>    {DIAMETER_ATT_DESTINATION_HOST, "Destination-Host"},
>    {DIAMETER_ATT_SOURCE_PORT, "Source-Port"},
>    {DIAMETER_ATT_DESTINATION_PORT, "Destination-Port"},
>    {DIAMETER_ATT_PROTOCOL, "Protocol"},
>    {DIAMETER_ATT_RSVP_SERVICE_TYPE, "RSVP-Service-Type"},
>    {DIAMETER_ATT_TOKEN_BUCKET_RATE, "Token-Bucket-Rate"},
>    {DIAMETER_ATT_TOKEN_BUCKET_SIZE, "Token-Bucket-Size"},
>    {DIAMETER_ATT_PEAK_DATA_RATE, "Peak-Data-Rate"},
>    {DIAMETER_ATT_MINIMUM_POLICED_UNIT, "Minimum-Policed-Unit"},
>    {DIAMETER_ATT_MAXIMUM_PACKET_SIZE, "Maximum-Packet-Size"},
>    {DIAMETER_ATT_QOS_RATE, "QOS-Rate"},
>    {DIAMETER_ATT_SLACK_TERM, "Slack-Term"},
>    {DIAMETER_ATT_TOS_DS_VALUE, "TOS-DS-Value"},
>    {DIAMETER_ATT_INTERFACE_ADDRESS, "Interface-Address"},
>    {DIAMETER_ATT_QOS_SERVICE_TYPE, "QOS-Service-Type"},
>    {DIAMETER_ATT_VOIP_CALLER, "Voip-Caller"},
>    {DIAMETER_ATT_VOIP_CALLEE, "Voip-Callee"},
>    {DIAMETER_ATT_VOIP_CHALLENGE, "Voip-Challenge"},
>    {DIAMETER_ATT_VOIP_RESPONSE, "Voip-Response"},
>    {DIAMETER_ATT_VOIP_SESSION_LENGTH, "Voip-Session-Length"},
>    {DIAMETER_ATT_COMMENT, "Comment"},
>    {DIAMETER_ATT_XVALUE, "Xvalue"},
>    {DIAMETER_ATT_XSTRING, "Xstring"},
>    {DIAMETER_ATT_AUTHENTICATION_TYPE, "Authentication-Type"},
>    {DIAMETER_ATT_PROHIBIT, "Prohibit"},
>    {DIAMETER_ATT_USER_CATEGORY, "User-Category"},
>    {DIAMETER_ATT_GROUP_NAME, "Group-Name"},
>    {DIAMETER_ATT_ENCRYPTED_PASSWORD, "Encrypted-Password"},
>    {DIAMETER_ATT_EXPIRATION, "Expiration"},
>    {DIAMETER_ATT_PASSWORD, "Password"},
>    {DIAMETER_ATT_SIMULTANEOUS_USE, "Simultaneous-Use"},
>    {DIAMETER_ATT_SESSION_LIMIT, "Session-Limit"},
>    {DIAMETER_ATT_SERVER_NAME, "Server-Name"},
>    {DIAMETER_ATT_FRAMED_IP_ADDRESS_POOL_NAME, "Framed-IP-Address-Pool-Name"},
>    {DIAMETER_ATT_SERVICE_CLASS, "Service-Class"},
>    {DIAMETER_ATT_DENY_MESSAGE, "Deny-Message"},
>    {DIAMETER_ATT_SOURCE_SUBNET, "Source-Subnet"},
>    {DIAMETER_ATT_DESTINATION_SUBNET, "Destination-Subnet"},
>    {DIAMETER_ATT_MAX_QOS_RATE, "Max-QOS-Rate"},
>    {DIAMETER_ATT_ACCOUNTING_ADIF_RECORD, "Accounting-Adif-Record"},
>    {0, (char *)NULL}
> };
> 
> 
>            /* Attribute to Type Table */
> 
> static value_value_pair diameter_printinfo[] = {
>    { DIAMETER_ATT_USER_NAME, DIAMETER_STRING },
>    { DIAMETER_ATT_USER_PASSWORD, DIAMETER_STRING },
>    { DIAMETER_ATT_CHAP_PASSWORD, DIAMETER_STRING },
>    { DIAMETER_ATT_NAS_IP_ADDRESS, DIAMETER_ADDRESS },
>    { DIAMETER_ATT_NAS_PORT, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_SERVICE_TYPE, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_FRAMED_PROTOCOL, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_FRAMED_IP_ADDRESS, DIAMETER_ADDRESS },
>    { DIAMETER_ATT_FRAMED_IP_NETMASK, DIAMETER_ADDRESS },
>    { DIAMETER_ATT_FRAMED_ROUTING, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_FILTER_ID, DIAMETER_STRING },
>    { DIAMETER_ATT_FRAMED_MTU, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_FRAMED_COMPRESSION, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_LOGIN_IP_HOST, DIAMETER_ADDRESS },
>    { DIAMETER_ATT_LOGIN_SERVICE, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_LOGIN_TCP_PORT, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_OLD_PASSWORD, DIAMETER_STRING },
>    { DIAMETER_ATT_REPLY_MESSAGE, DIAMETER_STRING },
>    { DIAMETER_ATT_CALLBACK_NUMBER, DIAMETER_STRING },
>    { DIAMETER_ATT_CALLBACK_ID, DIAMETER_STRING },
>    { DIAMETER_ATT_FRAMED_ROUTE, DIAMETER_STRING },
>    { DIAMETER_ATT_FRAMED_IPX_NETWORK, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_STATE, DIAMETER_STRING },
>    { DIAMETER_ATT_CLASS, DIAMETER_STRING },
>    { DIAMETER_ATT_SESSION_TIMEOUT, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_IDLE_TIMEOUT, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_TERMINATION_ACTION, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_CALLED_STATION_ID, DIAMETER_STRING },
>    { DIAMETER_ATT_CALLING_STATION_ID, DIAMETER_STRING },
>    { DIAMETER_ATT_NAS_IDENTIFIER, DIAMETER_STRING },
>    { DIAMETER_ATT_PROXY_STATE, DIAMETER_DATA },
>    { DIAMETER_ATT_LOGIN_LAT_SERVICE, DIAMETER_STRING },
>    { DIAMETER_ATT_LOGIN_LAT_NODE, DIAMETER_STRING },
>    { DIAMETER_ATT_LOGIN_LAT_GROUP, DIAMETER_STRING },
>    { DIAMETER_ATT_FRAMED_APPLETALK_LINK, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_FRAMED_APPLETALK_NETWORK, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_FRAMED_APPLETALK_ZONE, DIAMETER_STRING },
>    { DIAMETER_ATT_CHAP_CHALLENGE, DIAMETER_STRING },
>    { DIAMETER_ATT_NAS_PORT_TYPE, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_PORT_LIMIT, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_LOGIN_LAT_PORT, DIAMETER_STRING },
>    { DIAMETER_ATT_TUNNEL_TYPE, DIAMETER_STRING },
>    { DIAMETER_ATT_TUNNEL_MEDIUM_TYPE, DIAMETER_STRING },
>    { DIAMETER_ATT_ACCT_TUNNEL_CLIENT_ENDPOINT, DIAMETER_STRING },
>    { DIAMETER_ATT_TUNNEL_SERVER_ENDPOINT, DIAMETER_STRING },
>    { DIAMETER_ATT_ACCT_TUNNEL_CONNECTION_ID, DIAMETER_STRING },
>    { DIAMETER_ATT_TUNNEL_PASSWORD, DIAMETER_STRING },
>    { DIAMETER_ATT_ARAP_PASSWORD, DIAMETER_STRING },
>    { DIAMETER_ATT_ARAP_FEATURES, DIAMETER_STRING },
>    { DIAMETER_ATT_ARAP_ZONE_ACCESS, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_ARAP_SECURITY, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_ARAP_SECURITY_DATA, DIAMETER_STRING },
>    { DIAMETER_ATT_PASSWORD_RETRY, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_PROMPT, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_CONNECT_INFO, DIAMETER_STRING },
>    { DIAMETER_ATT_CONFIGURATION_TOKEN, DIAMETER_STRING },
>    { DIAMETER_ATT_EAP_MESSAGE, DIAMETER_STRING },
>    { DIAMETER_ATT_SIGNATURE, DIAMETER_STRING },
>    { DIAMETER_ATT_ACCT_STATUS_TYPE, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_ACCT_DELAY_TIME, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_ACCT_INPUT_OCTETS, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_ACCT_OUTPUT_OCTETS, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_ACCT_SESSION_ID, DIAMETER_STRING },
>    { DIAMETER_ATT_ACCT_AUTHENTIC, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_ACCT_SESSION_TIME, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_ACCT_INPUT_PACKETS, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_ACCT_OUTPUT_PACKETS, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_ACCT_TERMINATE_CAUSE, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_ACCT_MULTI_SESSION_ID, DIAMETER_STRING },
>    { DIAMETER_ATT_ACCT_LINK_COUNT, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_MERIT_ENCAPSULATED, DIAMETER_DATA },
>    { DIAMETER_ATT_MERIT_REPLY_IF_ACK_MESSAGE, DIAMETER_STRING },
>    { DIAMETER_ATT_MERIT_LAS_START_TIME, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_MERIT_LAS_CODE, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_MERIT_LAS_DURATION, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_MERIT_LOCAL_DURATION, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_MERIT_HUNTGROUP_SERVICE, DIAMETER_STRING },
>    { DIAMETER_ATT_MERIT_PORT_ENTRY, DIAMETER_DATA },
>    { DIAMETER_ATT_MERIT_PROXY_ACTION, DIAMETER_STRING },
>    { DIAMETER_ATT_MERIT_TOKEN, DIAMETER_STRING },
>    { DIAMETER_ATT_MERIT_OWNERSHIP, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_MERIT_SUBGROUP, DIAMETER_STRING },
>    { DIAMETER_ATT_MERIT_HUNTGROUP_NAME, DIAMETER_STRING },
>    { DIAMETER_ATT_MERIT_USER_ID, DIAMETER_STRING },
>    { DIAMETER_ATT_MERIT_USER_REALM, DIAMETER_STRING },
>    { DIAMETER_ATT_COMMAND_CODE, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_EXTENSION_ID, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_INTEGRITY_CHECK_VALUE, DIAMETER_COMPLEX },
>    { DIAMETER_ATT_ENCRYPTED_PAYLOAD, DIAMETER_DATA },
>    { DIAMETER_ATT_NONCE, DIAMETER_DATA },
>    { DIAMETER_ATT_TIMESTAMP, DIAMETER_TIME },
>    { DIAMETER_ATT_SESSION_ID, DIAMETER_DATA },
>    { DIAMETER_ATT_VENDOR_NAME, DIAMETER_STRING },
>    { DIAMETER_ATT_FIRMWARE_REVISION, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_RESULT_CODE, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_DESTINATION_NAI, DIAMETER_STRING },
>    { DIAMETER_ATT_REBOOT_TYPE, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_REBOOT_TIME, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_FAILED_AVP, DIAMETER_DATA },
>    { DIAMETER_ATT_RECEIVE_WINDOW, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_REDIRECT_HOST, DIAMETER_ADDRESS },
>    { DIAMETER_ATT_IP_PORT, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_ACCOUNTING_RECORD_TYPE, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_ADIF_RECORD, DIAMETER_DATA },
>    { DIAMETER_ATT_ACCOUNTING_INTERIM_INTERVAL, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_ACCOUNTING_DELIVERY_MAX_BATCH, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_ACCOUNTING_DELIVERY_MAX_DELAY, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_ACCOUNTING_RECORD_NUMBER, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_MIP_REGISTRATION_REQUEST, DIAMETER_DATA },
>    { DIAMETER_ATT_MIP_REGISTRATION_REPLY, DIAMETER_DATA },
>    { DIAMETER_ATT_MN_FA_CHALLENGE_LENGTH, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_MN_FA_RESPONSE, DIAMETER_DATA },
>    { DIAMETER_ATT_MOBILE_NODE_ADDRESS, DIAMETER_ADDRESS },
>    { DIAMETER_ATT_HOME_AGENT_ADDRESS, DIAMETER_ADDRESS },
>    { DIAMETER_ATT_PREVIOUS_FA_NAI, DIAMETER_STRING },
>    { DIAMETER_ATT_MN_AAA_SPI, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_FOREIGN_HA_AVAIL, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_MN_TO_FA_KEY, DIAMETER_DATA },
>    { DIAMETER_ATT_MN_TO_HA_KEY, DIAMETER_DATA },
>    { DIAMETER_ATT_FA_TO_MN_KEY, DIAMETER_DATA },
>    { DIAMETER_ATT_FA_TO_HA_KEY, DIAMETER_DATA },
>    { DIAMETER_ATT_HA_TO_MN_KEY, DIAMETER_DATA },
>    { DIAMETER_ATT_HA_TO_FA_KEY, DIAMETER_DATA },
>    { DIAMETER_ATT_FA_MN_PREFERRED_SPI, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_FA_HA_PREFERRED_SPI, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_FILTER_RULE, DIAMETER_STRING },
>    { DIAMETER_ATT_REQUEST_TYPE, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_EAP_PAYLOAD, DIAMETER_DATA },
>    { DIAMETER_ATT_CMS_DATA, DIAMETER_DATA },
>    { DIAMETER_ATT_RES_MGMT_INDEX, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_RES_MGMT_TOKEN, DIAMETER_DATA },
>    { DIAMETER_ATT_SOURCE_HOST, DIAMETER_ADDRESS },
>    { DIAMETER_ATT_DESTINATION_HOST, DIAMETER_ADDRESS },
>    { DIAMETER_ATT_SOURCE_PORT, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_DESTINATION_PORT, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_PROTOCOL, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_RSVP_SERVICE_TYPE, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_TOKEN_BUCKET_RATE, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_TOKEN_BUCKET_SIZE, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_PEAK_DATA_RATE, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_MINIMUM_POLICED_UNIT, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_MAXIMUM_PACKET_SIZE, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_QOS_RATE, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_SLACK_TERM, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_TOS_DS_VALUE, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_INTERFACE_ADDRESS, DIAMETER_ADDRESS },
>    { DIAMETER_ATT_QOS_SERVICE_TYPE, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_VOIP_CALLER, DIAMETER_STRING },
>    { DIAMETER_ATT_VOIP_CALLEE, DIAMETER_STRING },
>    { DIAMETER_ATT_VOIP_CHALLENGE, DIAMETER_DATA },
>    { DIAMETER_ATT_VOIP_RESPONSE, DIAMETER_DATA },
>    { DIAMETER_ATT_VOIP_SESSION_LENGTH, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_COMMENT, DIAMETER_STRING },
>    { DIAMETER_ATT_XVALUE, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_XSTRING, DIAMETER_STRING },
>    { DIAMETER_ATT_AUTHENTICATION_TYPE, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_PROHIBIT, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_USER_CATEGORY, DIAMETER_STRING },
>    { DIAMETER_ATT_GROUP_NAME, DIAMETER_STRING },
>    { DIAMETER_ATT_ENCRYPTED_PASSWORD, DIAMETER_STRING },
>    { DIAMETER_ATT_EXPIRATION, DIAMETER_TIME },
>    { DIAMETER_ATT_PASSWORD, DIAMETER_STRING },
>    { DIAMETER_ATT_SIMULTANEOUS_USE, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_SESSION_LIMIT, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_SERVER_NAME, DIAMETER_STRING },
>    { DIAMETER_ATT_FRAMED_IP_ADDRESS_POOL_NAME, DIAMETER_STRING },
>    { DIAMETER_ATT_SERVICE_CLASS, DIAMETER_STRING },
>    { DIAMETER_ATT_DENY_MESSAGE, DIAMETER_STRING },
>    { DIAMETER_ATT_SOURCE_SUBNET, DIAMETER_ADDRESS },
>    { DIAMETER_ATT_DESTINATION_SUBNET, DIAMETER_ADDRESS },
>    { DIAMETER_ATT_MAX_QOS_RATE, DIAMETER_INTEGER32 },
>    { DIAMETER_ATT_ACCOUNTING_ADIF_RECORD, DIAMETER_DATA },
>    {0, 0}
> };
> 
> 
> 
> 
>         /* Values Structures */
> 
> static value_string diameter_qos_service_type_vals[]={
>    {3, "Labels"},
>    {1, "RSVP"},
>    {2, "TOS"},
>    {0, (char *)NULL}
> };
> 
> static value_string diameter_service_type_vals[]={
>    {5, "Outbound"},
>    {7, "NAS-Prompt"},
>    {3, "Callback-Login"},
>    {6, "Administrative"},
>    {1, "Login"},
>    {4, "Callback-Framed"},
>    {9, "Callback-NAS-Prompt"},
>    {8, "Authenticate-Only"},
>    {2, "Framed"},
>    {0, (char *)NULL}
> };
> 
> static value_string diameter_prohibit_vals[]={
>    {0, "Dumb"},
>    {2, "SLIP"},
>    {1, "PPP"},
>    {3, "Auth-Only"},
>    {255, "All"},
>    {0, (char *)NULL}
> };
> 
> static value_string diameter_prompt_vals[]={
>    {0, "No-Echo"},
>    {1, "Echo"},
>    {0, (char *)NULL}
> };
> 
> static value_string diameter_source_port_vals[]={
>    {23, "ftp"},
>    {0, "*"},
>    {21, "telnet"},
>    {0, (char *)NULL}
> };
> 
> static value_string diameter_nas_port_type_vals[]={
>    {6, "PIAFS"},
>    {9, "X75"},
>    {7, "HDLC-Clear-Channel"},
>    {5, "Virtual"},
>    {2, "ISDN-Sync"},
>    {1, "Sync"},
>    {0, "Async"},
>    {4, "ISDN-Async-v110"},
>    {3, "ISDN-Async-v120"},
>    {8, "X25"},
>    {0, (char *)NULL}
> };
> 
> static value_string diameter_interface_address_vals[]={
>    {0, "Any-Interface"},
>    {0, (char *)NULL}
> };
> 
> static value_string diameter_framed_routing_vals[]={
>    {0, "None"},
>    {1, "Broadcast"},
>    {3, "Broadcast-Listen"},
>    {2, "Listen"},
>    {0, (char *)NULL}
> };
> 
> static value_string diameter_command_code_vals[]={
>    {257, "Device-Reboot-Ind"},
>    {258, "Device-Watchdog-Ind"},
>    {259, "Message-Reject-Ind"},
>    {260, "AA-Mobile-Node-Request"},
>    {261, "AA-Mobile-Node-Answer"},
>    {262, "Home-Agent-MIP-Request"},
>    {263, "Home-Agent-MIP-Answer"},
>    {264, "Mobile-Node-Terminate-Ind"},
>    {265, "AA-Request"},
>    {266, "AA-Answer"},
>    {267, "AA-Challenge-Ind"},
>    {268, "DIAMETER-EAP-Request"},
>    {269, "DIAMETER-EAP-Answer"},
>    {270, "DIAMETER-EAP-Ind"},
>    {271, "Accounting-Request"},
>    {272, "Accounting-Answer"},
>    {273, "Accounting-Poll"},
>    {483, "Accounting-Start-Answer"},
>    {511, "Ping-Req"},
>    {484, "Accounting-Interim-Req"},
>    {480, "Voip-Stop-Req"},
>    {512, "Ping-Answer"},
>    {513, "EAP-Req"},
>    {485, "Accounting-Interim-Answer"},
>    {481, "Voip-Stop-Answer"},
>    {478, "Voip-Start-Req"},
>    {486, "Accounting-Stop-Req"},
>    {514, "EAP-Answer"},
>    {515, "Domain-Discovery-Request"},
>    {479, "Voip-Start-Answer"},
>    {516, "Domain-Discovery-Answer"},
>    {487, "Accounting-Stop-Answer"},
>    {482, "Accounting-Start-Req"},
>    {0, (char *)NULL}
> };
> 
> static value_string diameter_framed_ip_address_vals[]={
>    {-1, "Assigned"},
>    {0, (char *)NULL}
> };
> 
> static value_string diameter_arap_zone_access_vals[]={
>    {4, "Exclusive-Filter"},
>    {2, "Inclusive-Filter"},
>    {1, "Default-Zone"},
>    {0, (char *)NULL}
> };
> 
> static value_string diameter_acct_authentic_vals[]={
>    {1, "RADIUS"},
>    {0, "None"},
>    {2, "Local"},
>    {0, (char *)NULL}
> };
> 
> static value_string diameter_framed_protocol_vals[]={
>    {1, "PPP"},
>    {260, "COMB"},
>    {5, "Xylogics"},
>    {257, "EURAW"},
>    {3, "ARA"},
>    {261, "FR"},
>    {2, "SLIP"},
>    {258, "EUUI"},
>    {4, "Gandalf"},
>    {256, "MPP"},
>    {255, "Ascend-ARA"},
>    {259, "X25"},
>    {0, (char *)NULL}
> };
> 
> static value_string diameter_framed_compression_vals[]={
>    {0, "None"},
>    {1, "Van-Jacobson-TCP-IP"},
>    {2, "IPX-Header-Compression"},
>    {0, (char *)NULL}
> };
> 
> static value_string diameter_authentication_type_vals[]={
>    {10, "File"},
>    {22, "LDAP"},
>    {21, "Slow"},
>    {20, "Blackhole"},
>    {2, "AFS-Krb"},
>    {6, "KCHAP"},
>    {4, "RADIUS"},
>    {13, "ACE"},
>    {9, "Local"},
>    {7, "TACACS"},
>    {0, "None"},
>    {19, "Deny"},
>    {23, "Unassigned"},
>    {8, "Realm"},
>    {1, "Passwd"},
>    {5, "MNET"},
>    {3, "MIT-Krb"},
>    {17, "Oracle"},
>    {1, "Unix-PW"},
>    {16, "ODBC"},
>    {11, "TACPLUS"},
>    {15, "SKEY"},
>    {12, "ARA-DES"},
>    {14, "DEFENDER"},
>    {18, "Allow"},
>    {0, (char *)NULL}
> };
> 
> static value_string diameter_acct_terminate_cause_vals[]={
>    {1, "User-Request"},
>    {2, "Lost-Carrier"},
>    {3, "Lost-Service"},
>    {4, "Idle-Timeout"},
>    {5, "Session-Timeout"},
>    {6, "Admin-Reset"},
>    {7, "Admin-Reboot"},
>    {8, "Port-Error"},
>    {9, "NAS-Error"},
>    {10, "NAS-Request"},
>    {11, "NAS-Reboot"},
>    {12, "Port-Unneeded"},
>    {13, "Port-Preempted"},
>    {14, "Port-Suspended"},
>    {15, "Service-Unavailable"},
>    {16, "Callback"},
>    {17, "User-Error"},
>    {18, "Host-Request"},
>    {0, (char *)NULL}
> };
> 
> static value_string diameter_protocol_vals[]={
>    {65535, "Any"},
>    {17, "UDP"},
>    {1, "ICMP"},
>    {0, "IP"},
>    {6, "TCP"},
>    {0, (char *)NULL}
> };
> 
> static value_string diameter_destination_port_vals[]={
>    {10000, "vic-rsvp"},
>    {23, "ftp"},
>    {0, "*"},
>    {21, "telnet"},
>    {0, (char *)NULL}
> };
> 
> static value_string diameter_termination_action_vals[]={
>    {0, "Default"},
>    {1, "RADIUS-Request"},
>    {0, (char *)NULL}
> };
> 
> static value_string diameter_extension_id_vals[]={
>    {1, "NASREQ"},
>    {2, "Strong-Security"},
>    {4, "Mobile-IP"},
>    {5, "Accounting"},
>    {7, "VOIP"},
>    {8, "EAP"},
>    {555, "Test"},
>    {556, "AccountingV3"},
>    {0, (char *)NULL}
> };
> 
> static value_string diameter_merit_las_code_vals[]={
>    {0, "LAS-Normal"},
>    {1, "LAS-Reject"},
>    {2, "LAS-Cancel"},
>    {3, "LAS-Noconfirm"},
>    {4, "LAS-Overtime"},
>    {5, "LAS-Unknown"},
>    {6, "LAS-Notoken"},
>    {7, "LAS-Notlocal"},
>    {8, "LAS-Suspend"},
>    {9, "LAS-Failed"},
>    {10, "LAS-Authorized"},
>    {11, "LAS-NASreboot"},
>    {12, "LAS-Remote"},
>    {13, "LAS-Duplicate"},
>    {14, "LAS-Collision"},
>    {15, "LAS-Stop"},
>    {0, (char *)NULL}
> };
> 
> static value_string diameter_login_service_vals[]={
>    {0, "Telnet"},
>    {1, "Rlogin"},
>    {2, "TCP-Clear"},
>    {3, "PortMaster"},
>    {4, "LAT"},
>    {5, "X25-PAD"},
>    {6, "X25-T3POS"},
>    {0, (char *)NULL}
> };
> 
> static value_string diameter_rsvp_service_type_vals[]={
>    {1, "RSVP-Controlled-Load"},
>    {2, "RSVP-Guaranteed"},
>    {0, (char *)NULL}
> };
> 
> static value_string diameter_reboot_type_vals[]={
>    {1, "Reboot-Imminent"},
>    {2, "Reboot-Complete"},
>    {0, (char *)NULL}
> };
> 
> static value_string diameter_acct_status_type_vals[]={
>    {1, "Start"},
>    {2, "Stop"},
>    {3, "Alive"},
>    {4, "Modem-Start"},
>    {5, "Modem-Stop"},
>    {6, "Cancel"},
>    {7, "Accounting-On"},
>    {8, "Accounting-Off"},
>    {0, (char *)NULL}
> };
> 
> 
> #endif /* _PACKET_DIAMETER_H */
> 
> -------------------------------end packet-diameter.h-------------------