9 PRIVATE
int do_invoke_ds(int type
, const char *ds_name
)
15 if(type
== DS_CHECK
|| type
== DS_RETRIEVE_LABEL
) {
16 len_key
= DS_MAX_KEYLEN
;
19 len_key
= strlen(ds_name
)+1;
24 g_key
= cpf_grant_direct(DS_PROC_NR
, (vir_bytes
) ds_name
,
26 if(!GRANT_VALID(g_key
))
29 m
.DS_KEY_GRANT
= g_key
;
30 m
.DS_KEY_LEN
= len_key
;
32 r
= _taskcall(DS_PROC_NR
, type
, &m
);
38 int ds_publish_label(const char *ds_name
, u32_t value
, int flags
)
41 m
.DS_FLAGS
= DSF_TYPE_LABEL
| flags
;
42 return do_invoke_ds(DS_PUBLISH
, ds_name
);
45 int ds_publish_u32(const char *ds_name
, u32_t value
, int flags
)
48 m
.DS_FLAGS
= DSF_TYPE_U32
| flags
;
49 return do_invoke_ds(DS_PUBLISH
, ds_name
);
52 int ds_publish_str(const char *ds_name
, char *value
, int flags
)
54 if(strlen(value
) >= DS_MAX_STRLEN
)
56 strcpy((char *)(&m
.DS_STRING
), value
);
57 m
.DS_FLAGS
= DSF_TYPE_STR
| flags
;
58 return do_invoke_ds(DS_PUBLISH
, ds_name
);
61 int ds_publish_mem(const char *ds_name
, void *vaddr
, size_t length
, int flags
)
66 /* Grant for memory range. */
67 gid
= cpf_grant_direct(DS_PROC_NR
, (vir_bytes
)vaddr
, length
, CPF_READ
);
72 m
.DS_VAL_LEN
= length
;
73 m
.DS_FLAGS
= DSF_TYPE_MEM
| flags
;
75 r
= do_invoke_ds(DS_PUBLISH
, ds_name
);
81 int ds_publish_map(const char *ds_name
, void *vaddr
, size_t length
, int flags
)
86 if(((vir_bytes
)vaddr
% CLICK_SIZE
!= 0) || (length
% CLICK_SIZE
!= 0))
89 /* Grant for mapped memory range. */
90 gid
= cpf_grant_direct(DS_PROC_NR
, (vir_bytes
)vaddr
, length
,
96 m
.DS_VAL_LEN
= length
;
97 m
.DS_FLAGS
= DSF_TYPE_MAP
| flags
;
99 r
= do_invoke_ds(DS_PUBLISH
, ds_name
);
105 int ds_snapshot_map(const char *ds_name
, int *nr_snapshot
)
108 r
= do_invoke_ds(DS_SNAPSHOT
, ds_name
);
109 *nr_snapshot
= m
.DS_NR_SNAPSHOT
;
113 int ds_retrieve_label_name(char *ds_name
, u32_t num
)
117 r
= do_invoke_ds(DS_RETRIEVE_LABEL
, ds_name
);
121 int ds_retrieve_label_num(const char *ds_name
, u32_t
*value
)
124 m
.DS_FLAGS
= DSF_TYPE_LABEL
;
125 r
= do_invoke_ds(DS_RETRIEVE
, ds_name
);
130 int ds_retrieve_u32(const char *ds_name
, u32_t
*value
)
133 m
.DS_FLAGS
= DSF_TYPE_U32
;
134 r
= do_invoke_ds(DS_RETRIEVE
, ds_name
);
139 int ds_retrieve_str(const char *ds_name
, char *value
, size_t len_str
)
142 m
.DS_FLAGS
= DSF_TYPE_STR
;
143 r
= do_invoke_ds(DS_RETRIEVE
, ds_name
);
144 strncpy(value
, (char *)(&m
.DS_STRING
), DS_MAX_STRLEN
);
145 value
[DS_MAX_STRLEN
- 1] = '\0';
149 int ds_retrieve_mem(const char *ds_name
, char *vaddr
, size_t *length
)
154 /* Grant for memory range. */
155 gid
= cpf_grant_direct(DS_PROC_NR
, (vir_bytes
)vaddr
, *length
, CPF_WRITE
);
156 if(!GRANT_VALID(gid
))
160 m
.DS_VAL_LEN
= *length
;
161 m
.DS_FLAGS
= DSF_TYPE_MEM
;
162 r
= do_invoke_ds(DS_RETRIEVE
, ds_name
);
163 *length
= m
.DS_VAL_LEN
;
169 int ds_retrieve_map(const char *ds_name
, char *vaddr
, size_t *length
,
170 int nr_snapshot
, int flags
)
175 /* Map a mapped memory range. */
176 if(flags
& DSMF_MAP_MAPPED
) {
177 /* Request DS to grant. */
178 m
.DS_FLAGS
= DSF_TYPE_MAP
| DSMF_MAP_MAPPED
;
179 r
= do_invoke_ds(DS_RETRIEVE
, ds_name
);
183 /* Do the safemap. */
184 if(*length
> m
.DS_VAL_LEN
)
185 *length
= m
.DS_VAL_LEN
;
186 *length
= (size_t) CLICK_FLOOR(*length
);
187 r
= sys_safemap(DS_PROC_NR
, m
.DS_VAL
, 0,
188 (vir_bytes
)vaddr
, *length
, D
, 0);
190 /* Copy mapped memory range or a snapshot. */
191 } else if(flags
& (DSMF_COPY_MAPPED
|DSMF_COPY_SNAPSHOT
)) {
192 /* Grant for memory range first. */
193 gid
= cpf_grant_direct(DS_PROC_NR
, (vir_bytes
)vaddr
,
195 if(!GRANT_VALID(gid
))
199 m
.DS_VAL_LEN
= *length
;
200 if(flags
& DSMF_COPY_MAPPED
) {
201 m
.DS_FLAGS
= DSF_TYPE_MAP
| DSMF_COPY_MAPPED
;
204 m
.DS_NR_SNAPSHOT
= nr_snapshot
;
205 m
.DS_FLAGS
= DSF_TYPE_MAP
| DSMF_COPY_SNAPSHOT
;
207 r
= do_invoke_ds(DS_RETRIEVE
, ds_name
);
208 *length
= m
.DS_VAL_LEN
;
218 int ds_delete_u32(const char *ds_name
)
220 m
.DS_FLAGS
= DSF_TYPE_U32
;
221 return do_invoke_ds(DS_DELETE
, ds_name
);
224 int ds_delete_str(const char *ds_name
)
226 m
.DS_FLAGS
= DSF_TYPE_STR
;
227 return do_invoke_ds(DS_DELETE
, ds_name
);
230 int ds_delete_mem(const char *ds_name
)
232 m
.DS_FLAGS
= DSF_TYPE_MEM
;
233 return do_invoke_ds(DS_DELETE
, ds_name
);
236 int ds_delete_map(const char *ds_name
)
238 m
.DS_FLAGS
= DSF_TYPE_MAP
;
239 return do_invoke_ds(DS_DELETE
, ds_name
);
242 int ds_delete_label(const char *ds_name
)
244 m
.DS_FLAGS
= DSF_TYPE_LABEL
;
245 return do_invoke_ds(DS_DELETE
, ds_name
);
248 int ds_subscribe(const char *regexp
, int flags
)
251 return do_invoke_ds(DS_SUBSCRIBE
, regexp
);
254 int ds_check(char *ds_key
, int *type
)
257 r
= do_invoke_ds(DS_CHECK
, ds_key
);