OSDN Git Service

net/bpf_jit: SPARC: split VLAN_PRESENT bit handling from VLAN_TCI
authorMichał Mirosław <mirq-linux@rere.qmqm.pl>
Sat, 10 Nov 2018 18:58:36 +0000 (19:58 +0100)
committerDavid S. Miller <davem@davemloft.net>
Sat, 17 Nov 2018 03:25:28 +0000 (19:25 -0800)
Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc/net/bpf_jit_comp_32.c

index a5ff886..48f3c04 100644 (file)
@@ -552,15 +552,18 @@ void bpf_jit_compile(struct bpf_prog *fp)
                                emit_skb_load32(hash, r_A);
                                break;
                        case BPF_ANC | SKF_AD_VLAN_TAG:
-                       case BPF_ANC | SKF_AD_VLAN_TAG_PRESENT:
                                emit_skb_load16(vlan_tci, r_A);
-                               if (code != (BPF_ANC | SKF_AD_VLAN_TAG)) {
-                                       emit_alu_K(SRL, 12);
+#ifdef VLAN_TAG_PRESENT
+                               emit_loadimm(~VLAN_TAG_PRESENT, r_TMP);
+                               emit_and(r_A, r_TMP, r_A);
+#endif
+                               break;
+                       case BPF_ANC | SKF_AD_VLAN_TAG_PRESENT:
+                               __emit_skb_load8(__pkt_vlan_present_offset, r_A);
+                               if (PKT_VLAN_PRESENT_BIT)
+                                       emit_alu_K(SRL, PKT_VLAN_PRESENT_BIT);
+                               if (PKT_VLAN_PRESENT_BIT < 7)
                                        emit_andi(r_A, 1, r_A);
-                               } else {
-                                       emit_loadimm(~VLAN_TAG_PRESENT, r_TMP);
-                                       emit_and(r_A, r_TMP, r_A);
-                               }
                                break;
                        case BPF_LD | BPF_W | BPF_LEN:
                                emit_skb_load32(len, r_A);