X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Finclude%2Finterfaces%2Fvmm_keyed_stream.h;h=1328e4f37124567f3cccfaa24dee019e643bf33d;hb=495d40c7d02054399e118be6a10b0096c938d232;hp=e06535dbc2d26823cfb6de41606ad7a3eb36dace;hpb=ba178554a5f6714e5ceb7b77df462ac72de90b0c;p=palacios.git diff --git a/palacios/include/interfaces/vmm_keyed_stream.h b/palacios/include/interfaces/vmm_keyed_stream.h index e06535d..1328e4f 100644 --- a/palacios/include/interfaces/vmm_keyed_stream.h +++ b/palacios/include/interfaces/vmm_keyed_stream.h @@ -31,6 +31,9 @@ If you open a key for reading, you get the read pointer set to its beginning. You can then make repeated reads to advance the read pointer. You cannot seek. + Reading is done with a tag supplied, and we will match the requested tag + against the actual tag. If they do not match, we immediately return + with an error. Writing works similarly. @@ -49,18 +52,27 @@ typedef enum {V3_KS_RD_ONLY,V3_KS_WR_ONLY,V3_KS_WR_ONLY_CREATE} v3_keyed_stream_ v3_keyed_stream_t v3_keyed_stream_open(char *url, v3_keyed_stream_open_t open_type); void v3_keyed_stream_close(v3_keyed_stream_t stream); +void v3_keyed_stream_preallocate_hint_key(v3_keyed_stream_t stream, char *key, uint64_t size); v3_keyed_stream_key_t v3_keyed_stream_open_key(v3_keyed_stream_t stream, char *key); void v3_keyed_stream_close_key(v3_keyed_stream_t stream, char *key); sint64_t v3_keyed_stream_write_key(v3_keyed_stream_t stream, v3_keyed_stream_key_t key, + void *tag, + sint64_t taglen, void *buf, sint64_t len); sint64_t v3_keyed_stream_read_key(v3_keyed_stream_t stream, v3_keyed_stream_key_t key, + void *tag, + sint64_t taglen, void *buf, sint64_t len); -#define STD_SAVE(stream,ks,x) \ + + +/* We will kill this stuff since it's now in the interface + +#define STD_SAVE_RAW(stream,ks,x) \ do { \ if (sizeof((x)) != v3_keyed_stream_write_key((stream), (ks), &(x), sizeof((x)))) { \ v3_keyed_stream_close_key((stream),(ks)); \ @@ -68,7 +80,7 @@ sint64_t v3_keyed_stream_read_key(v3_keyed_stream_t stream, } \ } while (0) -#define STD_LOAD(stream,ks,x) \ +#define STD_LOAD_RAW(stream,ks,x) \ do { \ if (sizeof((x)) != v3_keyed_stream_read_key((stream), (ks), &(x), sizeof((x)))) { \ v3_keyed_stream_close_key((stream),(ks)); \ @@ -77,6 +89,93 @@ sint64_t v3_keyed_stream_read_key(v3_keyed_stream_t stream, } while (0) #endif +#define KSTREAM_MAGIC_COOKIE 0xabcd0123 + + +#define STD_SAVE_TAGGED(stream,ks,tag,size,x) \ +do { \ +uint32_t temp; \ +temp=KSTREAM_MAGIC_COOKIE; \ +if (sizeof(temp) != v3_keyed_stream_write_key((stream),(ks),&temp,sizeof(temp))) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +temp=strlen(tag); \ +if (sizeof(temp) != v3_keyed_stream_write_key((stream),(ks),&temp,sizeof(temp))) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +if (temp != v3_keyed_stream_write_key((stream),(ks),tag,temp)) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +temp=(size); \ +if (sizeof(temp) != v3_keyed_stream_write_key((stream),(ks),&temp,sizeof(temp))) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +if ((size) != v3_keyed_stream_write_key((stream),(ks),&(x),(size))) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +} while (0) + +#define STD_LOAD_TAGGED(stream,ks,tag,size,x) \ +do { \ +uint32_t temp; \ +if (sizeof(temp) != v3_keyed_stream_read_key((stream),(ks),&temp,sizeof(temp))) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +if (temp!=KSTREAM_MAGIC_COOKIE) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ +} \ +if (sizeof(temp) != v3_keyed_stream_read_key((stream),(ks),&temp,sizeof(temp))) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +if (strlen((tag))!=temp) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ +} \ +{ char buf[temp+1]; \ + if (temp != v3_keyed_stream_read_key((stream),(ks),buf,temp)) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ + buf[temp]=0; \ + if (strncasecmp(buf,tag,temp)) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +} \ +if (sizeof(temp) != v3_keyed_stream_read_key((stream),(ks),&temp,sizeof(temp))) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +if (temp!=(size)) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ +} \ +if ((size) != v3_keyed_stream_read_key((stream),(ks),&(x),(size))) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +} while (0) + +#ifdef V3_CONFIG_KEYED_STREAMS_WITH_TAGS +#define STD_SAVE(stream,ks,x) STD_SAVE_TAGGED(stream,ks,#x,sizeof(x),x) +#define STD_LOAD(stream,ks,x) STD_LOAD_TAGGED(stream,ks,#x,sizeof(x),x) +#else +#define STD_SAVE(stream,ks,x) STD_SAVE_RAW(stream,ks,x) +#define STD_LOAD(stream,ks,x) STD_LOAD_RAW(stream,ks,x) +#endif + +*/ + +#endif + struct v3_keyed_stream_hooks { // url is meaningful only to the host implementation @@ -85,6 +184,10 @@ struct v3_keyed_stream_hooks { void (*close)(v3_keyed_stream_t stream); + void (*preallocate_hint_key)(v3_keyed_stream_t stream, + char *key, + uint64_t size); + v3_keyed_stream_key_t (*open_key)(v3_keyed_stream_t stream, char *key); @@ -94,11 +197,15 @@ struct v3_keyed_stream_hooks { sint64_t (*write_key)(v3_keyed_stream_t stream, v3_keyed_stream_key_t key, + void *tag, + sint64_t taglen, void *buf, sint64_t len); sint64_t (*read_key)(v3_keyed_stream_t stream, v3_keyed_stream_key_t key, + void *tag, + sint64_t taglen, void *buf, sint64_t len);