snmp: let handlers accept OID from a lesser prefix

Most table handlers do not expect to be given an OID whose prefix is
outside what they can handle. This is not a problem with the SMUX
implementation since it always correct the OID such that the prefix
matches. However, this is not the case for the AgentX
implementation. A new function, smux_header_table() is used to do this
normalization.
diff --git a/ospfd/ospf_snmp.c b/ospfd/ospf_snmp.c
index c8416de..1daf0d6 100644
--- a/ospfd/ospf_snmp.c
+++ b/ospfd/ospf_snmp.c
@@ -704,6 +704,10 @@
   struct ospf_area *area;
   struct in_addr addr;
 
+  if (smux_header_table(v, name, length, exact, var_len, write_method)
+      == MATCH_FAILED)
+    return NULL;
+
   memset (&addr, 0, sizeof (struct in_addr));
 
   area = ospfAreaLookup (v, name, length, &addr, exact);
@@ -847,6 +851,10 @@
   struct ospf_area *area;
   struct in_addr addr;
 
+  if (smux_header_table(v, name, length, exact, var_len, write_method)
+      == MATCH_FAILED)
+    return NULL;
+
   memset (&addr, 0, sizeof (struct in_addr));
 
   area = ospfStubAreaLookup (v, name, length, &addr, exact);
@@ -1078,6 +1086,10 @@
   struct in_addr router_id;
   struct ospf *ospf;
 
+  if (smux_header_table(v, name, length, exact, var_len, write_method)
+      == MATCH_FAILED)
+    return NULL;
+
   /* INDEX { ospfLsdbAreaId, ospfLsdbType,
      ospfLsdbLsid, ospfLsdbRouterId } */
 
@@ -1240,6 +1252,10 @@
   struct in_addr mask;
   struct ospf *ospf;
   
+  if (smux_header_table(v, name, length, exact, var_len, write_method)
+      == MATCH_FAILED)
+    return NULL;
+
   /* Check OSPF instance. */
   ospf = ospf_lookup ();
   if (ospf == NULL)
@@ -1344,6 +1360,10 @@
   struct in_addr addr;
   struct ospf *ospf;
 
+  if (smux_header_table(v, name, length, exact, var_len, write_method)
+      == MATCH_FAILED)
+    return NULL;
+
   /* Check OSPF instance. */
   ospf = ospf_lookup ();
   if (ospf == NULL)
@@ -1679,6 +1699,10 @@
   struct ospf_interface *oi;
   struct ospf *ospf;
 
+  if (smux_header_table(v, name, length, exact, var_len, write_method)
+      == MATCH_FAILED)
+    return NULL;
+
   ifindex = 0;
   memset (&ifaddr, 0, sizeof (struct in_addr));
 
@@ -1847,6 +1871,10 @@
   struct ospf_interface *oi;
   struct ospf *ospf;
 
+  if (smux_header_table(v, name, length, exact, var_len, write_method)
+      == MATCH_FAILED)
+    return NULL;
+
   ifindex = 0;
   memset (&ifaddr, 0, sizeof (struct in_addr));
 
@@ -2039,6 +2067,10 @@
   struct in_addr area_id;
   struct in_addr neighbor;
 
+  if (smux_header_table(v, name, length, exact, var_len, write_method)
+      == MATCH_FAILED)
+    return NULL;
+
   memset (&area_id, 0, sizeof (struct in_addr));
   memset (&neighbor, 0, sizeof (struct in_addr));
 
@@ -2272,6 +2304,10 @@
   struct ospf_neighbor *nbr;
   struct ospf_interface *oi;
 
+  if (smux_header_table(v, name, length, exact, var_len, write_method)
+      == MATCH_FAILED)
+    return NULL;
+
   memset (&nbr_addr, 0, sizeof (struct in_addr));
   ifindex = 0;
   
@@ -2334,6 +2370,10 @@
   struct in_addr neighbor;
   struct ospf *ospf;
 
+  if (smux_header_table(v, name, length, exact, var_len, write_method)
+      == MATCH_FAILED)
+    return NULL;
+
   memset (&area_id, 0, sizeof (struct in_addr));
   memset (&neighbor, 0, sizeof (struct in_addr));
 
@@ -2482,6 +2522,10 @@
   struct in_addr router_id;
   struct ospf *ospf;
 
+  if (smux_header_table(v, name, length, exact, var_len, write_method)
+      == MATCH_FAILED)
+    return NULL;
+
   type = OSPF_AS_EXTERNAL_LSA;
   memset (&ls_id, 0, sizeof (struct in_addr));
   memset (&router_id, 0, sizeof (struct in_addr));
@@ -2533,6 +2577,10 @@
 ospfAreaAggregateEntry (struct variable *v, oid *name, size_t *length,
 			int exact, size_t *var_len, WriteMethod **write_method)
 {
+  if (smux_header_table(v, name, length, exact, var_len, write_method)
+      == MATCH_FAILED)
+    return NULL;
+
   /* Return the current value of the variable */
   switch (v->magic) 
     {