Documentation ¶
Overview ¶
Shared diameter settings across magma cloud
Index ¶
- Constants
- func DecodeSessionID(diamSid string) string
- func EncodePLMNID(plmn string) ([]byte, error)
- func EncodeSessionID(diamIdentity, sid string) string
- func EncodeUserLocation(plmn string, tai uint16, eci uint32) ([]byte, error)
- func ExtractImsiFromSessionID(diamSid string) (string, error)
- func GenSessionID(identity, protocol string) string
- func GenSessionIDOpt(identity, protocol, opt string) string
- func GenSessionIdImsi(identity, protocol, imsi string) string
- func GetBoolValueOrEnv(flagName string, envVariable string, defaultValue bool, idx ...int) bool
- func GetValue(flagName, defaultValue string) string
- func GetValueOrEnv(flagName, envVariable, defaultValue string, idx ...int) string
- func GetValueUint64(flagName string, defaultValue uint64) uint64
- func NewProxiableRequest(cmd uint32, appid uint32, dictionary *dict.Parser) *diam.Message
- func ParseDiamSessionID(sessionID string) (host, rnd1, rnd2, imsi, bearrerId string)
- func TranslateDiamResultCode(diamResult uint32) error
- type ASA
- type ASR
- type AnswerHandler
- type Client
- func (client *Client) AddOriginAVPsToMessage(message *diam.Message) *diam.Message
- func (client *Client) BeginConnection(server *DiameterServerConfig) error
- func (client *Client) DisableConnectionCreation(period time.Duration)
- func (client *Client) EnableConnectionCreation()
- func (client *Client) IgnoreAnswer(key interface{})
- func (c *Client) OriginHost() string
- func (c *Client) OriginRealm() string
- func (c *Client) OriginStateID() uint32
- func (client *Client) RegisterAnswerHandler(command uint32, handler AnswerHandler)
- func (client *Client) RegisterAnswerHandlerForAppID(command uint32, appID uint32, handler AnswerHandler)
- func (client *Client) RegisterHandler(command uint32, appID uint32, request bool, handler diam.Handler)
- func (client *Client) RegisterRequestHandlerForAppID(command uint32, appID uint32, handler diam.HandlerFunc)
- func (client *Client) Retries() uint
- func (client *Client) SendRequest(server *DiameterServerConfig, done chan interface{}, message *diam.Message, ...) error
- func (c *Client) ServiceContextId() string
- type Connection
- type ConnectionManager
- func (cm *ConnectionManager) AddExistingConnection(conn diam.Conn, client *sm.Client, server *DiameterServerConfig) error
- func (cm *ConnectionManager) CleanupAllConnections()
- func (cm *ConnectionManager) DisableFor(period time.Duration)
- func (cm *ConnectionManager) Enable()
- func (cm *ConnectionManager) GetConnection(client *sm.Client, server *DiameterServerConfig) (*Connection, error)
- type DiameterClientConfig
- func (srcCfg *DiameterClientConfig) FillInDefaults() *DiameterClientConfig
- func (client *DiameterClientConfig) GenSessionID(protocol string) string
- func (client *DiameterClientConfig) GenSessionIDOpt(protocol, opt string) string
- func (client *DiameterClientConfig) GenSessionIdImsi(protocol, imsi string) string
- func (cfg *DiameterClientConfig) Validate() error
- type DiameterServerConfig
- type DiameterServerConnConfig
- type KeyAndAnswer
- type RequestTracker
Constants ¶
const ( DiamHost = "magma-fedgw.magma.com" DiamRealm = "magma.com" DiamProductName = "magma" Vendor3GPP = uint32(10415) // diameter code for a 3GPP application AddrFlag = "addr" NetworkFlag = "network" HostFlag = "host" RealmFlag = "realm" ProductFlag = "product" LocalAddrFlag = "laddr" DestHostFlag = "dest_host" DestRealmFlag = "dest_realm" DisableDestHostFlag = "disable_dest_host" OverwriteDestHostFlag = "overwrite_dest_host" DefaultWatchdogIntervalSeconds = 3 )
const ( // SuccessCode is the result code returned from a successful diameter call SuccessCode = 2001 LimitedSuccessCode = 2002 DiameterRatingFailed = 5031 DiameterCreditLimitReached = 4012 )
const ( ServiceContextIDDefault = "32251@3gpp.org" // Packet-Switch service context ServiceIDDefault = 0 )
Variables ¶
This section is empty.
Functions ¶
func DecodeSessionID ¶
DecodeSessionID extracts and returns session ID if available, or original diam SessionId (diamSid) string otherwise Input: OriginHost;rand1#;rand2#;IMSIxyz Returns: IMSIxyz-rand# rand# = rand1# + rand2#, where + means concatenation
func EncodePLMNID ¶
EncodePLMNID encodes a PLMN into its byte encoding See https://www.arib.or.jp/english/html/overview/doc/STD-T63v10_70/5_Appendix/Rel11/29/29272-bb0.pdf#page=73
func EncodeSessionID ¶
EncodeSessionID encodes SessionID in rfc6733 compliant form: <DiameterIdentity>;<high 32 bits>;<low 32 bits>[;<optional value>] OriginHost/Realm;rand#;rand#;IMSIxyz
func EncodeUserLocation ¶
EncodeUserLocation encodes a PLMN ID, TAI, and ECI into the correct encoding for 3GPP-User-Location-Info. Normally this value is provided by the EPC, but this function can be used for command lines. Encoding defined in 3GPP 29.061 Section 16.4.7.2
func ExtractImsiFromSessionID ¶
ExtractImsiFromSessionID extracts and returns IMSI (without 'IMSI' prefix) from diameter session ID if available, or original diam SessionId (diamSid) string otherwise Input: OriginHost;[rand1#;rand2#;]IMSIxyz Returns: xyz
func GenSessionID ¶
GenSessionID generates rfc6733 compliant session ID:
<DiameterIdentity>;<high 32 bits>;<low 32 bits>[;<optional value>]
Where <optional value> is base 16 uint32 random number
func GenSessionIDOpt ¶
GenSessionIDOpt generates rfc6733 compliant session ID:
<DiameterIdentity>;<high 32 bits>;<low 32 bits>[;<optional value>]
func GenSessionIdImsi ¶
GenSessionIDOpt generates rfc6733 compliant session ID:
<DiameterIdentity>;<high 32 bits>;<low 32 bits>;IMSI<imsi value>
func GetBoolValueOrEnv ¶
GetBoolValueOrEnv returns value of the flagValue if it exists, then the environment variable if it exists, or defaultValue if not. If idx parameter is passed, then if that idx > 1 defaultValue will be returned. Note in case of many idx are passed, only the first idx will be checked.
func GetValueOrEnv ¶
GetValueOrEnv returns value of the flagValue if it exists, then the environment variable if it exists, or defaultValue if not. If idx parameter is passed, then if that idx > 1 defaultValue will be returned. Note in case of many idx are passed, only the first idx will be checked.
func GetValueUint64 ¶
GetValueUint64 returns value of the flagValue if it exists, or defaultValue if not
func NewProxiableRequest ¶
NewProxiableRequest creates a request with the proxy bit set, meaning that a diameter server can relay the request to another server. This is required by certain servers
func ParseDiamSessionID ¶
ParseDiamSessionID parses given session ID in the form of: // OriginHost;req#;rand#;IMSIxyz_BearerId and returns OriginHost, Request Number, Rand, IMSI (without prefix) and bearrerId if present
func TranslateDiamResultCode ¶
TranslateDiamResultCode maps Diameter Result Codes (both Base and Experimental) to GRPC Status Error. Diam success codes result in a nil error returned
Types ¶
type ASA ¶
Abort-Session Answer (ASA)
< Session-Id > { Origin-Host } { Origin-Realm } [ Result-Code ] [ Experimental-Result ] [ Origin-State-Id ] [ Error-Message ] [ Error-Reporting-Host ] *[ Failed-AVP ] *[ Redirected-Host ] [ Redirected-Host-Usage ] [ Redirected-Max-Cache-Time ] *[ Proxy-Info ] *[ AVP ]
type ASR ¶
type ASR struct { SessionID string `avp:"Session-Id"` OriginHost datatype.DiameterIdentity `avp:"Origin-Host"` OriginRealm datatype.DiameterIdentity `avp:"Origin-Realm"` DestinationHost datatype.DiameterIdentity `avp:"Destination-Host"` DestinationRealm datatype.DiameterIdentity `avp:"Destination-Realm"` AuthApplicationId datatype.Unsigned32 `avp:"Auth-Application-Id"` UserName datatype.UTF8String `avp:"User-Name"` OriginStateId datatype.Unsigned32 `avp:"Origin-State-Id"` }
https://tools.ietf.org/html/rfc4005#page-16
Abort-Session Request (ASR)
< Session-Id > { Origin-Host } { Origin-Realm } { Destination-Realm } { Destination-Host } { Auth-Application-Id } [ User-Name ] [ Origin-State-Id ] * [ Proxy-Info ] * [ Route-Record ] * [ AVP ]
type AnswerHandler ¶
type AnswerHandler func(message *diam.Message) KeyAndAnswer
AnswerHandler is called when an answer is received. The handler is responsible for parsing a raw message into a usable message and then returning it. The return value is used to untrack the request and send the answer to the given channel Input: message received Output: struct containing the related request key and parsed answer
type Client ¶
type Client struct {
// contains filtered or unexported fields
}
Client is a wrapper around a sm.Client that handles connection management, request tracking, and configuration. Using this, the application should not know anything about the underlying diameter connection
func NewClient ¶
func NewClient(clientCfg *DiameterClientConfig) *Client
NewClient creates a new client based on the config passed. Input: clientCfg containing relavent diameter settings
func (*Client) AddOriginAVPsToMessage ¶
AddOriginAVPsToMessage adds the host/realm to the message
func (*Client) BeginConnection ¶
func (client *Client) BeginConnection(server *DiameterServerConfig) error
BeginConnection attempts to begin a new connection with the server
func (*Client) DisableConnectionCreation ¶
DisableConnectionCreation closes all existing connections and disables the connection manager to create new connections for the period of time specified
func (*Client) EnableConnectionCreation ¶
func (client *Client) EnableConnectionCreation()
EnableConnectionCreation enables the connection manager to create new connections
func (*Client) IgnoreAnswer ¶
func (client *Client) IgnoreAnswer(key interface{})
IgnoreAnswer untracks a request if the application, say, times out Input: key identifying request
func (*Client) OriginHost ¶
OriginHost returns client's config Host
func (*Client) OriginRealm ¶
OriginRealm returns client's config Realm
func (*Client) OriginStateID ¶
OriginStateID returns client's Origin-State-ID
func (*Client) RegisterAnswerHandler ¶
func (client *Client) RegisterAnswerHandler(command uint32, handler AnswerHandler)
RegisterAnswerHandler registers a function to be called when an answer message matching the given command is received. The AnswerHandler is responsible for parsing the diameter message into something usable and extracting a key to identify the corresponding request Input: command - the diameter code for the command (like diam.CreditControl)
handler - the function to call when a message is received
func (*Client) RegisterAnswerHandlerForAppID ¶
func (client *Client) RegisterAnswerHandlerForAppID(command uint32, appID uint32, handler AnswerHandler)
RegisterAnswerHandlerForAppID registers a function to be called when an answer message matching the given command is received. The AnswerHandler is responsible for parsing the diameter message into something usable and extracting a key to identify the corresponding request Input: command - the diameter code for the command (like diam.CreditControl)
handler - the function to call when a message is received
func (*Client) RegisterHandler ¶
func (client *Client) RegisterHandler(command uint32, appID uint32, request bool, handler diam.Handler)
RegisterHandler registers diameter handler to be used for given command and app
func (*Client) RegisterRequestHandlerForAppID ¶
func (client *Client) RegisterRequestHandlerForAppID(command uint32, appID uint32, handler diam.HandlerFunc)
RegisterRequestHandlerForAppID registers a function to be called when a request message matching the command is received. The RequestHandler is responsible for parsing the diameter message, taking any actions required, and sending a response back through the responder argument of the handler. This responder is given so that the response can happen asynchonously in another go routine. Input: command - the diameter code for the command (like diam.CreditControl)
handler - the function to call when a message is received
func (*Client) SendRequest ¶
func (client *Client) SendRequest( server *DiameterServerConfig, done chan interface{}, message *diam.Message, key interface{}, ) error
SendRequest sends a diameter request message to the given server and sends back the answer on the given channel. A key is required to identify the corresponding answer. Additionally, SendRequest will add the OriginHost/Realm AVPs to the message because they are mandatory for all requests Input: server - cfg containing info on what server to send to
done - channel to send the answer to when received message - request to send key - something to uniquely identify the request
Output: error if message sending failed, nil otherwise
func (*Client) ServiceContextId ¶
ServiceContextId returns client's config ServiceContextId
type Connection ¶
type Connection struct {
// contains filtered or unexported fields
}
Connection is representing a diameter connection that you can send messages to and get metadata from (for building AVPs)
func (*Connection) SendAnswer ¶
func (c *Connection) SendAnswer(message *diam.Message, retryCount uint) error
func (*Connection) SendRequest ¶
func (c *Connection) SendRequest(message *diam.Message, retryCount uint) error
func (*Connection) SendRequestToServer ¶
func (c *Connection) SendRequestToServer(message *diam.Message, retryCount uint, server *DiameterServerConfig) error
type ConnectionManager ¶
type ConnectionManager struct {
// contains filtered or unexported fields
}
ConnectionManager holds a map of connections keyed by the server ip/protocol pair
func NewConnectionManager ¶
func NewConnectionManager() *ConnectionManager
func (*ConnectionManager) AddExistingConnection ¶
func (cm *ConnectionManager) AddExistingConnection(conn diam.Conn, client *sm.Client, server *DiameterServerConfig) error
AddExistingConnection adds an already in-use connection to the connection manager. This is used for servers that need to maintain a connection mapping to clients If a connection already exists for the provided server config, update the connection manager with the new connection. This is threadsafe
func (*ConnectionManager) CleanupAllConnections ¶
func (cm *ConnectionManager) CleanupAllConnections()
CleanupAllConnections does exactly that
func (*ConnectionManager) DisableFor ¶
func (cm *ConnectionManager) DisableFor(period time.Duration)
DisableFor - cleans up all existing connections & disables new connection creations for given duration
func (*ConnectionManager) Enable ¶
func (cm *ConnectionManager) Enable()
Enable - enables new connection creations
func (*ConnectionManager) GetConnection ¶
func (cm *ConnectionManager) GetConnection(client *sm.Client, server *DiameterServerConfig) (*Connection, error)
GetConnection either gets the existing connection or creates a new one if it doesn't exist. This is threadsafe
type DiameterClientConfig ¶
type DiameterClientConfig struct { Host string // diameter host Realm string // diameter realm ProductName string AppID uint32 AuthAppID uint32 Retransmits uint WatchdogInterval uint RetryCount uint // number of times to reconnect after connection lost SupportedVendorIDs string ServiceContextId string }
DiameterClientConfig holds information for connecting with a diameter server
func (*DiameterClientConfig) FillInDefaults ¶
func (srcCfg *DiameterClientConfig) FillInDefaults() *DiameterClientConfig
func (*DiameterClientConfig) GenSessionID ¶
func (client *DiameterClientConfig) GenSessionID(protocol string) string
GenSessionID generates rfc6733 compliant session ID:
<DiameterIdentity>;<high 32 bits>;<low 32 bits>[;<optional value>]
Where <DiameterIdentity> is client.Host|ProductName-protocol
and <optional value> is base 16 uint32 random number
func (*DiameterClientConfig) GenSessionIDOpt ¶
func (client *DiameterClientConfig) GenSessionIDOpt(protocol, opt string) string
GenSessionIDOpt generates rfc6733 compliant session ID:
<DiameterIdentity>;<high 32 bits>;<low 32 bits>[;<optional value>]
Where <DiameterIdentity> is client.Host|ProductName-protocol
func (*DiameterClientConfig) GenSessionIdImsi ¶
func (client *DiameterClientConfig) GenSessionIdImsi(protocol, imsi string) string
GenSessionIdImsi generates rfc6733 compliant session ID:
<DiameterIdentity>;<high 32 bits>;<low 32 bits>;IMSI<imsi>]
Where <DiameterIdentity> is client.Host|ProductName-protocol
and <optional value> is base 16 uint32 random number
func (*DiameterClientConfig) Validate ¶
func (cfg *DiameterClientConfig) Validate() error
type DiameterServerConfig ¶
type DiameterServerConfig struct { DiameterServerConnConfig DestHost string DestRealm string DisableDestHost bool OverwriteDestHost bool }
func (*DiameterServerConfig) Validate ¶
func (cfg *DiameterServerConfig) Validate() error
type KeyAndAnswer ¶
type KeyAndAnswer struct{ Answer, Key interface{} }
KeyAndAnswer wraps the information to be returned to an AnswerHandler. When an answer is received, the handler should return a parsed answer (struct form) and the key that maps it to a request
type RequestTracker ¶
type RequestTracker struct {
// contains filtered or unexported fields
}
RequestTracker stores a mapping of keys to channels and is intended to be used to store unique identifiers of requests and channels to send answers to after they are received. The methods are thread safe and do not close the channel after use
func NewRequestTracker ¶
func NewRequestTracker() *RequestTracker
func (*RequestTracker) DeregisterRequest ¶
func (rt *RequestTracker) DeregisterRequest(key interface{}) chan interface{}
DeregisterRequest finds the channel in the map, removes and returns it. If no channel is found, nil is returned
func (*RequestTracker) RegisterRequest ¶
func (rt *RequestTracker) RegisterRequest(key interface{}, ch chan interface{}) chan interface{}
RegisterRequest tracks a request in the map and returns the channel stored