37#if LWIP_SNMP && (NO_SYS == 0)
45call_synced_function(
struct threadsync_data *call_data, snmp_threadsync_called_fn
fn)
47 sys_mutex_lock(&call_data->threadsync_node->instance->sem_usage_mutex);
48 call_data->threadsync_node->instance->sync_fn(
fn, call_data);
49 sys_sem_wait(&call_data->threadsync_node->instance->sem);
54threadsync_get_value_synced(
void *
ctx)
56 struct threadsync_data *call_data = (
struct threadsync_data *)
ctx;
58 if (call_data->proxy_instance.get_value !=
NULL) {
59 call_data->retval.s16 = call_data->proxy_instance.get_value(&call_data->proxy_instance, call_data->arg1.value);
61 call_data->retval.s16 = -1;
68threadsync_get_value(
struct snmp_node_instance *
instance,
void *
value)
70 struct threadsync_data *call_data = (
struct threadsync_data *)
instance->reference.ptr;
72 call_data->arg1.value =
value;
73 call_synced_function(call_data, threadsync_get_value_synced);
75 return call_data->retval.s16;
79threadsync_set_test_synced(
void *
ctx)
81 struct threadsync_data *call_data = (
struct threadsync_data *)
ctx;
83 if (call_data->proxy_instance.set_test !=
NULL) {
84 call_data->retval.err = call_data->proxy_instance.set_test(&call_data->proxy_instance, call_data->arg2.len, call_data->arg1.value);
86 call_data->retval.err = SNMP_ERR_NOTWRITABLE;
95 struct threadsync_data *call_data = (
struct threadsync_data *)
instance->reference.ptr;
97 call_data->arg1.value =
value;
98 call_data->arg2.len =
len;
99 call_synced_function(call_data, threadsync_set_test_synced);
101 return call_data->retval.err;
105threadsync_set_value_synced(
void *
ctx)
107 struct threadsync_data *call_data = (
struct threadsync_data *)
ctx;
109 if (call_data->proxy_instance.set_value !=
NULL) {
110 call_data->retval.err = call_data->proxy_instance.set_value(&call_data->proxy_instance, call_data->arg2.len, call_data->arg1.value);
112 call_data->retval.err = SNMP_ERR_NOTWRITABLE;
121 struct threadsync_data *call_data = (
struct threadsync_data *)
instance->reference.ptr;
123 call_data->arg1.value =
value;
124 call_data->arg2.len =
len;
125 call_synced_function(call_data, threadsync_set_value_synced);
127 return call_data->retval.err;
131threadsync_release_instance_synced(
void *
ctx)
133 struct threadsync_data *call_data = (
struct threadsync_data *)
ctx;
135 call_data->proxy_instance.release_instance(&call_data->proxy_instance);
141threadsync_release_instance(
struct snmp_node_instance *
instance)
143 struct threadsync_data *call_data = (
struct threadsync_data *)
instance->reference.ptr;
145 if (call_data->proxy_instance.release_instance !=
NULL) {
146 call_synced_function(call_data, threadsync_release_instance_synced);
151get_instance_synced(
void *
ctx)
153 struct threadsync_data *call_data = (
struct threadsync_data *)
ctx;
154 const struct snmp_leaf_node *leaf = (
const struct snmp_leaf_node *)(
const void *)call_data->proxy_instance.node;
156 call_data->retval.err = leaf->get_instance(call_data->arg1.root_oid, call_data->arg2.root_oid_len, &call_data->proxy_instance);
162get_next_instance_synced(
void *
ctx)
164 struct threadsync_data *call_data = (
struct threadsync_data *)
ctx;
165 const struct snmp_leaf_node *leaf = (
const struct snmp_leaf_node *)(
const void *)call_data->proxy_instance.node;
167 call_data->retval.err = leaf->get_next_instance(call_data->arg1.root_oid, call_data->arg2.root_oid_len, &call_data->proxy_instance);
173do_sync(
const u32_t *root_oid,
u8_t root_oid_len,
struct snmp_node_instance *
instance, snmp_threadsync_called_fn
fn)
175 const struct snmp_threadsync_node *threadsync_node = (
const struct snmp_threadsync_node *)(
const void *)
instance->node;
176 struct threadsync_data *call_data = &threadsync_node->instance->data;
178 if (threadsync_node->node.node.oid != threadsync_node->target->node.oid) {
180 return SNMP_ERR_NOSUCHINSTANCE;
183 memset(&call_data->proxy_instance, 0,
sizeof(call_data->proxy_instance));
185 instance->reference.ptr = call_data;
186 snmp_oid_assign(&call_data->proxy_instance.instance_oid,
instance->instance_oid.id,
instance->instance_oid.len);
188 call_data->proxy_instance.node = &threadsync_node->target->node;
189 call_data->threadsync_node = threadsync_node;
191 call_data->arg1.root_oid = root_oid;
192 call_data->arg2.root_oid_len = root_oid_len;
193 call_synced_function(call_data,
fn);
195 if (call_data->retval.err == SNMP_ERR_NOERROR) {
196 instance->access = call_data->proxy_instance.access;
197 instance->asn1_type = call_data->proxy_instance.asn1_type;
198 instance->release_instance = threadsync_release_instance;
199 instance->get_value = (call_data->proxy_instance.get_value !=
NULL) ? threadsync_get_value :
NULL;
200 instance->set_value = (call_data->proxy_instance.set_value !=
NULL) ? threadsync_set_value :
NULL;
201 instance->set_test = (call_data->proxy_instance.set_test !=
NULL) ? threadsync_set_test :
NULL;
202 snmp_oid_assign(&
instance->instance_oid, call_data->proxy_instance.instance_oid.id, call_data->proxy_instance.instance_oid.len);
205 return call_data->retval.err;
209snmp_threadsync_get_instance(
const u32_t *root_oid,
u8_t root_oid_len,
struct snmp_node_instance *
instance)
211 return do_sync(root_oid, root_oid_len,
instance, get_instance_synced);
215snmp_threadsync_get_next_instance(
const u32_t *root_oid,
u8_t root_oid_len,
struct snmp_node_instance *
instance)
217 return do_sync(root_oid, root_oid_len,
instance, get_next_instance_synced);
221void snmp_threadsync_init(
struct snmp_threadsync_instance *
instance, snmp_threadsync_synchronizer_fn sync_fn)
static HINSTANCE instance
#define LWIP_DEBUGF(debug, message)
#define LWIP_ASSERT(message, assertion)
#define LWIP_UNUSED_ARG(x)
err_t sys_mutex_new(sys_mutex_t *mutex)
void sys_mutex_lock(sys_mutex_t *mutex)
void sys_mutex_unlock(sys_mutex_t *mutex)
void sys_sem_signal(sys_sem_t *sem)
err_t sys_sem_new(sys_sem_t *sem, u8_t count)
#define sys_sem_wait(sem)
static GLenum _GLUfuncptr fn