ipa: Pull everything together: L3->BSSAP->SCCP->IPA
diff --git a/library/BSSMAP_Templates.ttcn b/library/BSSMAP_Templates.ttcn
new file mode 100644
index 0000000..aea1e01
--- /dev/null
+++ b/library/BSSMAP_Templates.ttcn
@@ -0,0 +1,170 @@
+module BSSMAP_Templates {
+
+import from General_Types all;
+import from Osmocom_Types all;
+import from BSSAP_Types all;
+
+type integer BssmapCause;
+
+template PDU_BSSAP ts_BSSAP_BSSMAP := {
+	discriminator := '0'B,
+	spare := '0000000'B,
+	dlci := omit,
+	lengthIndicator := 0,	/* overwritten by codec */
+	pdu := ?
+}
+
+template PDU_BSSAP tr_BSSAP_BSSMAP := {
+	discriminator := '0'B,
+	spare := '0000000'B,
+	dlci := omit,
+	lengthIndicator := ?,
+	pdu := {
+		bssmap := ?
+	}
+}
+
+template (value) BSSMAP_IE_Cause ts_BSSMAP_IE_Cause(BssmapCause val) := {
+	elementIdentifier := '04'O,
+	lengthIndicator := 0,
+	causeValue := int2bit(val, 7),
+	extensionCauseValue := '0'B,
+	spare1 := omit
+}
+
+template (value) PDU_BSSAP ts_BSSMAP_Reset(BssmapCause cause) modifies ts_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			reset := {
+				messageType := '30'O,
+				cause := ts_BSSMAP_IE_Cause(cause),
+				a_InterfaceSelectorForReset := omit
+			}
+		}
+	}
+}
+
+template (value) PDU_BSSAP ts_BSSMAP_ResetAck modifies ts_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			resetAck := {
+				messageType := '31'O,
+				a_InterfaceSelectorForReset := omit
+			}
+		}
+	}
+}
+
+template PDU_BSSAP tr_BSSMAP_ResetAck modifies tr_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			resetAck := {
+				messageType := '31'O,
+				a_InterfaceSelectorForReset := *
+			}
+		}
+	}
+}
+
+template BSSMAP_IE_CellIdentifier ts_BSSMAP_IE_CellID := {
+	elementIdentifier := '05'O,
+	lengthIndicator := 0,
+	cellIdentifierDiscriminator := '0000'B,
+	spare1_4 := '0000'B,
+	cellIdentification := ?
+}
+
+type uint16_t BssmapLAC;
+type uint16_t BssmapCI;
+
+/*
+template BSSMAP_IE_CellIdentifier ts_CellId_CGI(mcc, mnc, lac, ci)
+modifies ts_BSSMAP_IE_CellID := {
+	cellIdentification := {
+		cI_LAC_CGI := {
+			mnc_mcc := FIXME,
+			lac := int2oct(lac, 2),
+			ci := int2oct(ci, 2)
+		}
+	}
+}
+*/
+
+template BSSMAP_IE_CellIdentifier ts_CellID_LAC_CI(BssmapLAC lac, BssmapCI ci)
+modifies ts_BSSMAP_IE_CellID := {
+	cellIdentification := {
+		cI_LAC_CI := {
+			lac := int2oct(lac, 2),
+			ci := int2oct(ci, 2)
+		}
+	}
+}
+
+template BSSMAP_IE_CellIdentifier ts_CellId_CI(BssmapCI ci)
+modifies ts_BSSMAP_IE_CellID := {
+	cellIdentification := {
+		cI_CI := int2oct(ci, 2)
+	}
+}
+
+template BSSMAP_IE_CellIdentifier ts_CellId_none
+modifies ts_BSSMAP_IE_CellID := {
+	cellIdentification := {
+		cI_noCell := ''O
+	}
+}
+
+
+template BSSMAP_IE_Layer3Information ts_BSSMAP_IE_L3Info(octetstring l3info) := {
+	elementIdentifier := '17'O,
+	lengthIndicator := 0,
+	layer3info := l3info
+}
+
+template PDU_BSSAP ts_BSSMAP_ComplL3(BSSMAP_IE_CellIdentifier cell_id, octetstring l3_info)
+modifies ts_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			completeLayer3Information := {
+				messageType := '57'O,
+				cellIdentifier := cell_id,
+				layer3Information := ts_BSSMAP_IE_L3Info(l3_info),
+				chosenChannel := omit,
+				lSAIdentifier := omit,
+				aPDU := omit,
+				codecList := omit,
+				redirectAttemptFlag := omit,
+				sendSequenceNumber := omit,
+				iMSI := omit
+			}
+		}
+	}
+}
+
+template PDU_BSSAP ts_BSSMAP_HandoReq(BssmapCause cause, BSSMAP_IE_CellIdentifierList cid_list)
+modifies ts_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			handoverRequired := {
+				messageType := '11'O,
+				cause := ts_BSSMAP_IE_Cause(cause),
+				responseRequest := omit,
+				cellIdentifierList := cid_list,
+				circuitPoolList := omit,
+				currentChannelType1 := omit,
+				speechVersion := omit,
+				queueingIndicator := omit,
+				oldToNewBSSInfo := omit,
+				sourceToTargetRNCTransparentInfo := omit,
+				sourceToTargetRNCTransparentInfoCDMA := omit,
+				gERANClassmark := omit,
+				talkerPriority := omit,
+				speechCodec := omit,
+				cSG_Identifier := omit
+			}
+		}
+	}
+}
+
+
+}