Merge "Include missing headers"
diff --git a/OWNERS b/OWNERS
new file mode 100644
index 0000000..9fbcb47
--- /dev/null
+++ b/OWNERS
@@ -0,0 +1,5 @@
+elsk@google.com
+maco@google.com
+malchev@google.com
+smoreland@google.com
+yim@google.com  # vts tests
diff --git a/bluetooth/1.0/default/vendor_interface.cc b/bluetooth/1.0/default/vendor_interface.cc
index bb66460..a291e14 100644
--- a/bluetooth/1.0/default/vendor_interface.cc
+++ b/bluetooth/1.0/default/vendor_interface.cc
@@ -282,6 +282,8 @@
 
     int power_state = BT_VND_PWR_OFF;
     lib_interface_->op(BT_VND_OP_POWER_CTRL, &power_state);
+
+    lib_interface_->cleanup();
   }
 
   if (lib_handle_ != nullptr) {
diff --git a/nfc/1.0/vts/functional/VtsHalNfcV1_0TargetTest.cpp b/nfc/1.0/vts/functional/VtsHalNfcV1_0TargetTest.cpp
index e77cc14..e67f94f 100644
--- a/nfc/1.0/vts/functional/VtsHalNfcV1_0TargetTest.cpp
+++ b/nfc/1.0/vts/functional/VtsHalNfcV1_0TargetTest.cpp
@@ -46,13 +46,12 @@
     { 0x20, 0x01, 0x00 }
 #define INVALID_COMMAND \
   { 0x20, 0x00, 0x00 }
-#define FAULTY_DATA_PACKET \
-  { 0x00, 0x00, 0xFF }
 
 #define LOOP_BACK_HEADER_SIZE 3
 #define SYNTAX_ERROR 5
 #define NUMBER_LOOPS 3922
-#define VERSION 0x11
+#define NCI_VERSION_1_1 0x11
+#define NCI_VERSION_2 0x20
 #define TIMEOUT_PERIOD 5
 
 constexpr char kCallbackNameSendEvent[] = "sendEvent";
@@ -108,6 +107,42 @@
     EXPECT_TRUE(res.no_timeout);
     EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
     EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
+
+    /* Get the NCI version that the device supports */
+    std::vector<uint8_t> cmd = CORE_RESET_CMD;
+    NfcData data = cmd;
+    EXPECT_EQ(data.size(), nfc_->write(data));
+    // Wait for CORE_RESET_RSP
+    res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
+    EXPECT_TRUE(res.no_timeout);
+    EXPECT_GE(6ul, res.args->last_data_.size());
+    EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
+    if (res.args->last_data_.size() == 6) {
+        nci_version = res.args->last_data_[4];
+    } else {
+        EXPECT_EQ(4ul, res.args->last_data_.size());
+        nci_version = NCI_VERSION_2;
+        res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
+        EXPECT_TRUE(res.no_timeout);
+    }
+
+    /*
+     * Close the hal and then re-open to make sure we are in a predictable
+     * state for all the tests.
+     */
+    EXPECT_EQ(NfcStatus::OK, nfc_->close());
+    // Wait for CLOSE_CPLT event
+    res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
+    EXPECT_TRUE(res.no_timeout);
+    EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
+    EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
+
+    EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
+    // Wait for OPEN_CPLT event
+    res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
+    EXPECT_TRUE(res.no_timeout);
+    EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
+    EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
   }
 
   virtual void TearDown() override {
@@ -119,6 +154,9 @@
     EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
   }
 
+  /* NCI version the device supports
+   * 0x11 for NCI 1.1, 0x20 for NCI 2.0 and so forth */
+  uint8_t nci_version;
   sp<INfc> nfc_;
   sp<NfcClientCallback> nfc_cb_;
 };
@@ -154,10 +192,26 @@
   // Wait for CORE_RESET_RSP
   auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
   EXPECT_TRUE(res.no_timeout);
-  EXPECT_EQ(6ul, res.args->last_data_.size());
-  EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
-  EXPECT_GE(VERSION, res.args->last_data_[4]);
-  EXPECT_GE(1ul, res.args->last_data_[5]);
+
+  /* The response/notification format for CORE_RESET_CMD differs
+   * with NCI 1.0 and 2.0. */
+  if (nci_version <= NCI_VERSION_1_1) {
+      EXPECT_EQ(6ul, res.args->last_data_.size());
+      EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
+      EXPECT_GE(NCI_VERSION_1_1, res.args->last_data_[4]);
+      EXPECT_GE(1ul, res.args->last_data_[5]);
+  } else {
+      EXPECT_EQ(4ul, res.args->last_data_.size());
+      EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
+      // Wait for CORE_RESET_NTF
+      res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
+      EXPECT_TRUE(res.no_timeout);
+      // Check if reset trigger was due to CORE_RESET_CMD
+      EXPECT_LE(8ul, res.args->last_data_.size());
+      EXPECT_EQ(2ul, res.args->last_data_[3]);
+      EXPECT_GE(1ul, res.args->last_data_[4]);
+      EXPECT_EQ(NCI_VERSION_2, res.args->last_data_[5]);
+  }
 }
 
 /*
@@ -173,10 +227,26 @@
   // Wait for CORE_RESET_RSP
   auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
   EXPECT_TRUE(res.no_timeout);
-  EXPECT_EQ(6ul, res.args->last_data_.size());
-  EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
-  EXPECT_GE(VERSION, res.args->last_data_[4]);
-  EXPECT_EQ(1ul, res.args->last_data_[5]);
+
+  /* The response/notification format for CORE_RESET_CMD differs
+   * with NCI 1.0 and 2.0. */
+  if (nci_version <= NCI_VERSION_1_1) {
+      EXPECT_EQ(6ul, res.args->last_data_.size());
+      EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
+      EXPECT_GE(NCI_VERSION_1_1, res.args->last_data_[4]);
+      EXPECT_EQ(1ul, res.args->last_data_[5]);
+  } else {
+      EXPECT_EQ(4ul, res.args->last_data_.size());
+      EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
+      // Wait for CORE_RESET_NTF
+      res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
+      EXPECT_TRUE(res.no_timeout);
+      // Check if reset trigger was due to CORE_RESET_CMD
+      EXPECT_LE(8ul, res.args->last_data_.size());
+      EXPECT_EQ(2ul, res.args->last_data_[3]);
+      EXPECT_EQ(1ul, res.args->last_data_[4]);
+      EXPECT_EQ(NCI_VERSION_2, res.args->last_data_[5]);
+  }
 }
 
 /*
@@ -199,8 +269,8 @@
 
 /*
  * WriteInvalidAndThenValidCommand:
- * Sends an Faulty Data Packet
- * Waits for CORE_INTERFACE_ERROR_NTF
+ * Sends an Invalid command
+ * Waits for response
  * Checks SYNTAX_ERROR status
  * Repeat for 100 times appending 0xFF each time to the packet
  * Send CORE_CONN_CREATE_CMD for loop-back mode
@@ -214,7 +284,13 @@
     auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
     EXPECT_TRUE(res.no_timeout);
     EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
-    EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
+
+    /* NCI 2.0 sends CORE_RESET_NTF everytime. */
+    if (nci_version == NCI_VERSION_2) {
+        // Wait for CORE_RESET_NTF
+        res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
+        EXPECT_TRUE(res.no_timeout);
+    }
 
     cmd = CORE_INIT_CMD;
     data = cmd;
@@ -225,7 +301,7 @@
     EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
 
     // Send an Error Data Packet
-    cmd = FAULTY_DATA_PACKET;
+    cmd = INVALID_COMMAND;
     data = cmd;
     size_t size = data.size();
 
@@ -233,13 +309,10 @@
         data.resize(++size);
         data[size - 1] = 0xFF;
         EXPECT_EQ(data.size(), nfc_->write(data));
-        // Wait for CORE_INTERFACE_ERROR_NTF
+        // Wait for response with SYNTAX_ERROR
         res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
         EXPECT_TRUE(res.no_timeout);
-        EXPECT_EQ(5ul, res.args->last_data_.size());
-        EXPECT_EQ(0x60, res.args->last_data_[0]);
-        EXPECT_EQ(0x08, res.args->last_data_[1]);
-        EXPECT_EQ(0x02, res.args->last_data_[2]);
+        EXPECT_EQ(4ul, res.args->last_data_.size());
         EXPECT_EQ(SYNTAX_ERROR, res.args->last_data_[3]);
   }
 
@@ -268,7 +341,13 @@
     auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
     EXPECT_TRUE(res.no_timeout);
     EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
-    EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
+
+    /* NCI 2.0 sends CORE_RESET_NTF everytime. */
+    if (nci_version == NCI_VERSION_2) {
+        // Wait for CORE_RESET_NTF
+        res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
+        EXPECT_TRUE(res.no_timeout);
+    }
 
     cmd = CORE_INIT_CMD;
     data = cmd;
@@ -379,7 +458,13 @@
   // most devices.
   for (int i = 10; i <= 16; i++) {
       data[0] = i;
-      EXPECT_EQ(NfcStatus::OK, nfc_->coreInitialized(data));
+      NfcStatus status = nfc_->coreInitialized(data);
+
+      /* In case coreInitialized returned FAILED, do not wait for
+       * POST_INIT_CLPT event. */
+      if (status == NfcStatus::FAILED) continue;
+
+      EXPECT_EQ(NfcStatus::OK, status);
       // Wait for NfcEvent.POST_INIT_CPLT
       auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
       EXPECT_TRUE(res.no_timeout);
diff --git a/radio/1.1/Android.mk b/radio/1.1/Android.mk
index 305b661..b83ac80 100644
--- a/radio/1.1/Android.mk
+++ b/radio/1.1/Android.mk
@@ -75,6 +75,101 @@
 LOCAL_GENERATED_SOURCES += $(GEN)
 
 #
+# Build types.hal (ImsiEncryptionInfo)
+#
+GEN := $(intermediates)/android/hardware/radio/V1_1/ImsiEncryptionInfo.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+        -Ljava \
+        -randroid.hardware:hardware/interfaces \
+        -randroid.hidl:system/libhidl/transport \
+        android.hardware.radio@1.1::types.ImsiEncryptionInfo
+
+$(GEN): $(LOCAL_PATH)/types.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build types.hal (KeepaliveRequest)
+#
+GEN := $(intermediates)/android/hardware/radio/V1_1/KeepaliveRequest.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+        -Ljava \
+        -randroid.hardware:hardware/interfaces \
+        -randroid.hidl:system/libhidl/transport \
+        android.hardware.radio@1.1::types.KeepaliveRequest
+
+$(GEN): $(LOCAL_PATH)/types.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build types.hal (KeepaliveStatus)
+#
+GEN := $(intermediates)/android/hardware/radio/V1_1/KeepaliveStatus.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+        -Ljava \
+        -randroid.hardware:hardware/interfaces \
+        -randroid.hidl:system/libhidl/transport \
+        android.hardware.radio@1.1::types.KeepaliveStatus
+
+$(GEN): $(LOCAL_PATH)/types.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build types.hal (KeepaliveStatusCode)
+#
+GEN := $(intermediates)/android/hardware/radio/V1_1/KeepaliveStatusCode.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+        -Ljava \
+        -randroid.hardware:hardware/interfaces \
+        -randroid.hidl:system/libhidl/transport \
+        android.hardware.radio@1.1::types.KeepaliveStatusCode
+
+$(GEN): $(LOCAL_PATH)/types.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build types.hal (KeepaliveType)
+#
+GEN := $(intermediates)/android/hardware/radio/V1_1/KeepaliveType.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+        -Ljava \
+        -randroid.hardware:hardware/interfaces \
+        -randroid.hidl:system/libhidl/transport \
+        android.hardware.radio@1.1::types.KeepaliveType
+
+$(GEN): $(LOCAL_PATH)/types.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
 # Build types.hal (NetworkScanRequest)
 #
 GEN := $(intermediates)/android/hardware/radio/V1_1/NetworkScanRequest.java
@@ -256,6 +351,8 @@
 $(GEN): $(HIDL)
 $(GEN): PRIVATE_HIDL := $(HIDL)
 $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IRadioResponse.hal
+$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal
+$(GEN): $(LOCAL_PATH)/types.hal
 $(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
 $(GEN): PRIVATE_CUSTOM_TOOL = \
         $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
@@ -343,6 +440,101 @@
 LOCAL_GENERATED_SOURCES += $(GEN)
 
 #
+# Build types.hal (ImsiEncryptionInfo)
+#
+GEN := $(intermediates)/android/hardware/radio/V1_1/ImsiEncryptionInfo.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+        -Ljava \
+        -randroid.hardware:hardware/interfaces \
+        -randroid.hidl:system/libhidl/transport \
+        android.hardware.radio@1.1::types.ImsiEncryptionInfo
+
+$(GEN): $(LOCAL_PATH)/types.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build types.hal (KeepaliveRequest)
+#
+GEN := $(intermediates)/android/hardware/radio/V1_1/KeepaliveRequest.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+        -Ljava \
+        -randroid.hardware:hardware/interfaces \
+        -randroid.hidl:system/libhidl/transport \
+        android.hardware.radio@1.1::types.KeepaliveRequest
+
+$(GEN): $(LOCAL_PATH)/types.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build types.hal (KeepaliveStatus)
+#
+GEN := $(intermediates)/android/hardware/radio/V1_1/KeepaliveStatus.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+        -Ljava \
+        -randroid.hardware:hardware/interfaces \
+        -randroid.hidl:system/libhidl/transport \
+        android.hardware.radio@1.1::types.KeepaliveStatus
+
+$(GEN): $(LOCAL_PATH)/types.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build types.hal (KeepaliveStatusCode)
+#
+GEN := $(intermediates)/android/hardware/radio/V1_1/KeepaliveStatusCode.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+        -Ljava \
+        -randroid.hardware:hardware/interfaces \
+        -randroid.hidl:system/libhidl/transport \
+        android.hardware.radio@1.1::types.KeepaliveStatusCode
+
+$(GEN): $(LOCAL_PATH)/types.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build types.hal (KeepaliveType)
+#
+GEN := $(intermediates)/android/hardware/radio/V1_1/KeepaliveType.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+        -Ljava \
+        -randroid.hardware:hardware/interfaces \
+        -randroid.hidl:system/libhidl/transport \
+        android.hardware.radio@1.1::types.KeepaliveType
+
+$(GEN): $(LOCAL_PATH)/types.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
 # Build types.hal (NetworkScanRequest)
 #
 GEN := $(intermediates)/android/hardware/radio/V1_1/NetworkScanRequest.java
@@ -524,6 +716,8 @@
 $(GEN): $(HIDL)
 $(GEN): PRIVATE_HIDL := $(HIDL)
 $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IRadioResponse.hal
+$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal
+$(GEN): $(LOCAL_PATH)/types.hal
 $(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
 $(GEN): PRIVATE_CUSTOM_TOOL = \
         $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
diff --git a/radio/1.1/IRadio.hal b/radio/1.1/IRadio.hal
index b3e21e7..22d27d4 100644
--- a/radio/1.1/IRadio.hal
+++ b/radio/1.1/IRadio.hal
@@ -34,23 +34,13 @@
      * switch and everytime the framework receives a new certificate.
      *
      * @param serial Serial number of request.
-     * @param carrierKey Carrier specific key to be used for encryption. It must
-     *        be opaque to the framework. This is the byte-stream representation
-     *        of the key. This is an external encoded form for the key used when
-     *        a standard representation of the key is needed outside the Java
-     *        Virtual Machine, as when transmitting the key to some other party.
-     *        The key is encoded according to a standard format
-     *        (such as X.509 SubjectPublicKeyInfo or PKCS#8), and is returned using
-     *        the getEncoded method.
-     * @param keyIdentifier This is an opaque value we're given by the carrier
-     *        and is returned to the carrier. This is used by the server to
-     *        help it locate the private key to decrypt the permanent identity.
+     * @param message ImsiEncryptionInfo as defined in types.hal.
+     *
      *
      * Response callback is
      * IRadioResponse.setCarrierInfoForImsiEncryptionResponse()
      */
-     oneway setCarrierInfoForImsiEncryption(int32_t serial, vec<uint8_t> carrierKey,
-             string keyIdentifier);
+     oneway setCarrierInfoForImsiEncryption(int32_t serial, ImsiEncryptionInfo imsiEncryptionInfo);
 
     /**
      * Set SIM card power state.
@@ -99,4 +89,24 @@
      * Response function is IRadioResponse.stopNetworkScanResponse()
      */
     oneway stopNetworkScan(int32_t serial);
+
+    /**
+     * Start a Keepalive session (for IPsec)
+     *
+     * @param serial Serial number of request.
+     * @param keepalive A request structure containing all necessary info to describe a keepalive
+     *
+     * Response function is IRadioResponse.startKeepaliveResponse()
+     */
+    oneway startKeepalive(int32_t serial, KeepaliveRequest keepalive);
+
+    /**
+     * Stop an ongoing Keepalive session (for IPsec)
+     *
+     * @param serial Serial number of request.
+     * @param sessionHandle The handle that was provided by IRadioResponse.startKeepaliveResponse
+     *
+     * Response function is IRadioResponse.stopKeepaliveResponse()
+     */
+    oneway stopKeepalive(int32_t serial, int32_t sessionHandle);
 };
diff --git a/radio/1.1/IRadioIndication.hal b/radio/1.1/IRadioIndication.hal
index 27b6ec2..a0ad9b2 100644
--- a/radio/1.1/IRadioIndication.hal
+++ b/radio/1.1/IRadioIndication.hal
@@ -39,4 +39,15 @@
      * @param result Network scan result as NetworkScanResult defined in types.hal
      */
     oneway networkScanResult(RadioIndicationType type, NetworkScanResult result);
-};
\ No newline at end of file
+
+    /**
+     * Indicates a status update for a particular Keepalive session. This must include
+     * a handle for a previous session and should include a status update regarding the
+     * state of a keepalive. Unsolicited keepalive status reports should never be
+     * PENDING as unsolicited status should only be sent when known.
+     *
+     * @param type Type of radio indication
+     * @param status Status information for a Keepalive session
+     */
+    oneway keepaliveStatus(RadioIndicationType type, KeepaliveStatus status);
+};
diff --git a/radio/1.1/IRadioResponse.hal b/radio/1.1/IRadioResponse.hal
index 7415252..4e7bf43 100644
--- a/radio/1.1/IRadioResponse.hal
+++ b/radio/1.1/IRadioResponse.hal
@@ -71,4 +71,26 @@
      *   RadioError:MODEM_ERR
      */
     oneway stopNetworkScanResponse(RadioResponseInfo info);
+
+    /**
+     * @param info Response info struct containing response type, serial no. and error
+     * @param status Status object containing a new handle and a current status. The
+     * status returned here may be PENDING to indicate that the radio has not yet
+     * processed the keepalive request.
+     *
+     * Valid errors returned:
+     *   RadioError:NONE
+     *   RadioError:NO_RESOURCES
+     *   RadioError:INVALID_ARGUMENTS
+     */
+    oneway startKeepaliveResponse(RadioResponseInfo info, KeepaliveStatus status);
+
+    /**
+     * @param info Response info struct containing response type, serial no. and error
+     *
+     * Valid errors returned:
+     *   RadioError:NONE
+     *   RadioError:INVALID_ARGUMENTS
+     */
+    oneway stopKeepaliveResponse(RadioResponseInfo info);
 };
diff --git a/radio/1.1/types.hal b/radio/1.1/types.hal
index 245d96c..a8d836c 100644
--- a/radio/1.1/types.hal
+++ b/radio/1.1/types.hal
@@ -132,6 +132,19 @@
     COMPLETE = 2,                           // The result contains the last part of the scan results
 };
 
+enum KeepaliveType : int32_t {
+    NATT_IPV4 = 0,                          // Keepalive specified by RFC 3948 Sec. 2.3 using IPv4
+    NATT_IPV6 = 1,                          // Keepalive specified by RFC 3948 Sec. 2.3 using IPv6
+};
+
+enum KeepaliveStatusCode : int32_t {
+    ACTIVE,                                 // Keepalive is currently active
+    INACTIVE,                               // Keepalive is inactive, which indicates an error
+    PENDING,                                // Requested keepalive has not yet been processed by
+                                            // the modem. Only allowed in a RESPONSE message to
+                                            // a REQUEST
+};
+
 struct RadioAccessSpecifier {
     RadioAccessNetworks radioAccessNetwork; // The type of network to scan
     vec<GeranBands> geranBands;             // Valid only if radioAccessNetwork = GERAN
@@ -162,3 +175,44 @@
     RadioError error;                       // The error code of the incremental result
     vec<CellInfo> networkInfos;             // List of network information as CellInfo
 };
+
+struct ImsiEncryptionInfo {
+    string mcc;                   // MCC of the Carrier.
+    string mnc;                   // MNC of the Carrier.
+    vec<uint8_t> carrierKey;      // Carrier specific key to be used for encryption. It must
+                                  // be opaque to the framework. This is the byte-stream
+                                  // representation of the key. This is an external encoded
+                                  // form for the key used when a standard representation of
+                                  // the key is needed outside the Java Virtual Machine, as
+                                  // when transmitting the key to some other party.
+                                  // The key is encoded according to a standard format
+                                  // (such as X.509 SubjectPublicKeyInfo or PKCS#8), and is
+                                  // returned using the getEncoded method as defined on the
+                                  // java.security.Key interface.
+    string keyIdentifier;         // This is an opaque value we're given by the carrier
+                                  // and is returned to the carrier. This is used by the server to
+                                  // help it locate the private key to decrypt the permanent
+                                  // identity.
+    int64_t expirationTime;       // date-time in UTC when the key will expire.
+};
+
+struct KeepaliveRequest {
+    KeepaliveType type;                     // The format of the keepalive packet
+    vec<uint8_t> sourceAddress;             // source address with type = family, in network
+                                            // byte order
+    int32_t sourcePort;                     // source port if relevant for the given type
+                                            // INT_MAX: 0x7FFFFFFF denotes that the field is unused
+    vec<uint8_t> destinationAddress;        // destination address with type = family, in network
+                                            // byte order
+    int32_t destinationPort;                // destination if relevant for the given type
+                                            // INT_MAX: 0x7FFFFFFF denotes that the field is unused
+    int32_t maxKeepaliveIntervalMillis;     // the max interval between packets, in milliseconds
+    int32_t cid;                            // Context ID, returned in setupDataCallResponse
+                                            // that uniquely identifies the data call to which
+                                            // this keepalive must applied
+};
+
+struct KeepaliveStatus {
+    int32_t sessionHandle;                  // the sessionHandle provided by the api
+    KeepaliveStatusCode code;               // status for the given keepalive
+};