]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
proto: proto_dev_type() returns interface type for base protocols too
authorPablo Neira Ayuso <pablo@netfilter.org>
Thu, 28 Jan 2016 19:53:48 +0000 (20:53 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Sun, 31 Jan 2016 22:43:36 +0000 (23:43 +0100)
The device protocol definition provides a mapping between the interface
type, ie. ARPHDR_*, and the overlying protocol base definition, eg.
proto_eth.

This patch updates proto_dev_type() so it also returns a mapping for
these overlying ethernet protocol definitions, ie. ip, ip6, vlan, ip,
arp.

This patch required to resolve problems with automatic dependency
generation for vlan in the netdev and inet families.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/proto.c

index 65ee158f41a5af2a2258ab5d1173e20e47b2916e..0cd9fdbd09e901d6251c0d80b172083f0c487a77 100644 (file)
@@ -94,13 +94,21 @@ static const struct dev_proto_desc dev_proto_desc[] = {
  */
 int proto_dev_type(const struct proto_desc *desc, uint16_t *res)
 {
-       unsigned int i;
+       const struct proto_desc *base;
+       unsigned int i, j;
 
        for (i = 0; i < array_size(dev_proto_desc); i++) {
-               if (dev_proto_desc[i].desc == desc) {
+               base = dev_proto_desc[i].desc;
+               if (base == desc) {
                        *res = dev_proto_desc[i].type;
                        return 0;
                }
+               for (j = 0; j < array_size(base->protocols); j++) {
+                       if (base->protocols[j].desc == desc) {
+                               *res = dev_proto_desc[i].type;
+                               return 0;
+                       }
+               }
        }
        return -1;
 }