Skip to content

Diameter Protocol Examples

This page provides practical examples for common Diameter protocol operations.

Authentication Operations

S6a Authentication Info Request (AIR)

// Request authentication vectors from HSS
const airRequest = {
  sessionId: `mme.example.com;${Date.now()}`,
  originHost: 'mme.example.com',
  originRealm: 'example.com',
  destinationRealm: 'hss.example.com',
  userName: '123450000000001', // IMSI
  visitedPLMNId: '234-15',
  authSessionState: 1, // NO_STATE_MAINTAINED
  requestedEUTRANAuthInfo: {
    numberOfRequestedVectors: 1,
    immediateResponsePreferred: true
  }
};

const response = await client.diameter.s6a.sendAIR(airRequest);
console.log('Auth vectors:', response.authenticationInfo.eUtranVector);

S6a Update Location Request (ULR)

// Update subscriber location in HSS
const ulrRequest = {
  sessionId: `mme.example.com;${Date.now()}`,
  originHost: 'mme.example.com',
  originRealm: 'example.com',
  destinationRealm: 'hss.example.com',
  userName: '123450000000001', // IMSI
  ratType: 'EUTRAN',
  ulrFlags: 2, // Skip Subscriber Data
  visitedPLMNId: '234-15',
  authSessionState: 1
};

const response = await client.diameter.s6a.sendULR(ulrRequest);

Charging Operations

Gy Credit Control Request (CCR)

// Initial credit control request
const ccrRequest = {
  sessionId: `pgw.example.com;${Date.now()}`,
  originHost: 'pgw.example.com',
  originRealm: 'example.com',
  destinationRealm: 'ocs.example.com',
  authApplicationId: 4, // Credit Control
  ccRequestType: 'INITIAL_REQUEST',
  ccRequestNumber: 0,
  subscriptionId: [
    {
      subscriptionIdType: 'END_USER_IMSI',
      subscriptionIdData: '123450000000001'
    },
    {
      subscriptionIdType: 'END_USER_E164',
      subscriptionIdData: '447700900123'
    }
  ],
  serviceInformation: {
    psInformation: {
      sgsnAddress: '10.0.0.1',
      pdpAddress: '192.168.1.1',
      calledStationId: 'internet.example.com',
      sgsnMccMnc: '234-15'
    }
  }
};

const response = await client.diameter.gy.sendCCR(ccrRequest);

Ro Online Charging Request

// Voice call charging request
const roRequest = {
  sessionId: `ims.example.com;${Date.now()}`,
  originHost: 'ims.example.com',
  originRealm: 'example.com',
  destinationRealm: 'ocs.example.com',
  authApplicationId: 4,
  serviceContextId: 'voice@3gpp.org',
  ccRequestType: 'INITIAL_REQUEST',
  ccRequestNumber: 0,
  eventTimestamp: new Date(),
  subscriptionId: [
    {
      subscriptionIdType: 'END_USER_E164',
      subscriptionIdData: '447700900123'
    }
  ],
  serviceInformation: {
    imsInformation: {
      callingPartyAddress: 'sip:+447700900123@example.com',
      calledPartyAddress: 'sip:+447700900456@example.com',
      roleOfNode: 'ORIGINATING_ROLE',
      nodeFunction: 'S-CSCF'
    }
  },
  multipleServicesIndicator: 1,
  requestedAction: 'DIRECT_DEBITING'
};

const response = await client.diameter.ro.sendCCR(roRequest);

Policy Control

Gx Credit Control Request

// Policy control request
const gxRequest = {
  sessionId: `pgw.example.com;${Date.now()}`,
  originHost: 'pgw.example.com',
  originRealm: 'example.com',
  destinationRealm: 'pcrf.example.com',
  authApplicationId: 16777238, // 3GPP Gx
  ccRequestType: 'INITIAL_REQUEST',
  ccRequestNumber: 0,
  subscriptionId: [
    {
      subscriptionIdType: 'END_USER_IMSI',
      subscriptionIdData: '123450000000001'
    }
  ],
  supportedFeatures: [
    {
      vendorId: 10415,
      featureListId: 1,
      featureList: 1
    }
  ],
  networkRequestSupport: 1,
  bearerOperation: 'ESTABLISHMENT',
  ipCanType: 'THREEGPP_GPRS',
  ratType: 'EUTRAN',
  defaultEpsBearerQos: {
    qosClassIdentifier: 9,
    allocationRetentionPriority: {
      priorityLevel: 8,
      preEmptionCapability: 1,
      preEmptionVulnerability: 0
    }
  }
};

const response = await client.diameter.gx.sendCCR(gxRequest);

Mobility Management

S6a Cancel Location Request (CLR)

// Cancel location in MME
const clrRequest = {
  sessionId: `hss.example.com;${Date.now()}`,
  originHost: 'hss.example.com',
  originRealm: 'example.com',
  destinationHost: 'mme.example.com',
  destinationRealm: 'example.com',
  authSessionState: 1,
  userName: '123450000000001',
  cancellationType: 'MME_UPDATE_PROCEDURE'
};

await client.diameter.s6a.sendCLR(clrRequest);

Advanced Features

Capability Exchange

// Configure supported features
const capabilityConfig = {
  originHost: 'mme.example.com',
  originRealm: 'example.com',
  vendorId: 10415, // 3GPP
  productName: 'TelcoAPI-Diameter',
  firmwareRevision: 1,
  applications: [
    {
      authApplicationId: 16777251, // S6a
      vendorSpecificApplicationId: {
        vendorId: 10415,
        authApplicationId: 16777251
      }
    }
  ],
  supportedVendorIds: [10415]
};

await client.diameter.configureCapabilities(capabilityConfig);

Load Balancing

// Configure peer load balancing
const loadBalancingConfig = {
  mode: 'round-robin',
  peers: [
    {
      host: 'hss1.example.com',
      port: 3868,
      connectOnDemand: true,
      watchdog: {
        interval: 30000,
        timeout: 10000
      }
    },
    {
      host: 'hss2.example.com',
      port: 3868,
      connectOnDemand: true,
      watchdog: {
        interval: 30000,
        timeout: 10000
      }
    }
  ],
  failover: {
    enabled: true,
    retryCount: 3,
    retryTimeout: 5000
  }
};

await client.diameter.configureLoadBalancing(loadBalancingConfig);

Monitoring

Message Tracing

// Enable detailed message tracing
client.diameter.on('message', (msg) => {
  console.log({
    timestamp: new Date().toISOString(),
    direction: msg.direction,
    command: msg.command,
    applicationId: msg.applicationId,
    hopByHopId: msg.hopByHopId,
    endToEndId: msg.endToEndId,
    avps: msg.avps
  });
});

Performance Metrics

// Monitor performance metrics
client.diameter.on('metrics', (metrics) => {
  console.log({
    timestamp: new Date().toISOString(),
    activeConnections: metrics.activeConnections,
    requestsPerSecond: metrics.requestsPerSecond,
    averageResponseTime: metrics.averageResponseTime,
    failureRate: metrics.failureRate,
    peerStatus: metrics.peerStatus
  });
});

// Monitor peer status
client.diameter.on('peerStatus', (status) => {
  console.log({
    timestamp: new Date().toISOString(),
    peer: status.peer,
    state: status.state,
    lastStateChange: status.lastStateChange,
    connectedDuration: status.connectedDuration
  });
});