mirror of
				https://git.proxmox.com/git/mirror_frr
				synced 2025-11-04 08:28:50 +00:00 
			
		
		
		
	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.
This commit is contained in:
		
							parent
							
								
									0ff4b9c967
								
							
						
					
					
						commit
						8046ba6ec4
					
				@ -455,7 +455,9 @@ bgpPeerTable (struct variable *v, oid name[], size_t *length,
 | 
			
		||||
  static struct in_addr addr;
 | 
			
		||||
  struct peer *peer;
 | 
			
		||||
 | 
			
		||||
  *write_method = NULL;
 | 
			
		||||
  if (smux_header_table(v, name, length, exact, var_len, write_method)
 | 
			
		||||
      == MATCH_FAILED)
 | 
			
		||||
    return NULL;
 | 
			
		||||
  memset (&addr, 0, sizeof (struct in_addr));
 | 
			
		||||
 | 
			
		||||
  peer = bgpPeerTable_lookup (v, name, length, &addr, exact);
 | 
			
		||||
@ -765,6 +767,9 @@ bgp4PathAttrTable (struct variable *v, oid name[], size_t *length,
 | 
			
		||||
  if (! bgp)
 | 
			
		||||
    return NULL;
 | 
			
		||||
 | 
			
		||||
  if (smux_header_table(v, name, length, exact, var_len, write_method)
 | 
			
		||||
      == MATCH_FAILED)
 | 
			
		||||
    return NULL;
 | 
			
		||||
  memset (&addr, 0, sizeof (struct prefix_ipv4));
 | 
			
		||||
 | 
			
		||||
  binfo = bgp4PathAttrLookup (v, name, length, bgp, &addr, exact);
 | 
			
		||||
 | 
			
		||||
@ -75,6 +75,8 @@ extern void smux_register_mib(const char *, struct variable *,
 | 
			
		||||
                              size_t, int, oid [], size_t);
 | 
			
		||||
extern int smux_header_generic (struct variable *, oid [], size_t *, 
 | 
			
		||||
                                int, size_t *, WriteMethod **);
 | 
			
		||||
extern int smux_header_table (struct variable *, oid *, size_t *, 
 | 
			
		||||
			      int, size_t *, WriteMethod **);
 | 
			
		||||
 | 
			
		||||
/* For traps, three OID are provided:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										20
									
								
								lib/snmp.c
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								lib/snmp.c
									
									
									
									
									
								
							@ -110,4 +110,24 @@ smux_header_generic (struct variable *v, oid *name, size_t *length, int exact,
 | 
			
		||||
 | 
			
		||||
  return MATCH_SUCCEEDED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
smux_header_table (struct variable *v, oid *name, size_t *length, int exact,
 | 
			
		||||
		   size_t *var_len, WriteMethod **write_method)
 | 
			
		||||
{
 | 
			
		||||
  /* If the requested OID name is less than OID prefix we
 | 
			
		||||
     handle, adjust it to our prefix. */
 | 
			
		||||
  if ((oid_compare (name, *length, v->name, v->namelen)) < 0)
 | 
			
		||||
    {
 | 
			
		||||
      if (exact)
 | 
			
		||||
	return MATCH_FAILED;
 | 
			
		||||
      oid_copy(name, v->name, v->namelen);
 | 
			
		||||
      *length = v->namelen;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  *write_method = 0;
 | 
			
		||||
  *var_len = sizeof(long);
 | 
			
		||||
 | 
			
		||||
  return MATCH_SUCCEEDED;
 | 
			
		||||
}
 | 
			
		||||
#endif /* HAVE_SNMP */
 | 
			
		||||
 | 
			
		||||
@ -306,6 +306,10 @@ ospfv3AreaEntry (struct variable *v, oid *name, size_t *length,
 | 
			
		||||
  if (ospf6 == NULL)
 | 
			
		||||
    return NULL;
 | 
			
		||||
 | 
			
		||||
  if (smux_header_table(v, name, length, exact, var_len, write_method)
 | 
			
		||||
      == MATCH_FAILED)
 | 
			
		||||
    return NULL;
 | 
			
		||||
 | 
			
		||||
  len = *length - v->namelen;
 | 
			
		||||
  len = (len >= sizeof (u_int32_t) ? sizeof (u_int32_t) : 0);
 | 
			
		||||
  if (exact && len != sizeof (u_int32_t))
 | 
			
		||||
@ -372,6 +376,10 @@ ospfv3AreaLsdbEntry (struct variable *v, oid *name, size_t *length,
 | 
			
		||||
  struct ospf6_area *oa;
 | 
			
		||||
  struct listnode *node;
 | 
			
		||||
 | 
			
		||||
  if (smux_header_table(v, name, length, exact, var_len, write_method)
 | 
			
		||||
      == MATCH_FAILED)
 | 
			
		||||
    return NULL;
 | 
			
		||||
 | 
			
		||||
  memset (&area_id, 0, sizeof (struct in_addr));
 | 
			
		||||
  type = 0;
 | 
			
		||||
  memset (&id, 0, sizeof (struct in_addr));
 | 
			
		||||
 | 
			
		||||
@ -704,6 +704,10 @@ ospfAreaEntry (struct variable *v, oid *name, size_t *length, int exact,
 | 
			
		||||
  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 @@ ospfStubAreaEntry (struct variable *v, oid *name, size_t *length,
 | 
			
		||||
  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 @@ ospfLsdbEntry (struct variable *v, oid *name, size_t *length, int exact,
 | 
			
		||||
  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 @@ ospfAreaRangeEntry (struct variable *v, oid *name, size_t *length, int exact,
 | 
			
		||||
  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 @@ ospfHostEntry (struct variable *v, oid *name, size_t *length, int exact,
 | 
			
		||||
  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 @@ ospfIfEntry (struct variable *v, oid *name, size_t *length, int exact,
 | 
			
		||||
  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 @@ ospfIfMetricEntry (struct variable *v, oid *name, size_t *length, int exact,
 | 
			
		||||
  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 @@ ospfVirtIfEntry (struct variable *v, oid *name, size_t *length, int exact,
 | 
			
		||||
  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 @@ ospfNbrEntry (struct variable *v, oid *name, size_t *length, int exact,
 | 
			
		||||
  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 @@ ospfVirtNbrEntry (struct variable *v, oid *name, size_t *length, int exact,
 | 
			
		||||
  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 @@ ospfExtLsdbEntry (struct variable *v, oid *name, size_t *length, int exact,
 | 
			
		||||
  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 @@ static u_char *
 | 
			
		||||
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) 
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
@ -345,6 +345,10 @@ rip2IfStatEntry (struct variable *v, oid name[], size_t *length,
 | 
			
		||||
  static struct in_addr addr;
 | 
			
		||||
  static long valid = SNMP_VALID;
 | 
			
		||||
 | 
			
		||||
  if (smux_header_table(v, name, length, exact, var_len, write_method)
 | 
			
		||||
      == MATCH_FAILED)
 | 
			
		||||
    return NULL;
 | 
			
		||||
 | 
			
		||||
  memset (&addr, 0, sizeof (struct in_addr));
 | 
			
		||||
  
 | 
			
		||||
  /* Lookup interface. */
 | 
			
		||||
@ -448,6 +452,10 @@ rip2IfConfAddress (struct variable *v, oid name[], size_t *length,
 | 
			
		||||
  struct interface *ifp;
 | 
			
		||||
  struct rip_interface *ri;
 | 
			
		||||
 | 
			
		||||
  if (smux_header_table(v, name, length, exact, val_len, write_method)
 | 
			
		||||
      == MATCH_FAILED)
 | 
			
		||||
    return NULL;
 | 
			
		||||
 | 
			
		||||
  memset (&addr, 0, sizeof (struct in_addr));
 | 
			
		||||
  
 | 
			
		||||
  /* Lookup interface. */
 | 
			
		||||
@ -518,6 +526,10 @@ rip2PeerTable (struct variable *v, oid name[], size_t *length,
 | 
			
		||||
 | 
			
		||||
  struct rip_peer *peer;
 | 
			
		||||
 | 
			
		||||
  if (smux_header_table(v, name, length, exact, val_len, write_method)
 | 
			
		||||
      == MATCH_FAILED)
 | 
			
		||||
    return NULL;
 | 
			
		||||
 | 
			
		||||
  memset (&addr, 0, sizeof (struct in_addr));
 | 
			
		||||
  
 | 
			
		||||
  /* Lookup interface. */
 | 
			
		||||
 | 
			
		||||
@ -451,6 +451,10 @@ ipFwTable (struct variable *v, oid objid[], size_t *objid_len,
 | 
			
		||||
  static struct in_addr netmask;
 | 
			
		||||
  struct nexthop *nexthop;
 | 
			
		||||
 | 
			
		||||
  if (smux_header_table(v, objid, objid_len, exact, val_len, write_method)
 | 
			
		||||
      == MATCH_FAILED)
 | 
			
		||||
    return NULL;
 | 
			
		||||
 | 
			
		||||
  get_fwtable_route_node(v, objid, objid_len, exact, &np, &rib);
 | 
			
		||||
  if (!np)
 | 
			
		||||
    return NULL;
 | 
			
		||||
@ -549,6 +553,10 @@ static u_char *
 | 
			
		||||
ipCidrTable (struct variable *v, oid objid[], size_t *objid_len,
 | 
			
		||||
	     int exact, size_t *val_len, WriteMethod **write_method)
 | 
			
		||||
{
 | 
			
		||||
  if (smux_header_table(v, objid, objid_len, exact, val_len, write_method)
 | 
			
		||||
      == MATCH_FAILED)
 | 
			
		||||
    return NULL;
 | 
			
		||||
 | 
			
		||||
  switch (v->magic)
 | 
			
		||||
    {
 | 
			
		||||
    case IPCIDRROUTEDEST:
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user