summaryrefslogtreecommitdiff
path: root/debian/patches/0013-pfinet-make-the-demuxers-payload-aware.patch
blob: 39cb33ffb4345f46c335251d563b23533da414f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
From 09be8ecd3a467ab1772f9fd533212afaefd1e814 Mon Sep 17 00:00:00 2001
From: Justus Winter <4winter@informatik.uni-hamburg.de>
Date: Sun, 13 Apr 2014 14:03:48 +0200
Subject: [PATCH hurd 13/29] pfinet: make the demuxers payload-aware

* 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