]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
SNMP: Refactor - use inline functions
authorVojtech Vilimek <vojtech.vilimek@nic.cz>
Wed, 15 Nov 2023 10:29:19 +0000 (11:29 +0100)
committerVojtech Vilimek <vojtech.vilimek@nic.cz>
Wed, 15 Nov 2023 10:41:54 +0000 (11:41 +0100)
Macros are replaced with inline functions.

proto/snmp/snmp_utils.c
proto/snmp/snmp_utils.h
proto/snmp/subagent.c
proto/snmp/subagent.h

index 6fb4d3d47ec85e20b0e6562731c67de10ca161eb..4016682398fc33ba201b0dd6b4b908f45f0411ab 100644 (file)
 
 #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
  * @oid: object identifier to check
@@ -136,7 +176,7 @@ snmp_varbind_size(struct agentx_varbind *vb, int byte_ord)
   if (s >= 0)
     return hdr_size + (uint) s;
 
-  void *data = ((void *) vb) + hdr_size;
+  void *data = snmp_varbind_data(vb);
 
   if (vb->type == AGENTX_OBJECT_ID)
     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;
 
   vb->type = type;
-  u32 *data = SNMP_VB_DATA(vb);
+  u32 *data = snmp_varbind_data(vb);
   *data = val;
   return (byte *)(data + 1);
 }
@@ -516,7 +556,7 @@ snmp_varbind_ip4(struct agentx_varbind *vb, uint size, ip4_addr addr)
     return NULL;
 
   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 *
@@ -526,8 +566,7 @@ snmp_varbind_nstr(struct agentx_varbind *vb, uint size, const char *str, uint le
     return NULL;
 
   vb->type = AGENTX_OCTET_STRING;
-  //die("snmp_varbind_nstr() %p.data = %p", vb, SNMP_VB_DATA(vb));
-  return snmp_put_nstr(SNMP_VB_DATA(vb), str, len);
+  return snmp_put_nstr(snmp_varbind_data(vb), str, len);
 }
 
 inline enum agentx_type
index 0cad57e9c0a030646967a19a910e385ce7c2a5c5..bd2ceefadcae6c500d26fa75812f22e99a474209 100644 (file)
@@ -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_size(struct agentx_varbind *vb, int byte_ord);
 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);
 
 struct oid *snmp_oid_duplicate(pool *pool, const struct oid *oid);
 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);
 byte *snmp_fix_varbind(struct agentx_varbind *vb, struct oid *new);
 
index 05585ec26686a0e85dbfad8e0667880cb6ee3b6a..7baaf545bc6f8d235225770e8443f448739bfbac 100644 (file)
@@ -216,7 +216,8 @@ static void
 snmp_simple_response(struct snmp_proto *p, enum agentx_response_errs error, u16 index)
 {
   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))
     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);
   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 */
   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;
 
-  struct snmp_pdu c = SNMP_PDU_CONTEXT(sk);
+  struct snmp_pdu c;
+  snmp_pdu_context(&c, sk);
 
 #define UPTIME_SIZE \
   (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++)
     STORE_U32(trap_vb->name.ids[i], trap0_ids[i]);
   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));
 
   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;
   buf = pkt = sk->tbuf;
   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
@@ -419,9 +423,11 @@ snmp_deallocate(struct snmp_proto *p, struct oid *oid, u8 flags)
 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)
 {
+  /* used for agentx-Register-PDU and agentx-Unregister-PDU */
   const struct snmp_config *cf = SKIP_BACK(struct snmp_config, cf, p->p.cf);
   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) */
   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)
 {
   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
   if (c.size < AGENTX_HEADER_SIZE + REASON_SIZE)
@@ -700,20 +707,21 @@ refresh_ids(struct snmp_proto *p, struct agentx_header *h)
 static uint
 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 */
   uint s; /* final packat size */
   struct agentx_response *res; /* pointer to reponse in TX-buffer */
 
   struct agentx_header *h = (void *) pkt;
   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)
     return 0;
 
   sock *sk = p->sock;
-  struct snmp_pdu c = SNMP_PDU_CONTEXT(sk);
-  c.byte_ord = 0; /* use little-endian */
+  struct snmp_pdu c;
+  snmp_pdu_context(&c, sk);
 
   if (c.size < AGENTX_HEADER_SIZE)
     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()??
   }
 
-  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))
     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);
 
   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
   c.byte_ord = 0; /* use little-endian */
 
@@ -1671,7 +1681,8 @@ void
 snmp_ping(struct snmp_proto *p)
 {
   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)
     snmp_manage_tbuf(p, &c);
index 33fed16981489dd5df368fac5d253ebdd0b0748d..70c0834ecc7affada99ca2721f8e80ddb5501bdf 100644 (file)
@@ -121,9 +121,6 @@ enum snmp_search_res {
   str[length] = '\0'; /* set term. char */                                   \
   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)                               \
   ({                                                                         \
     struct agentx_varbind *vb = (void *) buf;                                \
@@ -133,16 +130,6 @@ enum snmp_search_res {
 #define SNMP_FILL_VARBIND(vb, oid, byte_ord)                                 \
   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 {
   u8 version;
   u8 type;
@@ -169,7 +156,7 @@ struct agentx_varbind {
   u16 pad;
   /* oid part */
   struct oid name;
-  byte data[];
+  /* AgentX variable binding data optionaly here */
 };
 
 /* this does not work */