initial checkin of osmo-remsim
This adds some initial code, particularly the ASN.1 definition of the
RSPRO protocol, related makefile to build it using ffasn1c, and our
usual autoconf infrastructure to build it.
Change-Id: Ibaa993b59e9a65a0242b0f42b27d9cd29f8e1878
diff --git a/asn1/RSPRO.asn b/asn1/RSPRO.asn
new file mode 100644
index 0000000..8e4f266
--- /dev/null
+++ b/asn1/RSPRO.asn
@@ -0,0 +1,275 @@
+----------------------------------------------------------------------
+-- RSPRO - Remote SIM Protocol, part of Osmocom Remote SIM Suite
+-- (C) 2018 by Harald Welte <laforge@gnumonks.org>
+----------------------------------------------------------------------
+
+RSPRO {} DEFINITIONS
+
+IMPLICIT TAGS
+
+::=
+
+BEGIN
+
+EXPORTS
+ RsproPDU
+;
+
+----------------------------------------------------------------------
+-- Elementary Data Types
+----------------------------------------------------------------------
+
+-- Some random ID the requestor can chose and which the client echos back in a response.
+-- This allows multiple outstanding commands in flight and matching of responses to requests.
+OperationTag ::= INTEGER(0..2147483647)
+
+-- Unique identifier of a given SIM bank
+BankId ::= INTEGER(0..1023)
+
+-- Unique identifier of a given client (modem)
+ClientId ::= INTEGER(0..1023)
+
+ComponentType ::= ENUMERATED {
+ -- client: Modems / Phones
+ remsimClient (0),
+ -- server: Coordination
+ remsimServer (1),
+ -- bank daemon: SIM cards
+ remsimBankd (2)
+}
+ComponentName ::= IA5String (SIZE (1..32))
+ComponentIdentity ::= SEQUENCE {
+ type ComponentType,
+ name ComponentName,
+ software [0] ComponentName,
+ swVersion [1] ComponentName,
+ hwManufacturer [2] ComponentName OPTIONAL,
+ hwModel [3] ComponentName OPTIONAL,
+ hwSerialNr [4] ComponentName OPTIONAL,
+ hwVersion [5] ComponentName OPTIONAL,
+ fwVersion [6] ComponentName OPTIONAL,
+ ...
+}
+
+-- IP address / port details
+Ipv4Address ::= OCTET STRING (SIZE (4))
+Ipv6Address ::= OCTET STRING (SIZE (16))
+IpAddress ::= CHOICE {
+ ipv4 [0] Ipv4Address,
+ ipv6 [1] Ipv6Address
+}
+PortNumber ::= INTEGER (0..65535)
+IpPort ::= SEQUENCE {
+ ip IpAddress,
+ port PortNumber
+}
+
+-- Result of a given operation
+ResultCode ::= ENUMERATED {
+ ok (0),
+ -- client / bank / slot ID not accepted
+ illegalClientId (1),
+ illegalBankId (2),
+ illegalSlotId (3),
+
+ -- no card is present in given slot
+ cardNotPresent (100),
+ -- card is present but unresponsive in given slot
+ cardUnresponsive (101),
+ -- unrecoverable transmission errors detected
+ cardTransmissionError (102),
+ ...
+}
+
+-- Slot number within a SIM bank or a client.
+SlotNumber ::= INTEGER(0..1023)
+
+-- Slot identity on client (modem) side
+ClientSlot ::= SEQUENCE {
+ clientId ClientId,
+ slotNr SlotNumber,
+ ...
+}
+
+-- Slot identity on SIM bank side
+BankSlot ::= SEQUENCE {
+ bankId BankId,
+ slotNr SlotNumber,
+ ...
+}
+
+ATR ::= OCTET STRING (SIZE (1..55))
+
+-- flags related to a TPDU in either of the two directions
+TpduFlags ::= SEQUENCE {
+ -- indicates a TPDU header is present in this message
+ tpduHeaderPresent BOOLEAN,
+ -- indicates last part of transmission in this direction
+ finalPart BOOLEAN,
+ -- indicates a PB is present and we should continue with TX
+ procByteContinueTx BOOLEAN,
+ -- indicates a PB is present and we should continue with RX
+ procByteContinueRx BOOLEAN,
+ ...
+}
+
+--- physical state of a given slot
+SlotPhysStatus ::= SEQUENCE {
+ -- is RST activated by the modem?
+ resetActive [0] BOOLEAN,
+ -- is VCC applied by the modem?
+ vccPresent [1] BOOLEAN OPTIONAL,
+ -- is CLK applied by the modem?
+ clkActive [2] BOOLEAN OPTIONAL, -- not all hardware supports this
+ -- is card presence signalled to the modem?
+ cardPresent [3] BOOLEAN OPTIONAL,
+ ...
+}
+
+----------------------------------------------------------------------
+-- Messages
+----------------------------------------------------------------------
+
+
+-- SIM Bank connects to central server
+ConnectBankReq ::= SEQUENCE {
+ -- identity of the bank that is connecting to the server
+ identity ComponentIdentity,
+ -- bank number, pre-configured on bank side
+ bankId BankId,
+ numberOfSlots SlotNumber,
+ ...
+}
+ConnectBankRes ::= SEQUENCE {
+ -- identity of the server to which the bank is connecting
+ identity ComponentIdentity,
+ result ResultCode,
+ ...
+}
+
+ConnectClientReq ::= SEQUENCE {
+ -- identity of the bank that is connecting to the server
+ identity ComponentIdentity,
+ ...
+}
+ConnectClientRes ::= SEQUENCE {
+ -- identity of the bnak to which the client is connecting
+ identity ComponentIdentity,
+ result ResultCode,
+ ...
+}
+
+-- create a mapping between a given Bank:Slot <-> Client:Slot
+CreateMappingReq ::= SEQUENCE {
+ client ClientSlot,
+ bank BankSlot,
+ ...
+}
+CreateMappingRes ::= SEQUENCE {
+ result ResultCode,
+ ...
+}
+
+-- remove a mapping between a given Bank:Slot <-> Client:Slot
+RemoveMappingReq ::= SEQUENCE {
+ client ClientSlot,
+ bank BankSlot,
+ ...
+}
+RemoveMappingRes ::= SEQUENCE {
+ result ResultCode,
+ ...
+}
+
+ConfigClientReq ::= SEQUENCE {
+ -- server-allocated assignment of a client ID
+ clientId ClientId,
+ -- bank to which the client shall connect
+ bankd IpPort,
+ ...
+}
+ConfigClientRes ::= SEQUENCE {
+ result ResultCode,
+ ...
+}
+
+-- configure the ATR which the card emulator (client) shall send to the modem
+SetAtrReq ::= SEQUENCE {
+ slot ClientSlot,
+ atr ATR,
+ ...
+}
+SetAtrRes ::= SEQUENCE {
+ result ResultCode,
+ ...
+}
+
+-- TPDU in Modem -> Card direction
+TpduModemToCard ::= SEQUENCE {
+ -- we include fully-qualified bank and client slots for easier debugging
+ fromClientSlot ClientSlot,
+ toBankSlot BankSlot,
+ flags TpduFlags,
+ data OCTET STRING,
+ ...
+}
+
+-- TPDU in Card -> Modem direction
+TpduCardToModem ::= SEQUENCE {
+ -- we include fully-qualified bank and client slots for easier debugging
+ fromBankSlot BankSlot,
+ toClientSlot ClientSlot,
+ flags TpduFlags,
+ data OCTET STRING,
+ ...
+}
+
+-- indciation about the current status of a client (modem side)
+ClientSlotStatusInd ::= SEQUENCE {
+ fromClientSlot ClientSlot,
+ toBankSlot BankSlot,
+ slotPhysStatus SlotPhysStatus,
+ ...
+}
+
+-- indciation about the current status of a bank (modem side)
+BankSlotStatusInd ::= SEQUENCE {
+ fromBankSlot BankSlot,
+ toClientSlot ClientSlot,
+ slotPhysStatus SlotPhysStatus,
+ ...
+}
+
+----------------------------------------------------------------------
+-- PDU
+----------------------------------------------------------------------
+
+RsproPDUchoice ::= CHOICE {
+ -- configuration + management
+ connectBankReq [0] ConnectBankReq,
+ connectBankRes [1] ConnectBankRes,
+ connectClientReq [2] ConnectClientReq,
+ connectClientRes [3] ConnectClientRes,
+ createMappingReq [4] CreateMappingReq,
+ createMappingRes [5] CreateMappingRes,
+ removeMappingReq [6] RemoveMappingReq,
+ removeMappingRes [7] RemoveMappingRes,
+ configClientReq [8] ConfigClientReq,
+ configClientRes [9] ConfigClientRes,
+ -- APDUs etc.
+ setAtrReq [10] SetAtrReq,
+ setAtrRes [11] SetAtrRes,
+ tpduModemToCard [12] TpduModemToCard,
+ tpduCardToModem [13] TpduCardToModem,
+ clientSlotStatusInd [14] ClientSlotStatusInd,
+ bankSlotStatusInd [15] BankSlotStatusInd,
+ ...
+}
+
+RsproPDU ::= SEQUENCE {
+ version [0] INTEGER(0..32) DEFAULT 1,
+ tag [1] OperationTag,
+ msg [2] RsproPDUchoice
+}
+
+END