Radius Example Ultra Format Definition(4.1)

To simplify the example, only one type of request UDRs is accepted, and one of two types of reply UDRs is sent back. Hence, the requestMessage and responseMessage fields of the Radius UDR will be populated with any of these UDR types:


UDR TypeDescription

requestMessage

  • Access_Request UDR - A login request from a supposed user which must be authenticated against a subscriber database.

responseMessage

  • Access_Accept UDR - Sent back in case the authentication succeeded.

  • Access_Reject UDR - Sent back in case the authentication failed.

The full Ultra Format Definition for the example is not shown, since it is beyond the scope of this manual to handle packet content or UFDL syntax.

Shortened Ultra Format Definition

The format definition is here stored in the Default directory with the name extendedRadius.

external Access_Request_Ext sequential :
      identified_by(Code == 1),
      dynamic_size(RecLength) {
         int       Code:           static_size(1);
         int       Identifier:     static_size(1);
         int       RecLength:      static_size(2),
                                   encode_value(udr_size);
         bytearray Authenticator:  static_size(16);
         switched_set( Type ) {
             int Type:           static_size(1);
             int Length:         static_size(1),
                                   encode_value(case_size);
             case(1) {
               ascii User_Name: dynamic_size( Length - 2 );
             };
             case(2) {
               ascii User_Password: dynamic_size( Length - 2 ),
                                   terminated_by(0);
             };
         // ...
         // Further field definitions.
         // ...
         };
};

external Access_Accept_Ext sequential :
      identified_by(Code == 2),
      dynamic_size(RecLength) {
         // ...
         // Further field definitions.
         // ...
};

external Access_Reject_Ext sequential :
      identified_by(Code == 3),
      dynamic_size(RecLength) {
         // ...
         // Further field definitions.
         // ...
};

internal Vendor_Specific_Int {
      int     Type;
      int     Length;
      int     VendorID;
      int     SubAttrID;
      int     VendorLength;
      int     InfoCode;
      string  Data;
};

in_map Access_Request_Map : external(Access_Request_Ext),
                            target_internal(Access_Request_Int) {
      automatic {
          Vendor_Specific_Ext: internal( Vendor_Specific_Int ),
                        target_internal( Vendor_Specific_TI1 );
      };
};

in_map Access_Accept_InMap: external(Access_Accept_Ext),
           target_internal( Access_Accept_Int ) {
      automatic {
          Vendor_Specific_Ext: internal( Vendor_Specific_Int );
      };
};

out_map Access_Accept_Map : external(Access_Accept_Ext), 
                            internal(Access_Accept_Int) {
      automatic;
};

in_map Access_Reject_InMap: external(Access_Reject_Ext),
           target_internal( Access_Reject_Int ) {
      automatic {
          Vendor_Specific_Ext: internal( Vendor_Specific_Int );
      };
};

out_map Access_Reject_Map : external(Access_Reject_Ext), 
                            internal(Access_Reject_Int) {
      automatic;
};

decoder Request_Dec: in_map(Access_Request_Map);

encoder Response_Enc: out_map(Access_Accept_Map),
                      out_map(Access_Reject_Map);