mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-12-22 17:51:53 +00:00
SNMP: Refactor - use inline functions
Macros are replaced with inline functions.
This commit is contained in:
parent
fedaa0af5e
commit
709d0fdd19
@ -10,6 +10,46 @@
|
|||||||
|
|
||||||
#include "snmp_utils.h"
|
#include "snmp_utils.h"
|
||||||
|
|
||||||
|
inline void
|
||||||
|
snmp_pdu_context(struct snmp_pdu *pdu, sock *sk)
|
||||||
|
{
|
||||||
|
pdu->buffer = sk->tpos;
|
||||||
|
pdu->size = sk->tbuf + sk->tbsize - sk->tpos;
|
||||||
|
pdu->error = AGENTX_RES_NO_ERROR;
|
||||||
|
pdu->index = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void
|
||||||
|
snmp_session(const struct snmp_proto *p, struct agentx_header *h)
|
||||||
|
{
|
||||||
|
h->session_id = p->session_id;
|
||||||
|
h->transaction_id = p->transaction_id;
|
||||||
|
h->packet_id = p->packet_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int
|
||||||
|
snmp_has_context(const struct agentx_header *h)
|
||||||
|
{
|
||||||
|
return h->flags & AGENTX_NON_DEFAULT_CONTEXT;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline byte *
|
||||||
|
snmp_add_context(struct snmp_proto *p, struct agentx_header *h, uint contid)
|
||||||
|
{
|
||||||
|
h->flags = h->flags | AGENTX_NON_DEFAULT_CONTEXT;
|
||||||
|
// TODO append the context after the header
|
||||||
|
(void)p;
|
||||||
|
(void)contid;
|
||||||
|
return (void *)h + AGENTX_HEADER_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void *
|
||||||
|
snmp_varbind_data(const struct agentx_varbind *vb)
|
||||||
|
{
|
||||||
|
uint name_size = snmp_oid_size(&vb->name);
|
||||||
|
return (void *)&vb->name + name_size;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* snmp_is_oid_empty - check if oid is null-valued
|
* snmp_is_oid_empty - check if oid is null-valued
|
||||||
* @oid: object identifier to check
|
* @oid: object identifier to check
|
||||||
@ -136,7 +176,7 @@ snmp_varbind_size(struct agentx_varbind *vb, int byte_ord)
|
|||||||
if (s >= 0)
|
if (s >= 0)
|
||||||
return hdr_size + (uint) s;
|
return hdr_size + (uint) s;
|
||||||
|
|
||||||
void *data = ((void *) vb) + hdr_size;
|
void *data = snmp_varbind_data(vb);
|
||||||
|
|
||||||
if (vb->type == AGENTX_OBJECT_ID)
|
if (vb->type == AGENTX_OBJECT_ID)
|
||||||
return hdr_size + snmp_oid_size((struct oid *) data);
|
return hdr_size + snmp_oid_size((struct oid *) data);
|
||||||
@ -478,7 +518,7 @@ snmp_varbind_type32(struct agentx_varbind *vb, uint size, enum agentx_type type,
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
vb->type = type;
|
vb->type = type;
|
||||||
u32 *data = SNMP_VB_DATA(vb);
|
u32 *data = snmp_varbind_data(vb);
|
||||||
*data = val;
|
*data = val;
|
||||||
return (byte *)(data + 1);
|
return (byte *)(data + 1);
|
||||||
}
|
}
|
||||||
@ -516,7 +556,7 @@ snmp_varbind_ip4(struct agentx_varbind *vb, uint size, ip4_addr addr)
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
vb->type = AGENTX_IP_ADDRESS;
|
vb->type = AGENTX_IP_ADDRESS;
|
||||||
return snmp_put_ip4(SNMP_VB_DATA(vb), addr);
|
return snmp_put_ip4(snmp_varbind_data(vb), addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline byte *
|
inline byte *
|
||||||
@ -526,8 +566,7 @@ snmp_varbind_nstr(struct agentx_varbind *vb, uint size, const char *str, uint le
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
vb->type = AGENTX_OCTET_STRING;
|
vb->type = AGENTX_OCTET_STRING;
|
||||||
//die("snmp_varbind_nstr() %p.data = %p", vb, SNMP_VB_DATA(vb));
|
return snmp_put_nstr(snmp_varbind_data(vb), str, len);
|
||||||
return snmp_put_nstr(SNMP_VB_DATA(vb), str, len);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline enum agentx_type
|
inline enum agentx_type
|
||||||
|
@ -15,12 +15,16 @@ uint snmp_varbind_hdr_size_from_oid(struct oid *oid);
|
|||||||
uint snmp_varbind_header_size(struct agentx_varbind *vb);
|
uint snmp_varbind_header_size(struct agentx_varbind *vb);
|
||||||
uint snmp_varbind_size(struct agentx_varbind *vb, int byte_ord);
|
uint snmp_varbind_size(struct agentx_varbind *vb, int byte_ord);
|
||||||
int snmp_test_varbind(const struct agentx_varbind *vb);
|
int snmp_test_varbind(const struct agentx_varbind *vb);
|
||||||
|
void snmp_session(const struct snmp_proto *p, struct agentx_header *h);
|
||||||
|
int snmp_has_context(const struct agentx_header *h);
|
||||||
|
void snmp_pdu_context(struct snmp_pdu *pdu, sock *sk);
|
||||||
|
|
||||||
void snmp_oid_copy(struct oid *dest, const struct oid *src);
|
void snmp_oid_copy(struct oid *dest, const struct oid *src);
|
||||||
|
|
||||||
struct oid *snmp_oid_duplicate(pool *pool, const struct oid *oid);
|
struct oid *snmp_oid_duplicate(pool *pool, const struct oid *oid);
|
||||||
struct oid *snmp_oid_blank(struct snmp_proto *p);
|
struct oid *snmp_oid_blank(struct snmp_proto *p);
|
||||||
|
|
||||||
|
void *snmp_varbind_data(const struct agentx_varbind *vb);
|
||||||
struct agentx_varbind *snmp_create_varbind(byte* buf, struct oid *oid);
|
struct agentx_varbind *snmp_create_varbind(byte* buf, struct oid *oid);
|
||||||
byte *snmp_fix_varbind(struct agentx_varbind *vb, struct oid *new);
|
byte *snmp_fix_varbind(struct agentx_varbind *vb, struct oid *new);
|
||||||
|
|
||||||
|
@ -216,7 +216,8 @@ static void
|
|||||||
snmp_simple_response(struct snmp_proto *p, enum agentx_response_errs error, u16 index)
|
snmp_simple_response(struct snmp_proto *p, enum agentx_response_errs error, u16 index)
|
||||||
{
|
{
|
||||||
sock *sk = p->sock;
|
sock *sk = p->sock;
|
||||||
struct snmp_pdu c = SNMP_PDU_CONTEXT(sk);
|
struct snmp_pdu c;
|
||||||
|
snmp_pdu_context(&c, sk);
|
||||||
|
|
||||||
if (c.size < sizeof(struct agentx_response))
|
if (c.size < sizeof(struct agentx_response))
|
||||||
snmp_manage_tbuf(p, &c);
|
snmp_manage_tbuf(p, &c);
|
||||||
@ -240,7 +241,8 @@ open_pdu(struct snmp_proto *p, struct oid *oid)
|
|||||||
const struct snmp_config *cf = SKIP_BACK(struct snmp_config, cf, p->p.cf);
|
const struct snmp_config *cf = SKIP_BACK(struct snmp_config, cf, p->p.cf);
|
||||||
sock *sk = p->sock;
|
sock *sk = p->sock;
|
||||||
|
|
||||||
struct snmp_pdu c = SNMP_PDU_CONTEXT(sk);
|
struct snmp_pdu c;
|
||||||
|
snmp_pdu_context(&c, sk);
|
||||||
|
|
||||||
#define TIMEOUT_SIZE 4 /* 1B timeout, 3B zero padding */
|
#define TIMEOUT_SIZE 4 /* 1B timeout, 3B zero padding */
|
||||||
if (c.size < AGENTX_HEADER_SIZE + TIMEOUT_SIZE + snmp_oid_size(oid) +
|
if (c.size < AGENTX_HEADER_SIZE + TIMEOUT_SIZE + snmp_oid_size(oid) +
|
||||||
@ -279,7 +281,8 @@ snmp_notify_pdu(struct snmp_proto *p, struct oid *oid, void *data, uint size, in
|
|||||||
{
|
{
|
||||||
sock *sk = p->sock;
|
sock *sk = p->sock;
|
||||||
|
|
||||||
struct snmp_pdu c = SNMP_PDU_CONTEXT(sk);
|
struct snmp_pdu c;
|
||||||
|
snmp_pdu_context(&c, sk);
|
||||||
|
|
||||||
#define UPTIME_SIZE \
|
#define UPTIME_SIZE \
|
||||||
(6 * sizeof(u32)) /* sizeof( { u32 vb_type, u32 oid_hdr, u32 ids[4] } )*/
|
(6 * sizeof(u32)) /* sizeof( { u32 vb_type, u32 oid_hdr, u32 ids[4] } )*/
|
||||||
@ -333,7 +336,7 @@ snmp_notify_pdu(struct snmp_proto *p, struct oid *oid, void *data, uint size, in
|
|||||||
for (uint i = 0; i < trap0.n_subid; i++)
|
for (uint i = 0; i < trap0.n_subid; i++)
|
||||||
STORE_U32(trap_vb->name.ids[i], trap0_ids[i]);
|
STORE_U32(trap_vb->name.ids[i], trap0_ids[i]);
|
||||||
trap_vb->type = AGENTX_OBJECT_ID;
|
trap_vb->type = AGENTX_OBJECT_ID;
|
||||||
snmp_put_oid(SNMP_VB_DATA(trap_vb), oid);
|
snmp_put_oid(snmp_varbind_data(trap_vb), oid);
|
||||||
ADVANCE(c.buffer, c.size, snmp_varbind_size(trap_vb, c.byte_ord));
|
ADVANCE(c.buffer, c.size, snmp_varbind_size(trap_vb, c.byte_ord));
|
||||||
|
|
||||||
memcpy(c.buffer, data, size);
|
memcpy(c.buffer, data, size);
|
||||||
@ -363,7 +366,8 @@ de_allocate_pdu(struct snmp_proto *p, struct oid *oid, enum agentx_pdu_types typ
|
|||||||
byte *buf, *pkt;
|
byte *buf, *pkt;
|
||||||
buf = pkt = sk->tbuf;
|
buf = pkt = sk->tbuf;
|
||||||
uint size = sk->tbsize;
|
uint size = sk->tbsize;
|
||||||
struct snmp_pdu = SNMP_PDU_CONTEXT(p->sock);
|
struct snmp_pdu c;
|
||||||
|
snmp_pdu_context(&c, p->sock);
|
||||||
|
|
||||||
|
|
||||||
if (size > AGENTX_HEADER_SIZE + 0) // TODO additional size
|
if (size > AGENTX_HEADER_SIZE + 0) // TODO additional size
|
||||||
@ -419,9 +423,11 @@ snmp_deallocate(struct snmp_proto *p, struct oid *oid, u8 flags)
|
|||||||
static void
|
static void
|
||||||
un_register_pdu(struct snmp_proto *p, struct oid *oid, uint bound, uint index, enum agentx_pdu_types type, u8 is_instance, uint UNUSED contid)
|
un_register_pdu(struct snmp_proto *p, struct oid *oid, uint bound, uint index, enum agentx_pdu_types type, u8 is_instance, uint UNUSED contid)
|
||||||
{
|
{
|
||||||
|
/* used for agentx-Register-PDU and agentx-Unregister-PDU */
|
||||||
const struct snmp_config *cf = SKIP_BACK(struct snmp_config, cf, p->p.cf);
|
const struct snmp_config *cf = SKIP_BACK(struct snmp_config, cf, p->p.cf);
|
||||||
sock *sk = p->sock;
|
sock *sk = p->sock;
|
||||||
struct snmp_pdu c = SNMP_PDU_CONTEXT(sk);
|
struct snmp_pdu c;
|
||||||
|
snmp_pdu_context(&c, sk);
|
||||||
|
|
||||||
/* conditional +4 for upper-bound (optinal field) */
|
/* conditional +4 for upper-bound (optinal field) */
|
||||||
uint sz = AGENTX_HEADER_SIZE + snmp_oid_size(oid) + ((bound > 1) ? 4 : 0);
|
uint sz = AGENTX_HEADER_SIZE + snmp_oid_size(oid) + ((bound > 1) ? 4 : 0);
|
||||||
@ -504,7 +510,8 @@ static void
|
|||||||
close_pdu(struct snmp_proto *p, enum agentx_close_reasons reason)
|
close_pdu(struct snmp_proto *p, enum agentx_close_reasons reason)
|
||||||
{
|
{
|
||||||
sock *sk = p->sock;
|
sock *sk = p->sock;
|
||||||
struct snmp_pdu c = SNMP_PDU_CONTEXT(sk);
|
struct snmp_pdu c;
|
||||||
|
snmp_pdu_context(&c, sk);
|
||||||
|
|
||||||
#define REASON_SIZE 4
|
#define REASON_SIZE 4
|
||||||
if (c.size < AGENTX_HEADER_SIZE + REASON_SIZE)
|
if (c.size < AGENTX_HEADER_SIZE + REASON_SIZE)
|
||||||
@ -700,20 +707,21 @@ refresh_ids(struct snmp_proto *p, struct agentx_header *h)
|
|||||||
static uint
|
static uint
|
||||||
parse_test_set_pdu(struct snmp_proto *p, byte * const pkt_start, uint size)
|
parse_test_set_pdu(struct snmp_proto *p, byte * const pkt_start, uint size)
|
||||||
{
|
{
|
||||||
|
TRACE(D_PACKETS, "SNMP received agentx-TestSet-PDU");
|
||||||
byte *pkt = pkt_start; /* pointer to agentx-TestSet-PDU in RX-buffer */
|
byte *pkt = pkt_start; /* pointer to agentx-TestSet-PDU in RX-buffer */
|
||||||
uint s; /* final packat size */
|
uint s; /* final packat size */
|
||||||
struct agentx_response *res; /* pointer to reponse in TX-buffer */
|
struct agentx_response *res; /* pointer to reponse in TX-buffer */
|
||||||
|
|
||||||
struct agentx_header *h = (void *) pkt;
|
struct agentx_header *h = (void *) pkt;
|
||||||
ADVANCE(pkt, size, AGENTX_HEADER_SIZE);
|
ADVANCE(pkt, size, AGENTX_HEADER_SIZE);
|
||||||
uint pkt_size = LOAD_U32(h->payload, h->flags & AGENTX_NETWORK_BYTE_ORDER);
|
uint pkt_size = LOAD_U32(h->payload);
|
||||||
|
|
||||||
if (pkt_size < size)
|
if (pkt_size < size)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
sock *sk = p->sock;
|
sock *sk = p->sock;
|
||||||
struct snmp_pdu c = SNMP_PDU_CONTEXT(sk);
|
struct snmp_pdu c;
|
||||||
c.byte_ord = 0; /* use little-endian */
|
snmp_pdu_context(&c, sk);
|
||||||
|
|
||||||
if (c.size < AGENTX_HEADER_SIZE)
|
if (c.size < AGENTX_HEADER_SIZE)
|
||||||
snmp_manage_tbuf(p, &c);
|
snmp_manage_tbuf(p, &c);
|
||||||
@ -809,7 +817,8 @@ parse_set_pdu(struct snmp_proto *p, byte * const pkt_start, uint size, enum agen
|
|||||||
// use varbind_list_size()??
|
// use varbind_list_size()??
|
||||||
}
|
}
|
||||||
|
|
||||||
struct snmp_pdu c = SNMP_PDU_CONTEXT(p->sock);
|
struct snmp_pdu c;
|
||||||
|
snmp_pdu_context(&c, p->sock);
|
||||||
if (c.size < sizeof(struct agentx_response))
|
if (c.size < sizeof(struct agentx_response))
|
||||||
snmp_manage_tbuf(p, &c);
|
snmp_manage_tbuf(p, &c);
|
||||||
|
|
||||||
@ -1359,7 +1368,8 @@ parse_gets2_pdu(struct snmp_proto *p, byte * const pkt_start, uint size, uint *s
|
|||||||
uint pkt_size = LOAD_U32(h->payload, h->flags & AGENTX_NETWORK_BYTE_ORDER);
|
uint pkt_size = LOAD_U32(h->payload, h->flags & AGENTX_NETWORK_BYTE_ORDER);
|
||||||
|
|
||||||
sock *sk = p->sock;
|
sock *sk = p->sock;
|
||||||
struct snmp_pdu c = SNMP_PDU_CONTEXT(sk);
|
struct snmp_pdu c;
|
||||||
|
snmp_pdu_context(&c, sk);
|
||||||
// TODO better handling of endianness
|
// TODO better handling of endianness
|
||||||
c.byte_ord = 0; /* use little-endian */
|
c.byte_ord = 0; /* use little-endian */
|
||||||
|
|
||||||
@ -1671,7 +1681,8 @@ void
|
|||||||
snmp_ping(struct snmp_proto *p)
|
snmp_ping(struct snmp_proto *p)
|
||||||
{
|
{
|
||||||
sock *sk = p->sock;
|
sock *sk = p->sock;
|
||||||
struct snmp_pdu c = SNMP_PDU_CONTEXT(sk);
|
struct snmp_pdu c;
|
||||||
|
snmp_pdu_context(&c, sk);
|
||||||
|
|
||||||
if (c.size < AGENTX_HEADER_SIZE)
|
if (c.size < AGENTX_HEADER_SIZE)
|
||||||
snmp_manage_tbuf(p, &c);
|
snmp_manage_tbuf(p, &c);
|
||||||
|
@ -121,9 +121,6 @@ enum snmp_search_res {
|
|||||||
str[length] = '\0'; /* set term. char */ \
|
str[length] = '\0'; /* set term. char */ \
|
||||||
buf += 4 + snmp_str_size_from_len(length); })
|
buf += 4 + snmp_str_size_from_len(length); })
|
||||||
|
|
||||||
#define SNMP_HAS_CONTEXT(hdr) \
|
|
||||||
hdr->flags |= AGENTX_NON_DEFAULT_CONTEXT
|
|
||||||
|
|
||||||
#define SNMP_PUT_OID(buf, size, oid, byte_ord) \
|
#define SNMP_PUT_OID(buf, size, oid, byte_ord) \
|
||||||
({ \
|
({ \
|
||||||
struct agentx_varbind *vb = (void *) buf; \
|
struct agentx_varbind *vb = (void *) buf; \
|
||||||
@ -133,16 +130,6 @@ enum snmp_search_res {
|
|||||||
#define SNMP_FILL_VARBIND(vb, oid, byte_ord) \
|
#define SNMP_FILL_VARBIND(vb, oid, byte_ord) \
|
||||||
snmp_oid_copy(&(vb)->name, (oid), (byte_ord)), snmp_oid_size((oid))
|
snmp_oid_copy(&(vb)->name, (oid), (byte_ord)), snmp_oid_size((oid))
|
||||||
|
|
||||||
#define SNMP_VB_DATA(varbind) \
|
|
||||||
(((void *)(varbind)) + snmp_varbind_header_size(varbind))
|
|
||||||
|
|
||||||
#define SNMP_PDU_CONTEXT(sk) { \
|
|
||||||
.buffer = sk->tpos, \
|
|
||||||
.size = sk->tbuf + sk->tbsize - sk->tpos, \
|
|
||||||
.error = AGENTX_RES_NO_ERROR, \
|
|
||||||
.index = 0, \
|
|
||||||
}
|
|
||||||
|
|
||||||
struct agentx_header {
|
struct agentx_header {
|
||||||
u8 version;
|
u8 version;
|
||||||
u8 type;
|
u8 type;
|
||||||
@ -169,7 +156,7 @@ struct agentx_varbind {
|
|||||||
u16 pad;
|
u16 pad;
|
||||||
/* oid part */
|
/* oid part */
|
||||||
struct oid name;
|
struct oid name;
|
||||||
byte data[];
|
/* AgentX variable binding data optionaly here */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* this does not work */
|
/* this does not work */
|
||||||
|
Loading…
Reference in New Issue
Block a user