Documentation ¶
Overview ¶
Package v1 provides the simple and painless handling of GTPv1-C and GTPv1-U protocol in pure Golang.
Please see README.md for detailed usage of the APIs provided by this package.
Index ¶
- Constants
- Variables
- func Decapsulate(b []byte) (uint32, []byte, error)
- func DisableLogging()
- func EnableLogging(l *log.Logger)
- func Encapsulate(teid uint32, payload []byte) *messages.TPDU
- func SetLogger(l *log.Logger)
- type Conn
- type ErrorIndicatedError
- type HandlerFunc
- type Relay
- type Role
- type UPlaneConn
- func (u *UPlaneConn) AddHandler(msgType uint8, fn HandlerFunc)
- func (u *UPlaneConn) AddHandlers(funcs map[uint8]HandlerFunc)
- func (u *UPlaneConn) AddTunnel(peerIP, msIP net.IP, otei, itei uint32) error
- func (u *UPlaneConn) AddTunnelOverride(peerIP, msIP net.IP, otei, itei uint32) error
- func (u *UPlaneConn) Close() error
- func (u *UPlaneConn) CloseRelay(teidIn uint32) error
- func (u *UPlaneConn) DelTunnelByITEI(itei uint32) error
- func (u *UPlaneConn) DelTunnelByMSAddress(msIP net.IP) error
- func (u *UPlaneConn) EchoRequest(raddr net.Addr) error
- func (u *UPlaneConn) EchoResponse(raddr net.Addr) error
- func (u *UPlaneConn) EnableKernelGTP(devname string, role Role) error
- func (u *UPlaneConn) ErrorIndication(raddr net.Addr, received messages.Message) error
- func (u *UPlaneConn) ListenAndServe(ctx context.Context) error
- func (u *UPlaneConn) LocalAddr() net.Addr
- func (u *UPlaneConn) NewFTEID(ifType uint8, v4, v6 string) (fteidIE *v2ies.IE)
- func (u *UPlaneConn) ReadFrom(p []byte) (n int, addr net.Addr, err error)
- func (u *UPlaneConn) ReadFromGTP(p []byte) (n int, addr net.Addr, teid uint32, err error)
- func (u *UPlaneConn) RelayTo(c *UPlaneConn, teidIn, teidOut uint32, raddr net.Addr) error
- func (u *UPlaneConn) RespondTo(raddr net.Addr, received, toBeSent messages.Message) error
- func (u *UPlaneConn) Restarts() uint8
- func (u *UPlaneConn) SetDeadline(t time.Time) error
- func (u *UPlaneConn) SetReadDeadline(t time.Time) error
- func (u *UPlaneConn) SetWriteDeadline(t time.Time) error
- func (u *UPlaneConn) WriteTo(p []byte, addr net.Addr) (n int, err error)
- func (u *UPlaneConn) WriteToGTP(teid uint32, p []byte, addr net.Addr) (n int, err error)
Constants ¶
const ( GTPCPort = ":2123" GTPUPort = ":2152" )
Registered UDP ports
const ( ReqCauseRequestIMSI uint8 = iota ReqCauseRequestIMEI ReqCauseRequestIMSIAndIMEI ReqCauseNoIdentityNeeded ReqCauseMSRefuses ReqCauseMSIsNotGPRSResponding ReqCauseReactivationRequested ReqCausePDPAddressInactivityTimerExpires ReqCauseNetworkFailure ReqCauseQoSParameterMismatch )
Cause definitions.
const ( ResCauseRequestAccepted uint8 = iota + 128 ResCauseNewPDPTypeDueToNetworkPreference ResCauseNewPDPTypeDueToSingleAddressBearerOnly )
Cause definitions.
const ( ResCauseNonExistent uint8 = iota + 192 ResCauseInvalidMessageFormat ResCauseIMSIIMEINotKnown ResCauseMSIsGPRSDetached ResCauseMSIsNotGPRSResponding ResCauseMSRefuses ResCauseVersionNotSupported ResCauseNoResourcesAvailable ResCauseServiceNotSupported ResCauseMandatoryIEIncorrect ResCauseMandatoryIEMissing ResCauseOptionalIEIncorrect ResCauseSystemFailure ResCauseRoamingRestriction ResCausePTMSISignatureMismatch ResCauseGPRSConnectionSuspended ResCauseAuthenticationFailure ResCauseUserAuthenticationFailed ResCauseContextNotFound ResCauseAllDynamicPDPAddressesAreOccupied ResCauseNoMemoryIsAvailable ResCauseRelocationFailure ResCauseUnknownMandatoryExtensionHeader ResCauseSemanticErrorInTheTFTOperation ResCauseSyntacticErrorInTheTFTOperation ResCauseSemanticErrorsInPacketFilter )
Cause definitions.
const ( SelectionModeMSorNetworkProvidedAPNSubscribedVerified uint8 = iota | 0xf0 SelectionModeMSProvidedAPNSubscriptionNotVerified SelectionModeNetworkProvidedAPNSubscriptionNotVerified )
SelectionMode definitions.
const ( PDPTypeETSI uint8 = iota | 0xf0 PDPTypeIETF )
PDP Type Organization definitions.
const ( ProtoIDLCP uint16 = 0xc021 ProtoIDPAP uint16 = 0xc023 ProtoIDCHAP uint16 = 0xc223 ProtoIDIPCP uint16 = 0x8021 )
Protocol ID definitions. For more identifiers, see RFC 3232.
const ( ContIDPCSCFIPv6AddressRequest uint16 ContIDIMCNSubsystemSignalingFlag ContIDDNSServerIPv6AddressRequest ContIDNotSupported ContIDMSSupportofNetworkRequestedBearerControlIndicator ContIDDSMIPv6HomeAgentAddressRequest ContIDDSMIPv6HomeNetworkPrefixRequest ContIDDSMIPv6IPv4HomeAgentAddressRequest ContIDIPaddressAllocationViaNASSignalling ContIDIPv4addressAllocationViaDHCPv4 ContIDPCSCFIPv4AddressRequest ContIDDNSServerIPv4AddressRequest ContIDMSISDNRequest ContIDIFOMSupportRequest ContIDIPv4LinkMTURequest ContIDMSSupportOfLocalAddressInTFTIndicator ContIDPCSCFReselectionSupport ContIDNBIFOMRequestIndicator ContIDNBIFOMMode ContIDNonIPLinkMTURequest ContIDAPNRateControlSupportIndicator ContID3GPPPSDataOffUEStatus ContIDReliableDataServiceRequestIndicator ContIDAdditionalAPNRateControlForExceptionDataSupportIndicator ContIDPDUSessionID ContIDEthernetFramePayloadMTURequest ContIDUnstructuredLinkMTURequest ContID5GSMCauseValue )
Container ID definitions.
const ( RatTypeUTRAN uint8 RatTypeGERAN RatTypeWLAN RatTypeGAN RatTypeHSPAEvolution RatTypeEUTRAN )
RATType definitions.
const ( LocTypeCGI uint8 = iota LocTypeSAI LocTypeRAI )
UserLocationInformation GeographicLocationType definitions.
const ( APNRestrictionNoExistingContextsorRestriction uint8 = iota APNRestrictionPublic1 APNRestrictionPublic2 APNRestrictionPrivate1 APNRestrictionPrivate2 )
APN Restriction definitions.
const ( MAPCauseUnknownSubscriber uint8 MAPCauseUnknownBaseStation MAPCauseUnknownMSC MAPCauseSecureTransportError MAPCauseUnidentifiedSubscriber MAPCauseAbsentSubscriberSM MAPCauseUnknownEquipment MAPCauseRoamingNotAllowed MAPCauseIllegalSubscriber MAPCauseBearerServiceNotProvisioned MAPCauseTeleserviceNotProvisioned MAPCauseIllegalEquipment MAPCauseCallBarred MAPCauseForwardingViolation MAPCauseCUGReject MAPCauseIllegalSSOperation MAPCauseSSErrorStatus MAPCauseSSNotAvailable MAPCauseSSSubscriptionViolatio MAPCauseSSIncompatibility MAPCauseFacilityNotSupported MAPCauseOngoingGroupCall MAPCauseInvalidTargetBaseStation MAPCauseNoRadioResourceAvailable MAPCauseNoHandoverNumberAvailable MAPCauseSubsequentHandoverFailure MAPCauseAbsentSubscriber MAPCauseIncompatibleTerminal MAPCauseShortTermDenial MAPCauseLongTermDenial MAPCauseSubscriberBusyForMTSMS MAPCauseSMDeliveryFailure MAPCauseMessageWaitingListFull MAPCauseSystemFailure MAPCauseDataMissing MAPCauseUnexpectedDataValue MAPCausePWRegistrationFailure MAPCauseNegativePWCheck MAPCauseNoRoamingNumberAvailable MAPCauseTracingBufferFull MAPCauseTargetCellOutsideGroupCallArea MAPCauseNumberOfPWAttemptsViolation MAPCauseNumberChanged MAPCauseBusySubscriber MAPCauseNoSubscriberReply MAPCauseForwardingFailed MAPCauseORNotAllowed MAPCauseATINotAllowed MAPCauseNoGroupCallNumberAvailable MAPCauseResourceLimitation MAPCausePositionMethodFailure MAPCauseUnknownOrUnreachableLCSClient MAPCauseMMEventNotSupported MAPCauseATSINotAllowed MAPCauseATMNotAllowed MAPCauseInformationNotAvailabl MAPCauseUnknownAlphabe MAPCauseUSSDBusy )
MAP Cause definitions.
const ( RABPreempted uint8 RANAPCauseTrelocoverallExpiry RANAPCauseTrelocprepExpiry RANAPCauseTreloccompleteExpiry RANAPCauseTqueuingExpiry RANAPCauseRelocationTriggered RANAPCauseTRELOCallocExpiry RANAPCauseUnableToEstablishDuringRelocation RANAPCauseUnknownTargetRNC RANAPCauseRelocationCancelled RANAPCauseSuccessfulRelocation RANAPCauseRequestedCipheringIntegrityProtectionAlgorithmsNotSupported RANAPCauseChangeOfCipheringIntegrityProtectionIsNotSupported RANAPCauseFailureInTheRadioInterfaceProcedure RANAPCauseReleaseDueToUTRANGeneratedReason RANAPCauseUserInactivity RANAPCauseTimeCriticalRelocation RANAPCauseRequestedTrafficClassNotAvailable RANAPCauseInvalidRABParametersValue RANAPCauseRequestedMaximumBitRateNotAvailable RANAPCauseRequestedGuaranteedBitRateNotAvailable RANAPCauseRequestedTransferDelayNotAchievable RANAPCauseInvalidRABParametersCombination RANAPCauseConditionViolationForSDUParameters RANAPCauseConditionViolationForTrafficHandlingPriority RANAPCauseConditionViolationForGuaranteedBitRate RANAPCauseUserPlaneVersionsNotSupported RANAPCauseIuUPFailure RANAPCauseRelocationFailureInTargetCNRNCOrTargetSystem RANAPCauseInvalidRABID RANAPCauseNoRemainingRAB RANAPCauseInteractionWithOtherProcedure RANAPCauseRequestedMaximumBitRateForDLNotAvailable RANAPCauseRequestedMaximumBitRateForULNotAvailable RANAPCauseRequestedGuaranteedBitRateForDLNotAvailable RANAPCauseRequestedGuaranteedBitRateForULNotAvailable RANAPCauseRepeatedIntegrityCheckingFailure RANAPCauseRequestedReportTypeNotSupported RANAPCauseRequestSuperseded RANAPCauseReleaseDueToUEWenRatedSignallingConnectionRelease RANAPCauseResourceOptimisationRelocation RANAPCauseRequestedInformationNotAvailable RANAPCauseRelocationDesirableForRadioReasons RANAPCauseRelocationNotSupportedInTargetRNCOrTargetSystem RANAPCauseDirectedRetry RANAPCauseRadioConnectionWithUELost RANAPCauseRNCUnableToEstablishAllRFCs RANAPCauseDecipheringKeysNotAvailable RANAPCauseDedicatedAssistanceDataNotAvailable RANAPCauseRelocationTargetNotAllowed RANAPCauseLocationReportingCongestion RANAPCauseReduceLoadInServingCell RANAPCauseNoRadioResourcesAvailableInTargetCell RANAPCauseGERANIuModeFailure RANAPCauseIncomingRelocationNotSupportedDueTodPUESBINEFeature RANAPCauseTrafficLoadInTheTargetCellHigherThanInTheSourceCell RANAPCauseMBMSNoMulticastServiceForThisUE RANAPCauseMBMSUnknownUEID RANAPCauseSuccessfulMBMSSessionStartNoDataBearerNecessary RANAPCauseMBMSSupersededDueToNNSF RANAPCauseMBMSUELinkingAlreadyDone RANAPCauseMBMSUEDeLinkingFailureNoExistingUELinking RANAPCauseTMGIUnknown RANAPCauseSignallingTransportResourceFailure RANAPCauseIuTransportConnectionFailedToEstablish RANAPCauseUserRestrictionStartIndication RANAPCauseUserRestrictionEndIndication RANAPCauseNormalRelease RANAPCauseTransferSyntaxError RANAPCauseSemanticError RANAPCauseMessageNotCompatibleWithReceiverState RANAPCauseAbstractSyntaxErrorReject RANAPCauseAbstractSyntaxErrorIgnoreAndNotify RANAPCauseAbstractSyntaxErrorFalselyConstructedMessage RANAPCauseOAMIntervention RANAPCauseNoResourceAvailable RANAPCauseUnspecifiedFailure RANAPCauseNetworkOptimisation )
RANAP Cause definitions.
const (
ConfigProtocolPPPWithIP uint8 = 0
)
Configuration Protocol definitions.
Variables ¶
var ( // ErrNoHandlersFound indicates that the handler func is not registered in *Conn // for the incoming GTPv2 message. In usual cases this error should not be taken // as fatal, as the other endpoint can make your program stop working just by // sending unregistered messages. ErrNoHandlersFound = errors.New("no handlers found for incoming message, ignoring") // ErrUnexpectedType indicates that the type of incoming message is not expected. ErrUnexpectedType = errors.New("got unexpected type of message") // ErrInvalidConnection indicates that the connection type(C-Plane or U-Plane) is // not the expected one. ErrInvalidConnection = errors.New("got invalid connection type") // ErrConnNotOpened indicates that some operation is failed due to the status of // Conn is not valid. ErrConnNotOpened = errors.New("connection is not opened") )
Functions ¶
func Decapsulate ¶
Decapsulate decapsulates given bytes and returns TEID, and Payload.
func DisableLogging ¶ added in v0.6.4
func DisableLogging()
DisableLogging disables the logging from the package. Logging is enabled by default.
func EnableLogging ¶ added in v0.6.4
EnableLogging enables the logging from the package. If l is nil, it uses default logger provided by the package. Logging is enabled by default.
See also: SetLogger.
func Encapsulate ¶
Encapsulate encapsulates given bytes with GTPv1-U Header and returns in message.TPDU.
func SetLogger ¶ added in v0.6.4
SetLogger replaces the standard logger with arbitrary *log.Logger.
This package prints just informational logs from goroutines working background that might help developers test the program but can be ignored safely. More important ones that needs any action by caller would be returned as errors.
Types ¶
type Conn ¶
type Conn interface { net.PacketConn AddHandler(uint8, HandlerFunc) RespondTo(net.Addr, messages.Message, messages.Message) error Restarts() uint8 }
Conn is an abstraction of both GTPv1-C and GTPv1-U Conn.
type ErrorIndicatedError ¶ added in v0.6.0
ErrorIndicatedError indicates that Error Indication message is received on U-Plane Connection.
func (*ErrorIndicatedError) Error ¶ added in v0.6.0
func (e *ErrorIndicatedError) Error() string
type HandlerFunc ¶
HandlerFunc is a handler for specific GTPv1 message.
type Relay ¶
type Relay struct {
// contains filtered or unexported fields
}
Relay is to relay packets between two UPlaneConn.
DEPRECATED. Use UPlaneConn.RelayTo() instead.
func NewRelay ¶
func NewRelay(leftConn, rightConn *UPlaneConn) *Relay
NewRelay creates a new Relay.
DEPRECATED. Use UPlaneConn.RelayTo() instead.
func (*Relay) AddPeer ¶
AddPeer adds a peer information with the TEID contained in the incoming meesage.
DEPRECATED. Use UPlaneConn.RelayTo() instead.
type UPlaneConn ¶
UPlaneConn represents a U-Plane Connection of GTPv1.
func DialUPlane ¶
DialUPlane sends Echo Request to raddr to check if the endpoint is alive and returns UPlaneConn.
func NewUPlaneConn ¶ added in v0.6.4
func NewUPlaneConn(laddr net.Addr) *UPlaneConn
NewUPlaneConn creates a new UPlaneConn used for server. On client side, use DialUPlane instead.
func (*UPlaneConn) AddHandler ¶
func (u *UPlaneConn) AddHandler(msgType uint8, fn HandlerFunc)
AddHandler adds a message handler to *UPlaneConn.
By adding HandlerFuncs, *UPlaneConn (and *Session, *Bearer created by the *UPlaneConn) will handle the specified type of message with it's paired HandlerFunc when receiving. Messages without registered handlers are just ignored and discarded and the user will get ErrNoHandlersFound error.
This should be performed just after creating *UPlaneConn, otherwise the user cannot retrieve any values, which is in most cases vital to continue working as a node, from the incoming messages.
HandlerFuncs for EchoResponse and ErrorIndication are registered by default. These HandlerFuncs can be overwritten by specifying messages.MsgTypeEchoResponse and/or messages.MsgTypeErrorIndication as msgType parameter.
func (*UPlaneConn) AddHandlers ¶
func (u *UPlaneConn) AddHandlers(funcs map[uint8]HandlerFunc)
AddHandlers adds multiple handler funcs at a time.
See AddHandler for detailed usage.
func (*UPlaneConn) AddTunnel ¶ added in v0.4.0
func (u *UPlaneConn) AddTunnel(peerIP, msIP net.IP, otei, itei uint32) error
AddTunnel adds a GTP-U tunnel with Linux Kernel GTP-U via netlink.
func (*UPlaneConn) AddTunnelOverride ¶ added in v0.4.0
func (u *UPlaneConn) AddTunnelOverride(peerIP, msIP net.IP, otei, itei uint32) error
AddTunnelOverride adds a GTP-U tunnel with Linux Kernel GTP-U via netlink. If there is already an existing tunnel that has the same msIP and/or incoming TEID, this deletes it before adding the tunnel.
func (*UPlaneConn) Close ¶
func (u *UPlaneConn) Close() error
Close closes the connection. Any blocked Read or Write operations will be unblocked and return errors.
func (*UPlaneConn) CloseRelay ¶ added in v0.3.3
func (u *UPlaneConn) CloseRelay(teidIn uint32) error
CloseRelay stops relaying T-PDU from a conn to conn.
func (*UPlaneConn) DelTunnelByITEI ¶ added in v0.4.0
func (u *UPlaneConn) DelTunnelByITEI(itei uint32) error
DelTunnelByITEI deletes a Linux Kernel GTP-U tunnel specified with the incoming TEID.
func (*UPlaneConn) DelTunnelByMSAddress ¶ added in v0.4.0
func (u *UPlaneConn) DelTunnelByMSAddress(msIP net.IP) error
DelTunnelByMSAddress deletes a Linux Kernel GTP-U tunnel specified with the subscriber's IP.
func (*UPlaneConn) EchoRequest ¶
func (u *UPlaneConn) EchoRequest(raddr net.Addr) error
EchoRequest sends a EchoRequest.
func (*UPlaneConn) EchoResponse ¶
func (u *UPlaneConn) EchoResponse(raddr net.Addr) error
EchoResponse sends a EchoResponse.
func (*UPlaneConn) EnableKernelGTP ¶ added in v0.6.4
func (u *UPlaneConn) EnableKernelGTP(devname string, role Role) error
EnableKernelGTP enables Linux Kernel GTP-U. Note that this removes all the existing userland tunnels, and cannot be disabled while the program is working (at least at this moment).
Using Kernel GTP-U is much more performant than userland, but requires root privilege. After enabled, users should add tunnels by AddTunnel func, and also add appropriate routing entries. For handling downlink traffic on P-GW, for example;
ip route add <UE's IP> dev <devname> table <table ID> ip rule add from <SGi side of I/F> lookup <table ID>
This let the traffic from SGi side of network I/F to be forwarded to GTP device, and if the UE's IP is known to Kernel GTP-U(by AddTunnel), it is encapsulated and forwarded to the peer(S-GW, in this case).
Please see the examples/gw-tester for how each node handles routing from the program.
func (*UPlaneConn) ErrorIndication ¶
ErrorIndication just sends ErrorIndication message.
func (*UPlaneConn) ListenAndServe ¶ added in v0.6.4
func (u *UPlaneConn) ListenAndServe(ctx context.Context) error
ListenAndServe creates a new GTPv2-C *Conn and start serving. This blocks, and returns error only if it face the fatal one. Non-fatal errors are logged with logger. See SetLogger/EnableLogger/DisableLogger for handling of those logs.
func (*UPlaneConn) LocalAddr ¶
func (u *UPlaneConn) LocalAddr() net.Addr
LocalAddr returns the local network address.
func (*UPlaneConn) NewFTEID ¶ added in v0.7.3
func (u *UPlaneConn) NewFTEID(ifType uint8, v4, v6 string) (fteidIE *v2ies.IE)
NewFTEID creates a new GTPv2 F-TEID with random TEID value that is unique within UPlaneConn. To ensure the uniqueness, don't create in the other way if you once use this method. This is meant to be used for creating F-TEID IE for non-local interface type, such as the ones that are used in U-Plane. For local interface, use (*Conn).NewSenderFTEID instead.
Note that in the case there's a lot of Session on the Conn, it may take a long time to find a new unique value.
TODO: optimize performance...
func (*UPlaneConn) ReadFrom ¶
ReadFrom reads a packet from the connection, copying the payload into p. It returns the number of bytes copied into p and the return address that was on the packet. It returns the number of bytes read (0 <= n <= len(p)) and any error encountered. Callers should always process the n > 0 bytes returned before considering the error err. ReadFrom can be made to time out and return an Error with Timeout() == true after a fixed time limit; see SetDeadline and SetReadDeadline.
Note that valid GTP-U packets handled by Kernel can NOT be retrieved by this.
func (*UPlaneConn) ReadFromGTP ¶
ReadFromGTP reads a packet from the connection, copying the payload without GTP header into p. It returns the number of bytes copied into p, the return address that was on the packet, TEID in the GTP header.
Note that valid GTP-U packets handled by Kernel can NOT be retrieved by this.
func (*UPlaneConn) RelayTo ¶
func (u *UPlaneConn) RelayTo(c *UPlaneConn, teidIn, teidOut uint32, raddr net.Addr) error
RelayTo relays T-PDU type of packet to peer node(specified by raddr) from the UPlaneConn given.
By using this, owner of UPlaneConn won't be able to Read and Write the packets that has teidIn.
func (*UPlaneConn) RespondTo ¶
RespondTo sends a message(specified with "toBeSent" param) in response to a message(specified with "received" param).
This is to make it easier to handle SequenceNumber.
func (*UPlaneConn) Restarts ¶
func (u *UPlaneConn) Restarts() uint8
Restarts returns the number of restarts in uint8.
func (*UPlaneConn) SetDeadline ¶
func (u *UPlaneConn) SetDeadline(t time.Time) error
SetDeadline sets the read and write deadlines associated with the connection. It is equivalent to calling both SetReadDeadline and SetWriteDeadline.
A deadline is an absolute time after which I/O operations fail with a timeout (see type Error) instead of blocking. The deadline applies to all future and pending I/O, not just the immediately following call to Read or Write. After a deadline has been exceeded, the connection can be refreshed by setting a deadline in the future.
An idle timeout can be implemented by repeatedly extending the deadline after successful Read or Write calls.
A zero value for t means I/O operations will not time out.
func (*UPlaneConn) SetReadDeadline ¶
func (u *UPlaneConn) SetReadDeadline(t time.Time) error
SetReadDeadline sets the deadline for future Read calls and any currently-blocked Read call. A zero value for t means Read will not time out.
func (*UPlaneConn) SetWriteDeadline ¶
func (u *UPlaneConn) SetWriteDeadline(t time.Time) error
SetWriteDeadline sets the deadline for future Write calls and any currently-blocked Write call. Even if write times out, it may return n > 0, indicating that some of the data was successfully written. A zero value for t means Write will not time out.
func (*UPlaneConn) WriteTo ¶
WriteTo writes a packet with payload p to addr. WriteTo can be made to time out and return an Error with Timeout() == true after a fixed time limit; see SetDeadline and SetWriteDeadline. On packet-oriented connections, write timeouts are rare.
func (*UPlaneConn) WriteToGTP ¶
WriteToGTP writes a packet with TEID and payload to addr.
Source Files ¶
Directories ¶
Path | Synopsis |
---|---|
Package ies provides encoding/decoding feature of GTPv1 Information Elements.
|
Package ies provides encoding/decoding feature of GTPv1 Information Elements. |
Package messages provides encoding/decoding feature of GTPv1 protocol.
|
Package messages provides encoding/decoding feature of GTPv1 protocol. |
Package testutils is an internal package to be used for unit tests.
|
Package testutils is an internal package to be used for unit tests. |