diff options
Diffstat (limited to 'src/charon/control')
-rw-r--r-- | src/charon/control/interfaces/xml_interface.c | 75 | ||||
-rw-r--r-- | src/charon/control/interfaces/xml_interface.xml | 27 |
2 files changed, 101 insertions, 1 deletions
diff --git a/src/charon/control/interfaces/xml_interface.c b/src/charon/control/interfaces/xml_interface.c index 02da1064d..7a44c03fb 100644 --- a/src/charon/control/interfaces/xml_interface.c +++ b/src/charon/control/interfaces/xml_interface.c @@ -283,6 +283,49 @@ static void request_query_ikesa(xmlTextReaderPtr reader, xmlTextWriterPtr writer xmlTextWriterEndElement(writer); } + +/** + * process a *terminate control request message + */ +static void request_control_terminate(xmlTextReaderPtr reader, + xmlTextWriterPtr writer, bool ike) +{ + while (xmlTextReaderRead(reader)) + { + if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_ELEMENT) + { + if (streq(xmlTextReaderConstName(reader), "id")) + { + if (xmlTextReaderRead(reader) && + xmlTextReaderNodeType(reader) == XML_READER_TYPE_TEXT) + { + const char *str; + u_int32_t id; + + str = xmlTextReaderConstValue(reader); + if (str == NULL || !(id = atoi(str))) + { + DBG1(DBG_CFG, "error parsing XML id string"); + break; + } + DBG1(DBG_CFG, "terminating %s_SA %d", ike ? "IKE" : "CHILD", id); + if (ike) + { + charon->interfaces->terminate_ike(charon->interfaces, + id, interface_manager_cb_empty, NULL); + } + else + { + charon->interfaces->terminate_child(charon->interfaces, + id, interface_manager_cb_empty, NULL); + } + break; + } + } + } + } +} + /** * process a query request */ @@ -306,6 +349,33 @@ static void request_query(xmlTextReaderPtr reader, xmlTextWriterPtr writer) } /** + * process a control request + */ +static void request_control(xmlTextReaderPtr reader, xmlTextWriterPtr writer) +{ + /* <control> */ + xmlTextWriterStartElement(writer, "control"); + while (xmlTextReaderRead(reader)) + { + if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_ELEMENT) + { + if (streq(xmlTextReaderConstName(reader), "ikesaterminate")) + { + request_control_terminate(reader, writer, TRUE); + break; + } + if (streq(xmlTextReaderConstName(reader), "childsaterminate")) + { + request_control_terminate(reader, writer, FALSE); + break; + } + } + } + /* </control> */ + xmlTextWriterEndElement(writer); +} + +/** * process a request message */ static void request(xmlTextReaderPtr reader, char *id, int fd) @@ -337,6 +407,11 @@ static void request(xmlTextReaderPtr reader, char *id, int fd) request_query(reader, writer); break; } + if (streq(xmlTextReaderConstName(reader), "control")) + { + request_control(reader, writer); + break; + } } } /* </message> and close document */ diff --git a/src/charon/control/interfaces/xml_interface.xml b/src/charon/control/interfaces/xml_interface.xml index 466d95f34..7eaf4ed8a 100644 --- a/src/charon/control/interfaces/xml_interface.xml +++ b/src/charon/control/interfaces/xml_interface.xml @@ -39,6 +39,17 @@ <!-- others --> </element> </optional> + <optional> + <element name="control"> + <optional> + <ref name="ControlRequestIkeTerminate"/> + </optional> + <optional> + <ref name="ControlRequestChildTerminate"/> + </optional> + <!-- others --> + </element> + </optional> <!-- others --> </group> <group> @@ -55,7 +66,7 @@ <optional> <element name="query"> <optional> - <ref name="QueryResponseIkesa"/> + <ref name="ikesalist"/> </optional> <!-- others --> </element> @@ -176,6 +187,20 @@ </zeroOrMore> </element> </define> + <define name="ControlRequestIkeTerminate"> + <element name="ikesaterminate"> + <element name="id"> + <data type="positiveInteger"/> + </element> + </element> + </define> + <define name="ControlRequestChildTerminate"> + <element name="childsaterminate"> + <element name="id"> + <data type="positiveInteger"/> + </element> + </element> + </define> <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <!-- identification and address --> <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> |