bpf: Allow overriding kernel version

This allows devices pretend they are on a different kernel version in
order to support different bpf features in case kernel backports are in
place.

Test: set ro.bpf.kver_override=5.4.186 in product.prop on sm8150 device
      based on 4.14 kernel with 5.4 bpf backported, boot
Change-Id: I50357ee832b01b11e499278244f77244c904e3e9
diff --git a/bpf/headers/include/bpf/KernelUtils.h b/bpf/headers/include/bpf/KernelUtils.h
index a36085a..360af0f 100644
--- a/bpf/headers/include/bpf/KernelUtils.h
+++ b/bpf/headers/include/bpf/KernelUtils.h
@@ -19,6 +19,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <sys/personality.h>
+#include <sys/system_properties.h>
 #include <sys/utsname.h>
 
 namespace android {
@@ -33,7 +34,13 @@
     unsigned kver_major = 0;
     unsigned kver_minor = 0;
     unsigned kver_sub = 0;
-    (void)sscanf(buf.release, "%u.%u.%u", &kver_major, &kver_minor, &kver_sub);
+    char kver_override[PROP_VALUE_MAX];
+    int kver_override_len = __system_property_get("ro.bpf.kver_override", kver_override);
+    if (kver_override_len > 0) {
+        (void)sscanf(kver_override, "%u.%u.%u", &kver_major, &kver_minor, &kver_sub);
+    } else {
+        (void)sscanf(buf.release, "%u.%u.%u", &kver_major, &kver_minor, &kver_sub);
+    }
     return KVER(kver_major, kver_minor, kver_sub);
 }