<rdar://problem/7222658> Sleep Proxy + BTMM: (proxy side) SS wakes on its own 2-5...
authorcheshire@apple.com <cheshire@apple.com@214c2c4a-bf3b-4dcf-9390-e4dd3010487d>
Wed, 30 Sep 2009 01:31:29 +0000 (01:31 +0000)
committercheshire@apple.com <cheshire@apple.com@214c2c4a-bf3b-4dcf-9390-e4dd3010487d>
Wed, 30 Sep 2009 01:31:29 +0000 (01:31 +0000)
BPF filter needs to capture 20 more bytes, so we have the complete IKE Header to inspect

git-svn-id: http://svn.macosforge.org/repository/mDNSResponder/trunk@6711 214c2c4a-bf3b-4dcf-9390-e4dd3010487d

mDNSMacOSX/mDNSMacOSX.c

index cac6940..eceb23b 100644 (file)
@@ -1515,9 +1515,9 @@ mDNSexport void mDNSPlatformUpdateProxyList(mDNS *const m, const mDNSInterfaceID
        static const struct bpf_insn g6  = BPF_STMT(BPF_LD  + BPF_W   + BPF_ABS, 50);   // Read IPv6 Dst LSW (bytes 50,51,52,53)
 
        static const struct bpf_insn r4a = BPF_STMT(BPF_LDX + BPF_B   + BPF_MSH, 14);   // Get IP Header length (normally 20)
-       static const struct bpf_insn r4b = BPF_STMT(BPF_LD  + BPF_IMM,           34);   // A = 34 (14-byte Ethernet plus 20-byte TCP)
+       static const struct bpf_insn r4b = BPF_STMT(BPF_LD  + BPF_IMM,           54);   // A = 54 (14-byte Ethernet plus 20-byte TCP + 20 bytes spare)
        static const struct bpf_insn r4c = BPF_STMT(BPF_ALU + BPF_ADD + BPF_X,    0);   // A += IP Header length
-       static const struct bpf_insn r4d = BPF_STMT(BPF_RET + BPF_A, 0);                                // Success: Return Ethernet + IP + TCP
+       static const struct bpf_insn r4d = BPF_STMT(BPF_RET + BPF_A, 0);                                // Success: Return Ethernet + IP + TCP + 20 bytes spare (normally 74)
 
        static const struct bpf_insn r6a = BPF_STMT(BPF_RET + BPF_K, 94);                               // Success: Return Eth + IPv6 + TCP + 20 bytes spare
 
@@ -1536,6 +1536,13 @@ mDNSexport void mDNSPlatformUpdateProxyList(mDNS *const m, const mDNSInterfaceID
        // In summary, if we byte-swap all the non-numeric fields that shouldn't be swapped, and we *don't*
        // swap any of the numeric values that *should* be byte-swapped, then the filter will work correctly.
 
+       // IPSEC capture size notes:
+       //  8 bytes UDP header
+       //  4 bytes Non-ESP Marker
+       // 28 bytes IKE Header
+       // --
+       // 40 Total. Capturing TCP Header + 20 gets us enough bytes to receive the IKE Header in a UDP-encapsulated IKE packet.
+
        AuthRecord *rr;
        for (rr = m->ResourceRecords; rr; rr=rr->next)
                if (rr->resrec.InterfaceID == InterfaceID && rr->AddressProxy.type == mDNSAddrType_IPv4)