bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH hurd 16/30] pfinet: make the demuxers payload-aware


From: Justus Winter
Subject: [PATCH hurd 16/30] pfinet: make the demuxers payload-aware
Date: Thu, 27 Nov 2014 14:18:56 +0100

* pfinet/ethernet.c (ethernet_demuxer): Make the demuxer payload-aware.
* pfinet/main.c (pfinet_demuxer): Likewise.
---
 pfinet/ethernet.c | 20 +++++++++++++++++++-
 pfinet/main.c     | 12 ++++++++++--
 2 files changed, 29 insertions(+), 3 deletions(-)

diff --git a/pfinet/ethernet.c b/pfinet/ethernet.c
index 053fd1b..1678243 100644
--- a/pfinet/ethernet.c
+++ b/pfinet/ethernet.c
@@ -116,12 +116,30 @@ ethernet_demuxer (mach_msg_header_t *inp,
   int datalen;
   struct ether_device *edev;
   struct device *dev = 0;
+  mach_port_t local_port;
 
   if (inp->msgh_id != NET_RCV_MSG_ID)
     return 0;
 
+  if (MACH_MSGH_BITS_LOCAL (inp->msgh_bits) ==
+      MACH_MSG_TYPE_PROTECTED_PAYLOAD)
+    {
+      struct port_info *pi = ports_lookup_payload (NULL,
+                                                  inp->msgh_protected_payload,
+                                                  NULL);
+      if (pi)
+       {
+         local_port = pi->port_right;
+         ports_port_deref (pi);
+       }
+      else
+       local_port = MACH_PORT_NULL;
+    }
+  else
+    local_port = inp->msgh_local_port;
+
   for (edev = ether_dev; edev; edev = edev->next)
-    if (inp->msgh_local_port == edev->readptname)
+    if (local_port == edev->readptname)
       dev = &edev->dev;
 
   if (! dev)
diff --git a/pfinet/main.c b/pfinet/main.c
index 0f1fbfc..8716fdb 100644
--- a/pfinet/main.c
+++ b/pfinet/main.c
@@ -86,8 +86,16 @@ pfinet_demuxer (mach_msg_header_t *inp,
 
   /* We have several classes in one bucket, which need to be demuxed
      differently.  */
-  pi = ports_lookup_port(pfinet_bucket, inp->msgh_local_port, 
socketport_class);
-  
+  if (MACH_MSGH_BITS_LOCAL (inp->msgh_bits) ==
+      MACH_MSG_TYPE_PROTECTED_PAYLOAD)
+    pi = ports_lookup_payload (pfinet_bucket,
+                              inp->msgh_protected_payload,
+                              socketport_class);
+  else
+    pi = ports_lookup_port (pfinet_bucket,
+                           inp->msgh_local_port,
+                           socketport_class);
+
   if (pi)
     {
       ports_port_deref (pi);
-- 
2.1.3




reply via email to

[Prev in Thread] Current Thread [Next in Thread]