de.fhg.fokus.diameter.DiameterPeer.data.Codec Class Reference

List of all members.

Detailed Description

This class implements the Coding/Decoding of Diameter AVPs and Messages from/to network data.

It is implemented as conformant to RFC 3588

* The attributes can be accessed directly.

Author:
Dragos Vingarzan vingarzan -at- fokus dot fraunhofer dot de

Definition at line 59 of file Codec.java.

Static Public Member Functions

static AVP decodeAVP (byte[] from, int start) throws AVPDecodeException
 Creates an AVP object by decoding data from a byte array as represented on network.
static byte[] encodeAVP (AVP from)
 Encodes an AVP object into its network representation as a byte array.
static int getEncodedAVPSize (AVP avp)
 Calculates the needed space for an encoded AVP.
static DiameterMessage decodeDiameterMessage (byte[] from, int start) throws DiameterMessageDecodeException
 Creates an DiameterMessage object by decoding data from a byte array as represented on network.
static byte[] encodeDiameterMessage (DiameterMessage from)
 Encodes an DiameterMessage object into its network represantation as a byte array.


Member Function Documentation

static AVP de.fhg.fokus.diameter.DiameterPeer.data.Codec.decodeAVP ( byte[]  from,
int  start 
) throws AVPDecodeException [static]

Creates an AVP object by decoding data from a byte array as represented on network.

Parameters:
from the byte array
start from where to start decoding in the byte array
Returns:
the newly created AVP object
Exceptions:
AVPDecodeException 

Definition at line 69 of file Codec.java.

References de.fhg.fokus.diameter.DiameterPeer.data.AVP.code, de.fhg.fokus.diameter.DiameterPeer.data.AVP.data, de.fhg.fokus.diameter.DiameterPeer.data.AVP.encoded_length, de.fhg.fokus.diameter.DiameterPeer.data.AVP.flag_mandatory, de.fhg.fokus.diameter.DiameterPeer.data.AVP.flag_protected, de.fhg.fokus.diameter.DiameterPeer.data.AVP.flag_vendor_specific, de.fhg.fokus.diameter.DiameterPeer.data.AVP.int_data, and de.fhg.fokus.diameter.DiameterPeer.data.AVP.vendor_id.

00070     {
00071         AVP to = new AVP();
00072         int i,j,len;
00073         
00074         if (from.length-start<8) throw new AVPDecodeException("Data is shorter than AVP Header");
00075         
00076         to.code =   ((int)from[start+0]&0xFF)<<24 |
00077                     ((int)from[start+1]&0xFF)<<16 |
00078                     ((int)from[start+2]&0xFF)<< 8 |
00079                     ((int)from[start+3]&0xFF);
00080         
00081         to.flag_vendor_specific =   (from[start+4] & 0x80)!=0;
00082         to.flag_mandatory =         (from[start+4] & 0x40)!=0;
00083         to.flag_protected =         (from[start+4] & 0x20)!=0;
00084         len =   ((int)from[start+5]&0xFF)<<16 |
00085                 ((int)from[start+6]&0xFF)<< 8 |
00086                 ((int)from[start+7]&0xFF);
00087 
00088         if (to.flag_vendor_specific){
00089             to.vendor_id =  ((int)from[start+ 8]&0xFF)<<24 |
00090                             ((int)from[start+ 9]&0xFF)<<16 |
00091                             ((int)from[start+10]&0xFF)<< 8 |
00092                             ((int)from[start+11]&0xFF);
00093             j = 12;
00094         } else {
00095             to.vendor_id = 0;
00096             j = 8;
00097         }
00098 
00099         if (len>from.length-start) len = from.length-start;
00100         to.data = new byte[len-j];
00101         System.arraycopy(from,start+j,to.data,0,len-j);
00102         
00103         if (len!=0)
00104         for(i=0;i<4&&i<len-j;i++)
00105             to.int_data = (to.int_data<<8)| ((byte) to.data[i]&0xFF);
00106         
00107         to.encoded_length = len;
00108         if (to.encoded_length%4!=0) 
00109             to.encoded_length = (to.encoded_length/4+1)*4; 
00110         
00111         return to;
00112     }

static byte [] de.fhg.fokus.diameter.DiameterPeer.data.Codec.encodeAVP ( AVP  from  )  [static]

Encodes an AVP object into its network representation as a byte array.

Parameters:
from the AVP object to encode
Returns:
the byte array in network ready format

Definition at line 119 of file Codec.java.

References de.fhg.fokus.diameter.DiameterPeer.data.AVP.code, de.fhg.fokus.diameter.DiameterPeer.data.AVP.data, de.fhg.fokus.diameter.DiameterPeer.data.AVP.flag_mandatory, de.fhg.fokus.diameter.DiameterPeer.data.AVP.flag_protected, de.fhg.fokus.diameter.DiameterPeer.data.AVP.flag_vendor_specific, de.fhg.fokus.diameter.DiameterPeer.data.AVP.group(), de.fhg.fokus.diameter.DiameterPeer.data.AVP.is_ungrouped, and de.fhg.fokus.diameter.DiameterPeer.data.AVP.vendor_id.

00120     {
00121         byte[] to = null;
00122         int total_len,send_len;
00123         int j;
00124 
00125         /* if it is ungrouped, we group it first */
00126         if (from.is_ungrouped)
00127             from.group();
00128         
00129         total_len=4+4+from.data.length;
00130         
00131         if (from.flag_vendor_specific) total_len+=4;
00132         send_len = total_len;
00133         if (total_len%4!=0) 
00134             total_len = (total_len/4+1)*4; 
00135         to = new byte[total_len];
00136         Arrays.fill(to,(byte)0);
00137         
00138         to[0] = (byte) ((from.code >> 24) & 0xFF);
00139         to[1] = (byte) ((from.code >> 16) & 0xFF);
00140         to[2] = (byte) ((from.code >>  8) & 0xFF);
00141         to[3] = (byte) ( from.code        & 0xFF);
00142         
00143         if (from.flag_vendor_specific) to[4] |= 0x80;
00144         if (from.flag_mandatory) to[4] |= 0x40;
00145         if (from.flag_protected) to[4] |= 0x20;
00146         to[5] = (byte) ((send_len >> 16) & 0xFF);
00147         to[6] = (byte) ((send_len >>  8) & 0xFF);
00148         to[7] = (byte) ( send_len        & 0xFF);
00149         
00150         if (from.flag_vendor_specific){
00151             to[ 8] = (byte) ((from.vendor_id >> 24) & 0xFF);
00152             to[ 9] = (byte) ((from.vendor_id >> 16) & 0xFF);
00153             to[10] = (byte) ((from.vendor_id >>  8) & 0xFF);
00154             to[11] = (byte) ( from.vendor_id        & 0xFF);
00155             j = 12;
00156         }
00157         else j = 8;
00158         
00159         if (from.data.length!=0)
00160             System.arraycopy(from.data,0,to,j,from.data.length);
00161     
00162         return to;
00163     }

static int de.fhg.fokus.diameter.DiameterPeer.data.Codec.getEncodedAVPSize ( AVP  avp  )  [static]

Calculates the needed space for an encoded AVP.

Parameters:
avp 
Returns:
The size of the AVP.

Definition at line 171 of file Codec.java.

References de.fhg.fokus.diameter.DiameterPeer.data.AVP.childs, de.fhg.fokus.diameter.DiameterPeer.data.AVP.data, de.fhg.fokus.diameter.DiameterPeer.data.AVP.flag_vendor_specific, and de.fhg.fokus.diameter.DiameterPeer.data.AVP.is_ungrouped.

00172     {
00173         AVP avp2;
00174         int datalen=0;
00175         int i;
00176         if (avp.is_ungrouped&&avp.childs!=null){
00177             for(i=0;i<avp.childs.size();i++){
00178                 avp2 = (AVP) avp.childs.get(i);
00179                 datalen += getEncodedAVPSize(avp2);
00180             }   
00181         }else{
00182             datalen += avp.data.length;
00183             if (datalen%4!=0) datalen = (datalen/4+1)*4;
00184         }
00185         if (avp.flag_vendor_specific) return 12+datalen;
00186         else return 8+datalen;
00187     }

static DiameterMessage de.fhg.fokus.diameter.DiameterPeer.data.Codec.decodeDiameterMessage ( byte[]  from,
int  start 
) throws DiameterMessageDecodeException [static]

Creates an DiameterMessage object by decoding data from a byte array as represented on network.

Parameters:
from the byte array
start from where to start decoding in the byte array
Returns:
the newly created DiameterMessage object
Exceptions:
DiameterMessageDecodeException 

Definition at line 197 of file Codec.java.

References de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.applicationID, de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.avps, de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.commandCode, de.fhg.fokus.diameter.DiameterPeer.data.AVP.encoded_length, de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.endToEndID, de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.flagError, de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.flagProxiable, de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.flagRequest, de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.flagRetransmission, de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.hopByHopID, and de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.version.

00198     {
00199         DiameterMessage to = new DiameterMessage();
00200         int i,len;
00201         AVP avp;
00202         
00203         if (from.length-start<20) throw new DiameterMessageDecodeException("Data is shorter than Diameter Message Header");
00204         
00205         to.version = ((int)from[start+0]&0xFF);
00206         if (to.version!=1) throw new DiameterMessageDecodeException("Unknown Diameter Message Version "+to.version);
00207         
00208         len =   ((int)from[start+ 1]&0xFF)<<16 |
00209                 ((int)from[start+ 2]&0xFF)<< 8 |
00210                 ((int)from[start+ 3]&0xFF);
00211         
00212         if (len>from.length-start) len=from.length-start;
00213         
00214         to.flagRequest =            (from[start+4] & 0x80)!=0;
00215         to.flagProxiable =      (from[start+4] & 0x40)!=0;
00216         to.flagError =          (from[start+4] & 0x20)!=0;
00217         to.flagRetransmission =     (from[start+4] & 0x10)!=0;
00218 
00219         to.commandCode =    ((int)from[start+ 5]&0xFF)<<16 |
00220                             ((int)from[start+ 6]&0xFF)<< 8 |
00221                             ((int)from[start+ 7]&0xFF);
00222         
00223         to.applicationID =  ((int)from[start+ 8]&0xFF)<<24 |
00224                             ((int)from[start+ 9]&0xFF)<<16 |
00225                             ((int)from[start+10]&0xFF)<< 8 |
00226                             ((int)from[start+11]&0xFF);
00227 
00228         to.hopByHopID = ((int)from[start+12]&0xFF)<<24 |
00229                             ((int)from[start+13]&0xFF)<<16 |
00230                             ((int)from[start+14]&0xFF)<< 8 |
00231                             ((int)from[start+15]&0xFF);
00232 
00233         to.endToEndID = ((int)from[start+16]&0xFF)<<24 |
00234                             ((int)from[start+17]&0xFF)<<16 |
00235                             ((int)from[start+18]&0xFF)<< 8 |
00236                             ((int)from[start+19]&0xFF);
00237 
00238         i = start+20;
00239         while (i<start+len){
00240             try {
00241                 avp = Codec.decodeAVP(from,i);
00242             } catch (AVPDecodeException e) {
00243                 e.printStackTrace();
00244                 throw new DiameterMessageDecodeException(e.getMessage());
00245             }
00246             to.avps.add(avp);
00247             i+=avp.encoded_length;
00248         }       
00249         return to;
00250     }

static byte [] de.fhg.fokus.diameter.DiameterPeer.data.Codec.encodeDiameterMessage ( DiameterMessage  from  )  [static]

Encodes an DiameterMessage object into its network represantation as a byte array.

Parameters:
from the Diameter object to encode
Returns:
the byte array in network ready format

Definition at line 257 of file Codec.java.

References de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.applicationID, de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.avps, de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.commandCode, de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.endToEndID, de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.flagError, de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.flagProxiable, de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.flagRequest, de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.flagRetransmission, de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.hopByHopID, and de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.version.

00258     {
00259         byte[] to = null;
00260         int total_len;
00261         int i,len=0;
00262         Vector<byte[]> temp;
00263         byte[] t;
00264         
00265         temp = new Vector<byte[]>();
00266         for(i=0;i<from.avps.size();i++){
00267             t = Codec.encodeAVP((AVP)from.avps.get(i));
00268             temp.add(t);
00269             len += t.length;
00270         }
00271         total_len=20+len;
00272         
00273         to = new byte[total_len];
00274         Arrays.fill(to,(byte)0);
00275 
00276         to[0] = (byte) ( from.version     & 0xFF);
00277         to[1] = (byte) ((total_len >> 16) & 0xFF);
00278         to[2] = (byte) ((total_len >>  8) & 0xFF);
00279         to[3] = (byte) ( total_len        & 0xFF);
00280         
00281         if (from.flagRequest)           to[4] |= 0x80;
00282         if (from.flagProxiable)         to[4] |= 0x40;
00283         if (from.flagError)             to[4] |= 0x20;
00284         if (from.flagRetransmission)    to[4] |= 0x10;
00285         to[5] = (byte) ((from.commandCode >> 16) & 0xFF);
00286         to[6] = (byte) ((from.commandCode >>  8) & 0xFF);
00287         to[7] = (byte) ( from.commandCode        & 0xFF);
00288         
00289         to[ 8] = (byte) ((from.applicationID >> 24) & 0xFF);
00290         to[ 9] = (byte) ((from.applicationID >> 16) & 0xFF);
00291         to[10] = (byte) ((from.applicationID >>  8) & 0xFF);
00292         to[11] = (byte) ( from.applicationID        & 0xFF);        
00293 
00294         to[12] = (byte) ((from.hopByHopID >> 24) & 0xFF);
00295         to[13] = (byte) ((from.hopByHopID >> 16) & 0xFF);
00296         to[14] = (byte) ((from.hopByHopID >>  8) & 0xFF);
00297         to[15] = (byte) ( from.hopByHopID        & 0xFF);       
00298 
00299         to[16] = (byte) ((from.endToEndID >> 24) & 0xFF);
00300         to[17] = (byte) ((from.endToEndID >> 16) & 0xFF);
00301         to[18] = (byte) ((from.endToEndID >>  8) & 0xFF);
00302         to[19] = (byte) ( from.endToEndID        & 0xFF);       
00303 
00304         len = 20;
00305         for(i=0;i<temp.size();i++){
00306             t = temp.get(i);
00307             System.arraycopy(t,0,to,len,t.length);
00308             len += t.length;
00309         }       
00310     
00311         return to;
00312     }


The documentation for this class was generated from the following file:
Generated on Tue Jul 29 04:09:50 2008 for Open IMS Core JavaDiameterPeer by  doxygen 1.5.2