implemented IKE/CHILD_SA termination through XML interface
This commit is contained in:
@@ -283,6 +283,49 @@ static void request_query_ikesa(xmlTextReaderPtr reader, xmlTextWriterPtr writer
|
|||||||
xmlTextWriterEndElement(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
|
* process a query request
|
||||||
*/
|
*/
|
||||||
@@ -305,6 +348,33 @@ static void request_query(xmlTextReaderPtr reader, xmlTextWriterPtr writer)
|
|||||||
xmlTextWriterEndElement(writer);
|
xmlTextWriterEndElement(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
|
* process a request message
|
||||||
*/
|
*/
|
||||||
@@ -337,6 +407,11 @@ static void request(xmlTextReaderPtr reader, char *id, int fd)
|
|||||||
request_query(reader, writer);
|
request_query(reader, writer);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (streq(xmlTextReaderConstName(reader), "control"))
|
||||||
|
{
|
||||||
|
request_control(reader, writer);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* </message> and close document */
|
/* </message> and close document */
|
||||||
|
|||||||
@@ -39,6 +39,17 @@
|
|||||||
<!-- others -->
|
<!-- others -->
|
||||||
</element>
|
</element>
|
||||||
</optional>
|
</optional>
|
||||||
|
<optional>
|
||||||
|
<element name="control">
|
||||||
|
<optional>
|
||||||
|
<ref name="ControlRequestIkeTerminate"/>
|
||||||
|
</optional>
|
||||||
|
<optional>
|
||||||
|
<ref name="ControlRequestChildTerminate"/>
|
||||||
|
</optional>
|
||||||
|
<!-- others -->
|
||||||
|
</element>
|
||||||
|
</optional>
|
||||||
<!-- others -->
|
<!-- others -->
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
@@ -55,7 +66,7 @@
|
|||||||
<optional>
|
<optional>
|
||||||
<element name="query">
|
<element name="query">
|
||||||
<optional>
|
<optional>
|
||||||
<ref name="QueryResponseIkesa"/>
|
<ref name="ikesalist"/>
|
||||||
</optional>
|
</optional>
|
||||||
<!-- others -->
|
<!-- others -->
|
||||||
</element>
|
</element>
|
||||||
@@ -176,6 +187,20 @@
|
|||||||
</zeroOrMore>
|
</zeroOrMore>
|
||||||
</element>
|
</element>
|
||||||
</define>
|
</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 -->
|
<!-- identification and address -->
|
||||||
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
||||||
|
|||||||
Reference in New Issue
Block a user