summaryrefslogtreecommitdiff
path: root/TAO/tao/DiffServPolicy/DiffServ_Network_Priority_Hook.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tao/DiffServPolicy/DiffServ_Network_Priority_Hook.cpp')
-rw-r--r--TAO/tao/DiffServPolicy/DiffServ_Network_Priority_Hook.cpp106
1 files changed, 106 insertions, 0 deletions
diff --git a/TAO/tao/DiffServPolicy/DiffServ_Network_Priority_Hook.cpp b/TAO/tao/DiffServPolicy/DiffServ_Network_Priority_Hook.cpp
new file mode 100644
index 00000000000..52bf8eab4ad
--- /dev/null
+++ b/TAO/tao/DiffServPolicy/DiffServ_Network_Priority_Hook.cpp
@@ -0,0 +1,106 @@
+// @(#) $Id$
+
+#include "tao/DiffServPolicy/DiffServ_Network_Priority_Hook.h"
+#include "tao/PortableServer/Root_POA.h"
+#include "tao/PortableServer/POA_Policy_Set.h"
+#include "tao/DiffServPolicy/Server_Network_Priority_Policy.h"
+#include "tao/DiffServPolicy/DiffServPolicyC.h"
+#include "tao/Service_Context.h"
+#include "tao/TAO_Server_Request.h"
+#include "tao/Network_Priority_Protocols_Hooks.h"
+#include "tao/ORB_Core.h"
+#include "tao/Connection_Handler.h"
+#include "tao/Transport.h"
+
+ACE_RCSID(DiffServPolicy,
+ DiffServ_Network_Priority_Hook,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+TAO_DiffServ_Network_Priority_Hook::~TAO_DiffServ_Network_Priority_Hook(void)
+{
+}
+
+void
+TAO_DiffServ_Network_Priority_Hook::update_network_priority (
+ TAO_Root_POA &poa, TAO_POA_Policy_Set &policy_set)
+{
+ for (CORBA::ULong i = 0; i < policy_set.num_policies (); i++)
+ {
+ CORBA::Policy_var policy = policy_set.get_policy_by_index (i);
+
+ if (policy->policy_type () == TAO::NETWORK_PRIORITY_TYPE)
+ {
+ ::TAO::NetworkPriorityPolicy_var npp =
+ ::TAO::NetworkPriorityPolicy::_narrow (policy.in ());
+
+ if (!CORBA::is_nil (npp.in ()))
+ {
+ TAO::NetworkPriorityModel network_priority_model =
+ npp->network_priority_model ();
+
+ poa.cached_policies ().network_priority_model (
+ TAO::Portable_Server::Cached_Policies::NetworkPriorityModel (
+ network_priority_model));
+
+ TAO::DiffservCodepoint request_diffserv_codepoint =
+ npp->request_diffserv_codepoint ();
+
+ TAO::DiffservCodepoint reply_diffserv_codepoint =
+ npp->reply_diffserv_codepoint ();
+
+ poa.cached_policies ().request_diffserv_codepoint (
+ request_diffserv_codepoint);
+ poa.cached_policies ().reply_diffserv_codepoint (
+ reply_diffserv_codepoint);
+ }
+ }
+ }
+}
+
+void
+TAO_DiffServ_Network_Priority_Hook::set_dscp_codepoint (
+ TAO_ServerRequest &req, TAO_Root_POA &poa)
+{
+ CORBA::Long dscp_codepoint = 0;
+ TAO_Service_Context &request_service_context =
+ req.request_service_context ();
+
+ TAO_Network_Priority_Protocols_Hooks *nph =
+ poa.orb_core ().get_network_priority_protocols_hooks ();
+
+ TAO::Portable_Server::Cached_Policies::NetworkPriorityModel npm =
+ poa.cached_policies ().network_priority_model ();
+
+ if (npm == TAO::Portable_Server::Cached_Policies::
+ CLIENT_PROPAGATED_NETWORK_PRIORITY)
+ {
+ if (nph != 0)
+ {
+ dscp_codepoint = nph->get_dscp_codepoint (request_service_context);
+ }
+ }
+ else if (npm == TAO::Portable_Server::Cached_Policies::
+ SERVER_DECLARED_NETWORK_PRIORITY)
+ {
+ dscp_codepoint = poa.cached_policies ().reply_diffserv_codepoint ();
+ }
+
+ TAO_Connection_Handler *connection_handler =
+ req.transport ()->connection_handler ();
+ connection_handler->set_dscp_codepoint (dscp_codepoint);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_DEFINE (TAO_DiffServPolicy, TAO_DiffServ_Network_Priority_Hook)
+ACE_STATIC_SVC_DEFINE (TAO_DiffServ_Network_Priority_Hook,
+ ACE_TEXT ("TAO_Network_Priority_Hook"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_DiffServ_Network_Priority_Hook),
+ ACE_Service_Type::DELETE_THIS
+ | ACE_Service_Type::DELETE_OBJ,
+ 0)