70 debugs(49, 5,
"snmpInit: Building SNMP mib tree structure");
252 debugs(49, 9,
"snmpInit: Completed SNMP mib tree structure");
270 fatal(
"SNMP port cannot be opened.");
287 fatal(
"SNMP port cannot be opened.");
305 const auto &conn = answer.
conn;
317 fatalf(
"Lost SNMP port (%d) on FD %d", (
int)conn->local.port(), conn->fd);
361 debugs(49, 5,
"snmpHandleUdp: Called.");
365 memset(buf,
'\0',
sizeof(buf));
370 debugs(49, 3,
"snmpHandleUdp: FD " << sock <<
": received " << len <<
" bytes from " << from <<
".");
373 snmp_rq->
buf = (u_char *) buf;
375 snmp_rq->
sock = sock;
377 snmp_rq->
from = from;
395 u_char *buf = rq->
buf;
419 debugs(49, 5,
"snmpAgentParse: reqid=[" << PDU->
reqid <<
"]");
444 debugs(49, 5,
"snmpConstructReponse: Called.");
456 if (RespPDU !=
nullptr) {
475 debugs(49, 5,
"snmpAgentResponse: Called.");
493 oid *NextOidName =
nullptr;
494 snint NextOidNameLen = 0;
503 if (ParseFn ==
nullptr) {
505 debugs(49, 5,
"snmpAgentResponse: No such oid. ");
512 int * errstatTmp = &(Answer->
errstat);
514 VarNew = (*ParseFn) (VarPtr, (
snint *) errstatTmp);
522 debugs(49, 5,
"snmpAgentResponse: error.");
527 while ((VarPtr = Answer->
variables) !=
nullptr) {
559 debugs(49, 5,
"snmpTreeGet: Called");
566 if (Current[count] == mibTreeEntry->
name[count]) {
569 while ((mibTreeEntry) && (count < CurrentLen) && (!mibTreeEntry->
parsefunction)) {
570 mibTreeEntry =
snmpTreeEntry(Current[count], count, mibTreeEntry);
578 debugs(49, 5,
"snmpTreeGet: return");
592 if (Current[count] == mibTreeEntry->
name[count]) {
595 while (mibTreeEntry !=
nullptr && count < CurrentLen) {
596 mibTreeEntry =
snmpTreeEntry(Current[count], count, mibTreeEntry);
597 if (mibTreeEntry !=
nullptr)
612 debugs(49, 5,
"snmpTreeNext: Called");
619 if (mibTreeEntry && Current[count] == mibTreeEntry->
name[count]) {
622 while ((mibTreeEntry) && (count < CurrentLen) && (!mibTreeEntry->
parsefunction)) {
625 if (!nextmibTreeEntry)
628 mibTreeEntry = nextmibTreeEntry;
632 debugs(49, 5,
"snmpTreeNext: Recursed down to requested object");
641 *NextLen = CurrentLen;
642 *Next = (*mibTreeEntry->
instancefunction) (Current, NextLen, mibTreeEntry, &Fn);
653 debugs(49, 5,
"snmpTreeNext: Next OID found for sibling" << nextoid );
654 mibTreeEntry = nextoid;
657 debugs(49, 5,
"snmpTreeNext: Attempting to recurse up for next object");
663 nextoid = mibTreeEntry->
parent;
667 mibTreeEntry = nextoid;
671 nextoid = mibTreeEntry;
672 mibTreeEntry =
nullptr;
678 mibTreeEntry = mibTreeEntry->
leaves[0];
682 *NextLen = mibTreeEntry->
len;
696 oid *instance =
nullptr;
697 if (*len <= current->len) {
698 instance = (
oid *)
xmalloc(
sizeof(*name) * (*len + 1));
699 memcpy(instance, name,
sizeof(*name) * (*len));
710 oid *instance =
nullptr;
714 if (*len <= current->len) {
715 instance = (
oid *)
xmalloc(
sizeof(*name) * (*len + 1));
716 memcpy(instance, name,
sizeof(*name) * (*len));
717 instance[*len] = *index;
726 instance = (
oid *)
xmalloc(
sizeof(*name) * (*len));
727 memcpy(instance, name,
sizeof(*name) * (*len));
728 instance[*len - 1] = index[++loop];
739 oid *instance =
nullptr;
742 if (!peersAvailable) {
743 debugs(49, 6,
"snmp peer_Inst: No Peers.");
746 current = current->
leaves[0];
752 }
else if (*len <= current->len) {
753 debugs(49, 6,
"snmp peer_Inst: *len <= current->len ???");
754 instance = (
oid *)
xmalloc(
sizeof(*name) * ( *len + 1));
755 memcpy(instance, name,
sizeof(*name) * (*len));
759 int no = name[current->
len] ;
762 for (i = 0;
Less(i, peersAvailable) &&
Less(i, no); ++i);
764 if (
Less(i, peersAvailable)) {
765 debugs(49, 6,
"snmp peer_Inst: Encode peer #" << i);
766 instance = (
oid *)
xmalloc(
sizeof(*name) * (current->
len + 1 ));
767 memcpy(instance, name, (
sizeof(*name) * current->
len ));
768 instance[current->
len] = no + 1 ;
769 *len = current->
len + 1;
771 debugs(49, 6,
"snmp peer_Inst: We have " << i <<
" peers. Can't find #" << no);
782 oid *instance =
nullptr;
788 if (*len <= current->len) {
796 size =
sizeof(in_addr);
798 size =
sizeof(in6_addr);
800 debugs(49, 6,
"len" << *len <<
", current-len" << current->
len <<
", addr=" << laddr <<
", size=" <<
size);
803 memcpy(instance, name, (
sizeof(*name) * (*len)));
810 int shift = *len - current->
len ;
811 oid2addr(&name[*len - shift], laddr,shift);
820 newshift =
sizeof(in_addr);
822 newshift =
sizeof(in6_addr);
824 debugs(49, 6,
"len" << *len <<
", current-len" << current->
len <<
", addr=" << laddr <<
", newshift=" << newshift);
826 instance = (
oid *)
xmalloc(
sizeof(*name) * (current->
len + newshift));
827 memcpy(instance, name, (
sizeof(*name) * (current->
len)));
829 *len = current->
len + newshift ;
852 for (
int i = 0; i < current->
children; ++i) {
854 return (i + 1 < current->
children) ? current->
leaves[i + 1] :
nullptr;
868 while ((!next) && current && (count < current->children)) {
869 if (current->
leaves[count]->
name[len] == entry) {
870 next = current->
leaves[count];
882 debugs(49, 5,
"snmpAddNodeChild: assigning " << child <<
" to parent " << entry);
912 while (r < namelen) {
934 char const *delim =
".";
941 while (
size_t len = strcspn(s, delim)) {
943 (*name)[*nl] = atoi(s);
972 debugs(49, 5,
"snmpAddNodeStr: " << base_str <<
": -> " << b);
975 snprintf(s, 1024,
"%s.%d", base_str, o);
980 m =
snmpAddNode(n, nl, parsefunction, instancefunction, aggrType, 0);
996 debugs(49, 6,
"snmpAddNode: Children : " << children <<
", Oid : " <<
snmpDebugOid(name, len, tmp));
1001 entry->parsefunction = parsefunction;
1002 entry->instancefunction = instancefunction;
1003 entry->children = children;
1004 entry->leaves =
nullptr;
1005 entry->parent =
nullptr;
1006 entry->aggrType = aggrType;
1012 va_start(args, children);
1013 for (
int loop = 0; loop < children; ++loop) {
1015 entry->leaves[loop]->parent = entry;
1033 va_start(args, length);
1038 for (loop = 0; loop < length; ++loop) {
1039 new_oid[loop] = va_arg(args,
int);
1057 for (x = 0; x < Len; ++x) {
1058 size_t bytes = snprintf(mbuf,
sizeof(mbuf),
".%u", (
unsigned int) Name[x]);
1059 outbuf.
append(mbuf, bytes);
1080 u_char *cp =
nullptr;
1081 struct in_addr i4addr;
1082 struct in6_addr i6addr;
1088 cp = (u_char *) &(i4addr.s_addr);
1091 cp = (u_char *) &i6addr;
1093 for ( i=0 ; i <
size ; ++i) {
1111 struct in_addr i4addr;
1112 struct in6_addr i6addr;
1115 if (
size ==
sizeof(
struct in_addr) )
1116 cp = (u_char *) &(i4addr.s_addr);
1118 cp = (u_char *) &(i6addr);
1121 for (i=0 ; i<
size; ++i) {
1124 if (
size ==
sizeof(
struct in_addr) )
1133 const auto checklist =
Filled(ch);
1135 return data->match (checklist->snmp_community);
#define asyncCallbackFun(dbgSection, dbgLevel, function)
AsyncCall for calling back a function.
const CachePeers & CurrentCachePeers()
ACLFilledChecklist * Filled(ACLChecklist *checklist)
convenience and safety wrapper for dynamic_cast<ACLFilledChecklist*>
#define DefineRunnerRegistrator(ClassName)
constexpr bool Less(const A a, const B b)
whether integer a is less than integer b, with correct overflow handling
static char identifier[MAXLINE]
@ PERF_PROTOSTAT_AGGR_REQ
@ PERF_PROTOSTAT_AGGR_ICP_SKB
@ PERF_PROTOSTAT_AGGR_ICP_S
@ PERF_PROTOSTAT_AGGR_HTTP_KBYTES_IN
@ PERF_PROTOSTAT_AGGR_ICP_RKB
@ PERF_PROTOSTAT_AGGR_HTTP_ERRORS
@ PERF_PROTOSTAT_AGGR_KBYTES_OUT
@ PERF_PROTOSTAT_AGGR_ICP_R
@ PERF_PROTOSTAT_AGGR_KBYTES_IN
@ PERF_PROTOSTAT_AGGR_CLIENTS
@ PERF_PROTOSTAT_AGGR_CURSWAP
@ PERF_PROTOSTAT_AGGR_HTTP_HITS
@ PERF_PROTOSTAT_AGGR_ERRORS
@ PERF_PROTOSTAT_AGGR_HTTP_KBYTES_OUT
@ PERF_PROTOSTAT_AGGR_HTTP_REQ
@ PERF_SYS_CURRESERVED_FD
Acl::Answer const & fastCheck()
std::unique_ptr< Parameters > data
static void Start(const Pointer &job)
auto size() const
the number of currently stored (i.e. added and not removed) cache_peers
bool getInAddr(struct in_addr &) const
void setAnyAddr()
NOTE: Does NOT clear the Port stored. Only the Address and Type.
unsigned short port() const
Comm::ConnectionPointer conn
opened listening socket
void append(const char *c, int sz) override
char * content()
start of the added data
struct snmp_session session
void startShutdown() override
void syncConfig() override
void startReconfigure() override
void finalizeConfig() override
void useConfig() override
snmp_session wrapper add pack/unpack feature
Ip::Address snmp_outgoing
struct SquidConfig::@85 Addrs
Ip::Address snmp_incoming
struct SquidConfig::@91 accessList
struct SquidConfig::@78 Port
Ip::Address * client_entry(Ip::Address *current)
variable_list * snmp_meshCtblFn(variable_list *Var, snint *ErrP)
int comm_udp_sendto(int fd, const Ip::Address &to_addr, const void *buf, int len)
int comm_udp_recvfrom(int fd, void *buf, size_t len, int flags, Ip::Address &from)
#define debugs(SECTION, LEVEL, CONTENT)
variable_list * snmp_netDnsFn(variable_list *Var, snint *ErrP)
void fatal(const char *message)
void fatalf(const char *fmt,...)
variable_list * snmp_netFqdnFn(variable_list *Var, snint *ErrP)
variable_list * snmp_netIpFn(variable_list *Var, snint *ErrP)
bool IsConnOpen(const Comm::ConnectionPointer &conn)
void SetSelect(int, unsigned int, PF *, void *, time_t)
Mark an FD to be watched for its IO status.
void StartListening(int sock_type, int proto, const Comm::ConnectionPointer &listenConn, FdNoteId, StartListeningCallback &)
variable_list * snmp_prfSysFn(variable_list *Var, snint *ErrP)
variable_list * snmp_sysFn(variable_list *Var, snint *ErrP)
variable_list * snmp_prfProtoFn(variable_list *Var, snint *ErrP)
variable_list * snmp_confFn(variable_list *Var, snint *ErrP)
variable_list * snmp_meshPtblFn(variable_list *Var, snint *ErrP)
u_char * snmp_parse(struct snmp_session *, struct snmp_pdu *, u_char *, int)
int snmp_build(struct snmp_session *, struct snmp_pdu *, u_char *, int *)
int snmp_coexist_V2toV1(struct snmp_pdu *)
Comm::ConnectionPointer snmpOutgoingConn
bool snmpCreateOidFromStr(const char *str, oid **name, int *nl)
static void snmpAddNodeChild(mib_tree_entry *entry, mib_tree_entry *child)
static oid_ParseFn * snmpTreeGet(oid *Current, snint CurrentLen)
static oid * static_Inst(oid *name, snint *len, mib_tree_entry *current, oid_ParseFn **Fn)
static void snmpOpenPorts()
const char * snmpDebugOid(oid *Name, snint Len, MemBuf &outbuf)
static void snmpPortOpened(Ipc::StartListeningAnswer &)
static mib_tree_entry * snmpTreeSiblingEntry(oid entry, snint len, mib_tree_entry *current)
static void snmpConstructReponse(SnmpRequest *rq)
mib_tree_entry * mib_tree_head
Comm::ConnectionPointer snmpIncomingConn
static oid * peer_Inst(oid *name, snint *len, mib_tree_entry *current, oid_ParseFn **Fn)
static mib_tree_entry * snmpTreeEntry(oid entry, snint len, mib_tree_entry *current)
static oid * client_Inst(oid *name, snint *len, mib_tree_entry *current, oid_ParseFn **Fn)
struct snmp_pdu * snmpAgentResponse(struct snmp_pdu *PDU)
static mib_tree_entry * snmpAddNode(oid *name, int len, oid_ParseFn *parsefunction, instance_Fn *instancefunction, AggrType aggrType, int children,...)
static oid * snmpCreateOid(int length,...)
void addr2oid(Ip::Address &addr, oid *Dest)
static void snmpDecodePacket(SnmpRequest *rq)
mib_tree_entry * mib_tree_last
static mib_tree_entry * snmpAddNodeStr(const char *base_str, int o, oid_ParseFn *parsefunction, instance_Fn *instancefunction, AggrType aggrType=atNone)
void snmpSnmplibDebug(int lvl, char *buf)
AggrType snmpAggrType(oid *Current, snint CurrentLen)
static oid_ParseFn * snmpTreeNext(oid *Current, snint CurrentLen, oid **Next, snint *NextLen)
mib_tree_entry * snmpLookupNodeStr(mib_tree_entry *entry, const char *str)
SQUIDCEXTERN void(* snmplib_debug_hook)(int, char *)
static void snmpClosePorts()
static oid * time_Inst(oid *name, snint *len, mib_tree_entry *current, oid_ParseFn **Fn)
void oid2addr(oid *id, Ip::Address &addr, u_int size)
oid *() instance_Fn(oid *name, snint *len, mib_tree_entry *current, oid_ParseFn **Fn)
#define SNMP_REQUEST_SIZE
variable_list *() oid_ParseFn(variable_list *, snint *)
#define SNMP_ERR_NOSUCHNAME
#define SNMP_PDU_RESPONSE
void snmp_free_pdu(struct snmp_pdu *)
struct snmp_pdu * snmp_pdu_create(int)
#define INETADDRESSTYPE_IPV4
struct variable_list * snmp_var_new(oid *, int)
void snmp_var_free(struct variable_list *)
#define INETADDRESSTYPE_IPV6
oid_ParseFn * parsefunction
instance_Fn * instancefunction
struct _mib_tree_entry ** leaves
struct _mib_tree_entry * parent
struct variable_list * variables
struct variable_list * next_variable
void * xrealloc(void *s, size_t sz)
void * xcalloc(size_t n, size_t sz)
const char * xstrerr(int error)