version 1.5, 2019/09/18 09:52:47 |
version 1.6, 2019/09/18 09:54:36 |
|
|
snmp_package(struct snmp_agent *agent, struct ber_element *pdu, size_t *len) |
snmp_package(struct snmp_agent *agent, struct ber_element *pdu, size_t *len) |
{ |
{ |
struct ber ber; |
struct ber ber; |
struct ber_element *message, *scopedpdu = NULL, *secparams; |
struct ber_element *message, *scopedpdu = NULL, *secparams, *encpdu; |
ssize_t securitysize, ret; |
ssize_t securitysize, ret; |
size_t secparamsoffset; |
size_t secparamsoffset; |
char *securityparams = NULL, *packet = NULL; |
char *securityparams = NULL, *packet = NULL; |
|
|
ber_free_elements(scopedpdu); |
ber_free_elements(scopedpdu); |
goto fail; |
goto fail; |
} |
} |
|
if (agent->v3->level & SNMP_MSGFLAG_PRIV) { |
|
if ((encpdu = agent->v3->sec->encpdu(agent, scopedpdu, |
|
cookie)) == NULL) |
|
goto fail; |
|
ber_free_elements(scopedpdu); |
|
scopedpdu = encpdu; |
|
} |
if (ber_printf_elements(message, "d{idxd}xe", |
if (ber_printf_elements(message, "d{idxd}xe", |
agent->version, msgid, UDP_MAXPACKET, &(agent->v3->level), |
agent->version, msgid, UDP_MAXPACKET, &(agent->v3->level), |
(size_t) 1, agent->v3->sec->model, securityparams, |
(size_t) 1, agent->v3->sec->model, securityparams, |
|
|
size_t msgflagslen, secparamslen; |
size_t msgflagslen, secparamslen; |
struct ber_element *message = NULL, *payload, *scopedpdu, *ctxname; |
struct ber_element *message = NULL, *payload, *scopedpdu, *ctxname; |
off_t secparamsoffset; |
off_t secparamsoffset; |
char *engineid; |
char *encpdu, *engineid; |
size_t engineidlen; |
size_t encpdulen, engineidlen; |
|
void *cookie = NULL; |
|
|
bzero(&ber, sizeof(ber)); |
bzero(&ber, sizeof(ber)); |
ber_set_application(&ber, smi_application); |
ber_set_application(&ber, smi_application); |
|
|
if (msgflagslen != 1) |
if (msgflagslen != 1) |
goto fail; |
goto fail; |
if (agent->v3->sec->parseparams(agent, buf, buflen, |
if (agent->v3->sec->parseparams(agent, buf, buflen, |
secparamsoffset, secparams, secparamslen, |
secparamsoffset, secparams, secparamslen, msgflags[0], |
msgflags[0]) == -1) |
&cookie) == -1) { |
|
cookie = NULL; |
goto fail; |
goto fail; |
|
} |
|
if (msgflags[0] & SNMP_MSGFLAG_PRIV) { |
|
if (ber_scanf_elements(scopedpdu, "x", &encpdu, |
|
&encpdulen) == -1) |
|
goto fail; |
|
if ((scopedpdu = agent->v3->sec->decpdu(agent, encpdu, |
|
encpdulen, cookie)) == NULL) |
|
goto fail; |
|
} |
if (ber_scanf_elements(scopedpdu, "{xeS{", &engineid, |
if (ber_scanf_elements(scopedpdu, "{xeS{", &engineid, |
&engineidlen, &ctxname) == -1) |
&engineidlen, &ctxname) == -1) |
goto fail; |
goto fail; |
|
|
} |
} |
|
|
ber_free_elements(message); |
ber_free_elements(message); |
|
agent->v3->sec->freecookie(cookie); |
return pdu; |
return pdu; |
} |
} |
/* NOTREACHED */ |
/* NOTREACHED */ |
|
|
fail: |
fail: |
|
if (version == SNMP_V3) |
|
agent->v3->sec->freecookie(cookie); |
ber_free_elements(message); |
ber_free_elements(message); |
return NULL; |
return NULL; |
} |
} |