Commit e438428e authored by Adam Wujek's avatar Adam Wujek 💬

lib/snmp: merge oid_array and oid_array_set

By this 32bytes are saved.
Signed-off-by: Adam Wujek's avatarAdam Wujek <adam.wujek@cern.ch>
parent 2b473c25
...@@ -55,13 +55,17 @@ ...@@ -55,13 +55,17 @@
#ifdef CONFIG_SNMP_SET #ifdef CONFIG_SNMP_SET
#define SNMP_SET_ENABLED 1 #define SNMP_SET_ENABLED 1
#define SNMP_SET_FUNCTION(X) .set = (X)
#else #else
#define SNMP_SET_ENABLED 0 #define SNMP_SET_ENABLED 0
#define SNMP_SET_FUNCTION(X) .set = NULL
#endif #endif
struct snmp_oid { struct snmp_oid {
uint8_t *oid_match; uint8_t *oid_match;
int (*fill)(uint8_t *buf, struct snmp_oid *obj); int (*fill)(uint8_t *buf, struct snmp_oid *obj);
/* *set is needed only when support for SNMP SET is enabled */
int (*set)(uint8_t *buf, struct snmp_oid *obj);
void *p; void *p;
uint8_t oid_len; uint8_t oid_len;
uint8_t asn; uint8_t asn;
...@@ -248,10 +252,11 @@ static uint8_t oid_wrpcNicRX[] = {0x2B,6,1,4,1,96,101,2,2,0}; ...@@ -248,10 +252,11 @@ static uint8_t oid_wrpcNicRX[] = {0x2B,6,1,4,1,96,101,2,2,0};
static uint8_t oid_wrpcVersionSwVersion[] = {0x2B,6,1,4,1,96,101,3,1,0}; static uint8_t oid_wrpcVersionSwVersion[] = {0x2B,6,1,4,1,96,101,3,1,0};
#define OID_FIELD_STRUCT(_oid, _fname, _asn, _type, _pointer, _field) { \ #define OID_FIELD_STRUCT(_oid, _getf, _setf, _asn, _type, _pointer, _field) { \
.oid_match = _oid, \ .oid_match = _oid, \
.oid_len = sizeof(_oid), \ .oid_len = sizeof(_oid), \
.fill = _fname, \ .fill = _getf, \
SNMP_SET_FUNCTION(_setf), \
.asn = _asn, \ .asn = _asn, \
.p = _pointer, \ .p = _pointer, \
.offset = offsetof(_type, _field), \ .offset = offsetof(_type, _field), \
...@@ -263,53 +268,43 @@ static uint8_t oid_wrpcVersionSwVersion[] = {0x2B,6,1,4,1,96,101,3,1,0}; ...@@ -263,53 +268,43 @@ static uint8_t oid_wrpcVersionSwVersion[] = {0x2B,6,1,4,1,96,101,3,1,0};
.fill = _fname, \ .fill = _fname, \
.asn = _asn, \ .asn = _asn, \
} }
#define OID_FIELD_VAR(_oid, _fname, _asn, _pointer) { \ #define OID_FIELD_VAR(_oid, _getf, _setf, _asn, _pointer) { \
.oid_match = _oid, \ .oid_match = _oid, \
.oid_len = sizeof(_oid), \ .oid_len = sizeof(_oid), \
.fill = _fname, \ .fill = _getf, \
SNMP_SET_FUNCTION(_setf), \
.asn = _asn, \ .asn = _asn, \
.p = _pointer, \ .p = _pointer, \
.offset = 0, \ .offset = 0, \
} }
#define NO_SET NULL
/* NOTE: to have SNMP_GET_NEXT working properly this array has to be sorted by /* NOTE: to have SNMP_GET_NEXT working properly this array has to be sorted by
OIDs */ OIDs */
static struct snmp_oid oid_array[] = { static struct snmp_oid oid_array[] = {
OID_FIELD_VAR(oid_name, fill_struct_p_asn, ASN_OCTET_STR, &snmp_system_name), OID_FIELD_VAR( oid_name, fill_struct_p_asn, set_p, ASN_OCTET_STR, &snmp_system_name),
OID_FIELD(oid_tics, fill_tics, 0), OID_FIELD(oid_tics, fill_tics, 0),
OID_FIELD(oid_date, fill_date, 0), OID_FIELD(oid_date, fill_date, 0),
OID_FIELD_VAR(oid_wrsPtpMode, fill_struct_p_asn, ASN_INTEGER, &ptp_mode), OID_FIELD_VAR( oid_wrsPtpMode, fill_struct_p_asn, set_p, ASN_INTEGER, &ptp_mode),
OID_FIELD_STRUCT(oid_wrsPtpServoState, fill_struct_pp_asn, ASN_OCTET_STR, struct wr_servo_state, &wr_s_state, servo_state_name), OID_FIELD_STRUCT(oid_wrsPtpServoState, fill_struct_pp_asn, NO_SET, ASN_OCTET_STR, struct wr_servo_state, &wr_s_state, servo_state_name),
OID_FIELD_STRUCT(oid_wrsPtpServoStateN, fill_struct_pp_asn, ASN_INTEGER, struct wr_servo_state, &wr_s_state, state), OID_FIELD_STRUCT(oid_wrsPtpServoStateN, fill_struct_pp_asn, NO_SET, ASN_INTEGER, struct wr_servo_state, &wr_s_state, state),
OID_FIELD_STRUCT(oid_wrsPtpClockOffsetPsHR,fill_int32_saturate_pp, ASN_INTEGER, struct wr_servo_state, &wr_s_state, offset), /* saturated */ OID_FIELD_STRUCT(oid_wrsPtpClockOffsetPsHR, fill_int32_saturate_pp, NO_SET, ASN_INTEGER, struct wr_servo_state, &wr_s_state, offset), /* saturated */
OID_FIELD_STRUCT(oid_wrsPtpSkew, fill_int32_saturate_pp, ASN_INTEGER, struct wr_servo_state, &wr_s_state, skew), /* saturated */ OID_FIELD_STRUCT(oid_wrsPtpSkew, fill_int32_saturate_pp, NO_SET, ASN_INTEGER, struct wr_servo_state, &wr_s_state, skew), /* saturated */
OID_FIELD_STRUCT(oid_wrsPtpServoUpdates, fill_struct_pp_asn, ASN_COUNTER, struct wr_servo_state, &wr_s_state, update_count), OID_FIELD_STRUCT(oid_wrsPtpServoUpdates, fill_struct_pp_asn, NO_SET, ASN_COUNTER, struct wr_servo_state, &wr_s_state, update_count),
OID_FIELD_STRUCT(oid_wrsPtpDeltaTxM, fill_struct_pp_asn, ASN_INTEGER, struct wr_servo_state, &wr_s_state, delta_tx_m), OID_FIELD_STRUCT(oid_wrsPtpDeltaTxM, fill_struct_pp_asn, set_pp, ASN_INTEGER, struct wr_servo_state, &wr_s_state, delta_tx_m),
OID_FIELD_STRUCT(oid_wrsPtpDeltaRxM, fill_struct_pp_asn, ASN_INTEGER, struct wr_servo_state, &wr_s_state, delta_rx_m), OID_FIELD_STRUCT(oid_wrsPtpDeltaRxM, fill_struct_pp_asn, set_pp, ASN_INTEGER, struct wr_servo_state, &wr_s_state, delta_rx_m),
OID_FIELD_STRUCT(oid_wrsPtpDeltaTxS, fill_struct_pp_asn, ASN_INTEGER, struct wr_servo_state, &wr_s_state, delta_tx_s), OID_FIELD_STRUCT(oid_wrsPtpDeltaTxS, fill_struct_pp_asn, set_pp, ASN_INTEGER, struct wr_servo_state, &wr_s_state, delta_tx_s),
OID_FIELD_STRUCT(oid_wrsPtpDeltaRxS, fill_struct_pp_asn, ASN_INTEGER, struct wr_servo_state, &wr_s_state, delta_rx_s), OID_FIELD_STRUCT(oid_wrsPtpDeltaRxS, fill_struct_pp_asn, set_pp, ASN_INTEGER, struct wr_servo_state, &wr_s_state, delta_rx_s),
OID_FIELD_STRUCT(oid_wrpcPtpRTTHR, fill_int32_saturate_pp, ASN_INTEGER, struct wr_servo_state, &wr_s_state, picos_mu), /* saturated */ OID_FIELD_STRUCT(oid_wrpcPtpRTTHR, fill_int32_saturate_pp, NO_SET, ASN_INTEGER, struct wr_servo_state, &wr_s_state, picos_mu), /* saturated */
OID_FIELD_STRUCT(oid_wrpcPtpDeltaMs, fill_int32_saturate_pp, ASN_INTEGER, struct wr_servo_state, &wr_s_state, delta_ms), /* raw value used to calculate wrsPtpLinkLength, original calculations uses float */ OID_FIELD_STRUCT(oid_wrpcPtpDeltaMs, fill_int32_saturate_pp, NO_SET, ASN_INTEGER, struct wr_servo_state, &wr_s_state, delta_ms), /* raw value used to calculate wrsPtpLinkLength, original calculations uses float */
OID_FIELD_STRUCT(oid_wrpcPtpCurSetpoint, fill_struct_pp_asn, ASN_INTEGER, struct wr_servo_state, &wr_s_state, cur_setpoint), OID_FIELD_STRUCT(oid_wrpcPtpCurSetpoint, fill_struct_pp_asn, NO_SET, ASN_INTEGER, struct wr_servo_state, &wr_s_state, cur_setpoint),
OID_FIELD_STRUCT(oid_wrpcNicTX, fill_struct_p_asn, ASN_COUNTER, struct wr_minic, &minic, tx_count), OID_FIELD_STRUCT(oid_wrpcNicTX, fill_struct_p_asn, NO_SET, ASN_COUNTER, struct wr_minic, &minic, tx_count),
OID_FIELD_STRUCT(oid_wrpcNicRX, fill_struct_p_asn, ASN_COUNTER, struct wr_minic, &minic, rx_count), OID_FIELD_STRUCT(oid_wrpcNicRX, fill_struct_p_asn, NO_SET, ASN_COUNTER, struct wr_minic, &minic, rx_count),
OID_FIELD_VAR(oid_wrpcVersionSwVersion, fill_struct_pp_asn, ASN_OCTET_STR, &build_revision), OID_FIELD_VAR( oid_wrpcVersionSwVersion, fill_struct_pp_asn, NO_SET, ASN_OCTET_STR, &build_revision),
{ 0, } { 0, }
}; };
static struct snmp_oid oid_array_set[] = {
OID_FIELD_VAR( oid_name, set_p, ASN_OCTET_STR, &snmp_system_name),
OID_FIELD_VAR( oid_wrsPtpMode, set_p, ASN_INTEGER, &ptp_mode),
OID_FIELD_STRUCT(oid_wrsPtpDeltaTxM, set_pp, ASN_INTEGER, struct wr_servo_state, &wr_s_state, delta_tx_m),
OID_FIELD_STRUCT(oid_wrsPtpDeltaRxM, set_pp, ASN_INTEGER, struct wr_servo_state, &wr_s_state, delta_rx_m),
OID_FIELD_STRUCT(oid_wrsPtpDeltaTxS, set_pp, ASN_INTEGER, struct wr_servo_state, &wr_s_state, delta_tx_s),
OID_FIELD_STRUCT(oid_wrsPtpDeltaRxS, set_pp, ASN_INTEGER, struct wr_servo_state, &wr_s_state, delta_rx_s),
{ 0 }
};
/* /*
* Perverse... snmpwalk does getnext anyways. * Perverse... snmpwalk does getnext anyways.
* *
...@@ -417,8 +412,8 @@ static uint8_t snmp_prepare_error(uint8_t *buf, uint8_t error) ...@@ -417,8 +412,8 @@ static uint8_t snmp_prepare_error(uint8_t *buf, uint8_t error)
/* And, now, work out your generic frame responder... */ /* And, now, work out your generic frame responder... */
static int snmp_respond(uint8_t *buf) static int snmp_respond(uint8_t *buf)
{ {
struct snmp_oid *oid; struct snmp_oid *oid = NULL;
uint8_t *newbuf; uint8_t *newbuf = NULL;
uint8_t *new_oid;; uint8_t *new_oid;;
int i; int i;
int8_t len; int8_t len;
...@@ -427,6 +422,15 @@ static int snmp_respond(uint8_t *buf) ...@@ -427,6 +422,15 @@ static int snmp_respond(uint8_t *buf)
uint8_t snmp_mode_set = 0; uint8_t snmp_mode_set = 0;
uint8_t incoming_oid_len; uint8_t incoming_oid_len;
int8_t cmp_result; int8_t cmp_result;
/* Hack to avoid compiler warnings "function defined but not used" for
* set_p and set_pp when SNMP compiled without SET support.
* These functions will never be called here. */
if (0) {
set_p(newbuf, oid);
set_pp(newbuf, oid);
}
for (i = 0; i < sizeof(match_array); i++) { for (i = 0; i < sizeof(match_array); i++) {
switch (match_array[i]) { switch (match_array[i]) {
case BYTE_SIZE: case BYTE_SIZE:
...@@ -464,12 +468,7 @@ static int snmp_respond(uint8_t *buf) ...@@ -464,12 +468,7 @@ static int snmp_respond(uint8_t *buf)
new_oid = buf + i; new_oid = buf + i;
/* save size of incoming oid */ /* save size of incoming oid */
incoming_oid_len = buf[i - 1]; incoming_oid_len = buf[i - 1];
if (snmp_mode_set) { for (oid = oid_array; oid->oid_len; oid++) {
oid = oid_array_set;
} else {
oid = oid_array;
}
for (; oid->oid_len; oid++) {
if (snmp_mode_get && if (snmp_mode_get &&
oid->oid_len != incoming_oid_len) { oid->oid_len != incoming_oid_len) {
/* for SNMP_GET, we need equal lengths */ /* for SNMP_GET, we need equal lengths */
...@@ -527,7 +526,13 @@ static int snmp_respond(uint8_t *buf) ...@@ -527,7 +526,13 @@ static int snmp_respond(uint8_t *buf)
newbuf += oid->oid_len; newbuf += oid->oid_len;
if (SNMP_SET_ENABLED && snmp_mode_set) { if (SNMP_SET_ENABLED && snmp_mode_set) {
uint8_t community_len; uint8_t community_len;
len = oid->fill(newbuf, oid); if (!oid->set) {
/* Oid found but there is no set function.
* It is read-only */
return snmp_prepare_error(buf,
SNMP_ERR_READONLY);
}
len = oid->set(newbuf, oid);
if (len < 0) if (len < 0)
return snmp_prepare_error(buf, return snmp_prepare_error(buf,
SNMP_ERR_BADVALUE); SNMP_ERR_BADVALUE);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment