xref: /aosp_15_r20/external/libopenapv/src/oapv_metadata.c (revision abb65b4b03b69e1d508d4d9a44dcf199df16e7c3)
1*abb65b4bSAndroid Build Coastguard Worker /*
2*abb65b4bSAndroid Build Coastguard Worker  * Copyright (c) 2022 Samsung Electronics Co., Ltd.
3*abb65b4bSAndroid Build Coastguard Worker  * All Rights Reserved.
4*abb65b4bSAndroid Build Coastguard Worker  *
5*abb65b4bSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
6*abb65b4bSAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions are met:
7*abb65b4bSAndroid Build Coastguard Worker  *
8*abb65b4bSAndroid Build Coastguard Worker  * - Redistributions of source code must retain the above copyright notice,
9*abb65b4bSAndroid Build Coastguard Worker  *   this list of conditions and the following disclaimer.
10*abb65b4bSAndroid Build Coastguard Worker  *
11*abb65b4bSAndroid Build Coastguard Worker  * - Redistributions in binary form must reproduce the above copyright notice,
12*abb65b4bSAndroid Build Coastguard Worker  *   this list of conditions and the following disclaimer in the documentation
13*abb65b4bSAndroid Build Coastguard Worker  *   and/or other materials provided with the distribution.
14*abb65b4bSAndroid Build Coastguard Worker  *
15*abb65b4bSAndroid Build Coastguard Worker  * - Neither the name of the copyright owner, nor the names of its contributors
16*abb65b4bSAndroid Build Coastguard Worker  *   may be used to endorse or promote products derived from this software
17*abb65b4bSAndroid Build Coastguard Worker  *   without specific prior written permission.
18*abb65b4bSAndroid Build Coastguard Worker  *
19*abb65b4bSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20*abb65b4bSAndroid Build Coastguard Worker  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21*abb65b4bSAndroid Build Coastguard Worker  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22*abb65b4bSAndroid Build Coastguard Worker  * ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23*abb65b4bSAndroid Build Coastguard Worker  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*abb65b4bSAndroid Build Coastguard Worker  * CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*abb65b4bSAndroid Build Coastguard Worker  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*abb65b4bSAndroid Build Coastguard Worker  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*abb65b4bSAndroid Build Coastguard Worker  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*abb65b4bSAndroid Build Coastguard Worker  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*abb65b4bSAndroid Build Coastguard Worker  * POSSIBILITY OF SUCH DAMAGE.
30*abb65b4bSAndroid Build Coastguard Worker  */
31*abb65b4bSAndroid Build Coastguard Worker 
32*abb65b4bSAndroid Build Coastguard Worker #include "oapv_def.h"
33*abb65b4bSAndroid Build Coastguard Worker #include "oapv_metadata.h"
34*abb65b4bSAndroid Build Coastguard Worker 
meta_id_to_ctx(oapvm_t id)35*abb65b4bSAndroid Build Coastguard Worker static oapvm_ctx_t *meta_id_to_ctx(oapvm_t id)
36*abb65b4bSAndroid Build Coastguard Worker {
37*abb65b4bSAndroid Build Coastguard Worker     oapvm_ctx_t *ctx;
38*abb65b4bSAndroid Build Coastguard Worker     oapv_assert_rv(id, NULL);
39*abb65b4bSAndroid Build Coastguard Worker     ctx = (oapvm_ctx_t *)id;
40*abb65b4bSAndroid Build Coastguard Worker     oapv_assert_rv(ctx->magic == OAPVM_MAGIC_CODE, NULL);
41*abb65b4bSAndroid Build Coastguard Worker     return ctx;
42*abb65b4bSAndroid Build Coastguard Worker }
43*abb65b4bSAndroid Build Coastguard Worker 
meta_mdp_find_last_with_check(oapv_md_t * md,int type,unsigned char * uuid)44*abb65b4bSAndroid Build Coastguard Worker static oapv_mdp_t **meta_mdp_find_last_with_check(oapv_md_t *md, int type, unsigned char *uuid)
45*abb65b4bSAndroid Build Coastguard Worker {
46*abb65b4bSAndroid Build Coastguard Worker     oapv_mdp_t **last_mdp = &md->md_payload;
47*abb65b4bSAndroid Build Coastguard Worker 
48*abb65b4bSAndroid Build Coastguard Worker     while((*last_mdp) != NULL) {
49*abb65b4bSAndroid Build Coastguard Worker         if((*last_mdp) == NULL)
50*abb65b4bSAndroid Build Coastguard Worker             break;
51*abb65b4bSAndroid Build Coastguard Worker         if((*last_mdp)->pld_type == type) {
52*abb65b4bSAndroid Build Coastguard Worker             if(type == OAPV_METADATA_USER_DEFINED) {
53*abb65b4bSAndroid Build Coastguard Worker                 if(oapv_mcmp(uuid, (*last_mdp)->pld_data, 16) == 0) {
54*abb65b4bSAndroid Build Coastguard Worker                     return NULL;
55*abb65b4bSAndroid Build Coastguard Worker                 }
56*abb65b4bSAndroid Build Coastguard Worker             }
57*abb65b4bSAndroid Build Coastguard Worker             else {
58*abb65b4bSAndroid Build Coastguard Worker                 return NULL;
59*abb65b4bSAndroid Build Coastguard Worker             }
60*abb65b4bSAndroid Build Coastguard Worker         }
61*abb65b4bSAndroid Build Coastguard Worker         last_mdp = &((*last_mdp)->next);
62*abb65b4bSAndroid Build Coastguard Worker     }
63*abb65b4bSAndroid Build Coastguard Worker     return last_mdp;
64*abb65b4bSAndroid Build Coastguard Worker }
65*abb65b4bSAndroid Build Coastguard Worker 
meta_md_find_mdp(oapv_md_t * md,int mdt)66*abb65b4bSAndroid Build Coastguard Worker static oapv_mdp_t *meta_md_find_mdp(oapv_md_t *md, int mdt)
67*abb65b4bSAndroid Build Coastguard Worker {
68*abb65b4bSAndroid Build Coastguard Worker     oapv_mdp_t *mdp = md->md_payload;
69*abb65b4bSAndroid Build Coastguard Worker 
70*abb65b4bSAndroid Build Coastguard Worker     while(mdp != NULL) {
71*abb65b4bSAndroid Build Coastguard Worker         if(mdp->pld_type == mdt) {
72*abb65b4bSAndroid Build Coastguard Worker             break;
73*abb65b4bSAndroid Build Coastguard Worker         }
74*abb65b4bSAndroid Build Coastguard Worker         mdp = mdp->next;
75*abb65b4bSAndroid Build Coastguard Worker     }
76*abb65b4bSAndroid Build Coastguard Worker 
77*abb65b4bSAndroid Build Coastguard Worker     return mdp;
78*abb65b4bSAndroid Build Coastguard Worker }
79*abb65b4bSAndroid Build Coastguard Worker 
meta_md_free_mdp(oapv_mdp_t * mdp)80*abb65b4bSAndroid Build Coastguard Worker static int meta_md_free_mdp(oapv_mdp_t *mdp)
81*abb65b4bSAndroid Build Coastguard Worker {
82*abb65b4bSAndroid Build Coastguard Worker     oapv_mfree(mdp->pld_data);
83*abb65b4bSAndroid Build Coastguard Worker     return OAPV_OK;
84*abb65b4bSAndroid Build Coastguard Worker }
85*abb65b4bSAndroid Build Coastguard Worker 
meta_md_rm_mdp(oapv_md_t * md,int mdt)86*abb65b4bSAndroid Build Coastguard Worker static int meta_md_rm_mdp(oapv_md_t *md, int mdt)
87*abb65b4bSAndroid Build Coastguard Worker {
88*abb65b4bSAndroid Build Coastguard Worker     oapv_mdp_t *mdp = md->md_payload;
89*abb65b4bSAndroid Build Coastguard Worker     oapv_mdp_t *mdp_prev = NULL;
90*abb65b4bSAndroid Build Coastguard Worker 
91*abb65b4bSAndroid Build Coastguard Worker     while(mdp->pld_type != mdt && mdp->next != NULL) {
92*abb65b4bSAndroid Build Coastguard Worker         mdp_prev = mdp;
93*abb65b4bSAndroid Build Coastguard Worker         mdp = mdp->next;
94*abb65b4bSAndroid Build Coastguard Worker     }
95*abb65b4bSAndroid Build Coastguard Worker 
96*abb65b4bSAndroid Build Coastguard Worker     if(mdp->pld_type == mdt) {
97*abb65b4bSAndroid Build Coastguard Worker         if(mdp_prev == NULL) {
98*abb65b4bSAndroid Build Coastguard Worker             md->md_payload = NULL;
99*abb65b4bSAndroid Build Coastguard Worker         }
100*abb65b4bSAndroid Build Coastguard Worker         else {
101*abb65b4bSAndroid Build Coastguard Worker             mdp_prev->next = mdp->next;
102*abb65b4bSAndroid Build Coastguard Worker         }
103*abb65b4bSAndroid Build Coastguard Worker         meta_md_free_mdp(mdp);
104*abb65b4bSAndroid Build Coastguard Worker         md->md_num--;
105*abb65b4bSAndroid Build Coastguard Worker         return OAPV_OK;
106*abb65b4bSAndroid Build Coastguard Worker     }
107*abb65b4bSAndroid Build Coastguard Worker 
108*abb65b4bSAndroid Build Coastguard Worker     return OAPV_ERR_NOT_FOUND;
109*abb65b4bSAndroid Build Coastguard Worker }
110*abb65b4bSAndroid Build Coastguard Worker 
meta_md_rm_usd(oapv_md_t * md,unsigned char * uuid)111*abb65b4bSAndroid Build Coastguard Worker static int meta_md_rm_usd(oapv_md_t *md, unsigned char *uuid)
112*abb65b4bSAndroid Build Coastguard Worker {
113*abb65b4bSAndroid Build Coastguard Worker     oapv_mdp_t *mdp = md->md_payload;
114*abb65b4bSAndroid Build Coastguard Worker     oapv_mdp_t *mdp_prev = NULL;
115*abb65b4bSAndroid Build Coastguard Worker     while(mdp != NULL) {
116*abb65b4bSAndroid Build Coastguard Worker         if(mdp->pld_type == OAPV_METADATA_USER_DEFINED) {
117*abb65b4bSAndroid Build Coastguard Worker             if(oapv_mcmp(uuid, mdp->pld_data, 16) == 0) {
118*abb65b4bSAndroid Build Coastguard Worker                 if(mdp_prev == NULL) {
119*abb65b4bSAndroid Build Coastguard Worker                     md->md_payload = NULL;
120*abb65b4bSAndroid Build Coastguard Worker                 }
121*abb65b4bSAndroid Build Coastguard Worker                 else {
122*abb65b4bSAndroid Build Coastguard Worker                     mdp_prev->next = mdp->next;
123*abb65b4bSAndroid Build Coastguard Worker                 }
124*abb65b4bSAndroid Build Coastguard Worker                 oapv_assert_rv(md->md_size >= mdp->pld_size, OAPV_ERR_UNEXPECTED);
125*abb65b4bSAndroid Build Coastguard Worker                 md->md_size -= mdp->pld_size;
126*abb65b4bSAndroid Build Coastguard Worker                 meta_md_free_mdp(mdp);
127*abb65b4bSAndroid Build Coastguard Worker                 md->md_num--;
128*abb65b4bSAndroid Build Coastguard Worker                 return OAPV_OK;
129*abb65b4bSAndroid Build Coastguard Worker             }
130*abb65b4bSAndroid Build Coastguard Worker         }
131*abb65b4bSAndroid Build Coastguard Worker         mdp_prev = mdp;
132*abb65b4bSAndroid Build Coastguard Worker         mdp = mdp->next;
133*abb65b4bSAndroid Build Coastguard Worker     }
134*abb65b4bSAndroid Build Coastguard Worker 
135*abb65b4bSAndroid Build Coastguard Worker     return OAPV_ERR_NOT_FOUND;
136*abb65b4bSAndroid Build Coastguard Worker }
137*abb65b4bSAndroid Build Coastguard Worker 
meta_md_find_usd(oapv_md_t * md,unsigned char * uuid)138*abb65b4bSAndroid Build Coastguard Worker static oapv_mdp_t *meta_md_find_usd(oapv_md_t *md, unsigned char *uuid)
139*abb65b4bSAndroid Build Coastguard Worker {
140*abb65b4bSAndroid Build Coastguard Worker     oapv_mdp_t *mdp = md->md_payload;
141*abb65b4bSAndroid Build Coastguard Worker     while(mdp != NULL) {
142*abb65b4bSAndroid Build Coastguard Worker         if(mdp->pld_type == OAPV_METADATA_USER_DEFINED) {
143*abb65b4bSAndroid Build Coastguard Worker             oapv_md_usd_t *usd = (oapv_md_usd_t *)mdp->pld_data;
144*abb65b4bSAndroid Build Coastguard Worker             if(oapv_mcmp(uuid, usd->uuid, 16) == 0) {
145*abb65b4bSAndroid Build Coastguard Worker                 return mdp;
146*abb65b4bSAndroid Build Coastguard Worker             }
147*abb65b4bSAndroid Build Coastguard Worker         }
148*abb65b4bSAndroid Build Coastguard Worker         mdp = mdp->next;
149*abb65b4bSAndroid Build Coastguard Worker     }
150*abb65b4bSAndroid Build Coastguard Worker 
151*abb65b4bSAndroid Build Coastguard Worker     return NULL;
152*abb65b4bSAndroid Build Coastguard Worker }
153*abb65b4bSAndroid Build Coastguard Worker 
meta_verify_mdp_data(int type,int size,u8 * data)154*abb65b4bSAndroid Build Coastguard Worker static int meta_verify_mdp_data(int type, int size, u8 *data)
155*abb65b4bSAndroid Build Coastguard Worker {
156*abb65b4bSAndroid Build Coastguard Worker     if(type == OAPV_METADATA_ITU_T_T35) {
157*abb65b4bSAndroid Build Coastguard Worker         if(size == 0) {
158*abb65b4bSAndroid Build Coastguard Worker             return OAPV_ERR_INVALID_ARGUMENT;
159*abb65b4bSAndroid Build Coastguard Worker         }
160*abb65b4bSAndroid Build Coastguard Worker         if(*data == 0xFF) {
161*abb65b4bSAndroid Build Coastguard Worker             if(size == 1) {
162*abb65b4bSAndroid Build Coastguard Worker                 return OAPV_ERR_INVALID_ARGUMENT;
163*abb65b4bSAndroid Build Coastguard Worker             }
164*abb65b4bSAndroid Build Coastguard Worker         }
165*abb65b4bSAndroid Build Coastguard Worker     }
166*abb65b4bSAndroid Build Coastguard Worker     else if(type == OAPV_METADATA_MDCV) {
167*abb65b4bSAndroid Build Coastguard Worker         if(size != 24) {
168*abb65b4bSAndroid Build Coastguard Worker             return OAPV_ERR_INVALID_ARGUMENT;
169*abb65b4bSAndroid Build Coastguard Worker         }
170*abb65b4bSAndroid Build Coastguard Worker     }
171*abb65b4bSAndroid Build Coastguard Worker     else if(type == OAPV_METADATA_CLL) {
172*abb65b4bSAndroid Build Coastguard Worker         if(size != 4) {
173*abb65b4bSAndroid Build Coastguard Worker             return OAPV_ERR_INVALID_ARGUMENT;
174*abb65b4bSAndroid Build Coastguard Worker         }
175*abb65b4bSAndroid Build Coastguard Worker     }
176*abb65b4bSAndroid Build Coastguard Worker     else if(type == OAPV_METADATA_USER_DEFINED) {
177*abb65b4bSAndroid Build Coastguard Worker         if(size < 16) {
178*abb65b4bSAndroid Build Coastguard Worker             return OAPV_ERR_INVALID_ARGUMENT;
179*abb65b4bSAndroid Build Coastguard Worker         }
180*abb65b4bSAndroid Build Coastguard Worker     }
181*abb65b4bSAndroid Build Coastguard Worker     else {
182*abb65b4bSAndroid Build Coastguard Worker         return OAPV_OK;
183*abb65b4bSAndroid Build Coastguard Worker     }
184*abb65b4bSAndroid Build Coastguard Worker     return OAPV_OK;
185*abb65b4bSAndroid Build Coastguard Worker }
186*abb65b4bSAndroid Build Coastguard Worker 
meta_free_md(oapv_md_t * md)187*abb65b4bSAndroid Build Coastguard Worker static void meta_free_md(oapv_md_t *md)
188*abb65b4bSAndroid Build Coastguard Worker {
189*abb65b4bSAndroid Build Coastguard Worker     oapv_mdp_t *mdp = md->md_payload;
190*abb65b4bSAndroid Build Coastguard Worker     while(mdp != NULL) {
191*abb65b4bSAndroid Build Coastguard Worker         oapv_mdp_t *tmp_mdp = mdp;
192*abb65b4bSAndroid Build Coastguard Worker         mdp = mdp->next;
193*abb65b4bSAndroid Build Coastguard Worker         if(tmp_mdp->pld_data != NULL) {
194*abb65b4bSAndroid Build Coastguard Worker             oapv_mfree(tmp_mdp->pld_data);
195*abb65b4bSAndroid Build Coastguard Worker         }
196*abb65b4bSAndroid Build Coastguard Worker         oapv_mfree(tmp_mdp);
197*abb65b4bSAndroid Build Coastguard Worker     }
198*abb65b4bSAndroid Build Coastguard Worker }
199*abb65b4bSAndroid Build Coastguard Worker 
oapvm_set(oapvm_t mid,int group_id,int type,void * data,int size,unsigned char * uuid)200*abb65b4bSAndroid Build Coastguard Worker int oapvm_set(oapvm_t mid, int group_id, int type, void *data, int size, unsigned char *uuid)
201*abb65b4bSAndroid Build Coastguard Worker {
202*abb65b4bSAndroid Build Coastguard Worker     oapvm_ctx_t *md_list = meta_id_to_ctx(mid);
203*abb65b4bSAndroid Build Coastguard Worker 
204*abb65b4bSAndroid Build Coastguard Worker     int          ret = meta_verify_mdp_data(type, size, (u8 *)data);
205*abb65b4bSAndroid Build Coastguard Worker     oapv_assert_rv(OAPV_SUCCEEDED(ret), ret);
206*abb65b4bSAndroid Build Coastguard Worker 
207*abb65b4bSAndroid Build Coastguard Worker     int md_list_idx = 0;
208*abb65b4bSAndroid Build Coastguard Worker     while(md_list_idx < md_list->num) {
209*abb65b4bSAndroid Build Coastguard Worker         if(md_list->group_ids[md_list_idx] == group_id) {
210*abb65b4bSAndroid Build Coastguard Worker             break;
211*abb65b4bSAndroid Build Coastguard Worker         }
212*abb65b4bSAndroid Build Coastguard Worker         md_list_idx++;
213*abb65b4bSAndroid Build Coastguard Worker     }
214*abb65b4bSAndroid Build Coastguard Worker     if(md_list_idx == md_list->num) {
215*abb65b4bSAndroid Build Coastguard Worker         md_list->num++;
216*abb65b4bSAndroid Build Coastguard Worker     }
217*abb65b4bSAndroid Build Coastguard Worker     md_list->group_ids[md_list_idx] = group_id;
218*abb65b4bSAndroid Build Coastguard Worker     oapv_mdp_t **last_ptr = meta_mdp_find_last_with_check(&md_list->md_arr[md_list_idx], type,
219*abb65b4bSAndroid Build Coastguard Worker                                                           (type == OAPV_METADATA_USER_DEFINED) ? uuid : NULL);
220*abb65b4bSAndroid Build Coastguard Worker     while(last_ptr == NULL) {
221*abb65b4bSAndroid Build Coastguard Worker         oapvm_rem(mid, group_id, type, uuid);
222*abb65b4bSAndroid Build Coastguard Worker         last_ptr = meta_mdp_find_last_with_check(&md_list->md_arr[md_list_idx], type,
223*abb65b4bSAndroid Build Coastguard Worker                                                  (type == OAPV_METADATA_USER_DEFINED) ? uuid : NULL);
224*abb65b4bSAndroid Build Coastguard Worker     }
225*abb65b4bSAndroid Build Coastguard Worker     oapv_mdp_t *tmp_mdp = oapv_malloc(sizeof(oapv_mdp_t));
226*abb65b4bSAndroid Build Coastguard Worker     oapv_assert_rv(tmp_mdp != NULL, OAPV_ERR_OUT_OF_MEMORY);
227*abb65b4bSAndroid Build Coastguard Worker 
228*abb65b4bSAndroid Build Coastguard Worker     oapv_mset(tmp_mdp, 0, sizeof(oapv_mdp_t));
229*abb65b4bSAndroid Build Coastguard Worker     tmp_mdp->pld_size = size;
230*abb65b4bSAndroid Build Coastguard Worker     tmp_mdp->pld_type = type;
231*abb65b4bSAndroid Build Coastguard Worker     tmp_mdp->pld_data = data;
232*abb65b4bSAndroid Build Coastguard Worker     *last_ptr = tmp_mdp;
233*abb65b4bSAndroid Build Coastguard Worker 
234*abb65b4bSAndroid Build Coastguard Worker     /* calculate length of payload type */
235*abb65b4bSAndroid Build Coastguard Worker     int tmp_mpt = type;
236*abb65b4bSAndroid Build Coastguard Worker     while(tmp_mpt >= 255) {
237*abb65b4bSAndroid Build Coastguard Worker         tmp_mpt -= 255;
238*abb65b4bSAndroid Build Coastguard Worker         md_list->md_arr[md_list_idx].md_size += 1;
239*abb65b4bSAndroid Build Coastguard Worker     }
240*abb65b4bSAndroid Build Coastguard Worker     md_list->md_arr[md_list_idx].md_size += 1;
241*abb65b4bSAndroid Build Coastguard Worker 
242*abb65b4bSAndroid Build Coastguard Worker     /*  calculate length of payload data size */
243*abb65b4bSAndroid Build Coastguard Worker     int tmp_mps = size;
244*abb65b4bSAndroid Build Coastguard Worker     while(tmp_mps >= 255) {
245*abb65b4bSAndroid Build Coastguard Worker         tmp_mps -= 255;
246*abb65b4bSAndroid Build Coastguard Worker         md_list->md_arr[md_list_idx].md_size += 1;
247*abb65b4bSAndroid Build Coastguard Worker     }
248*abb65b4bSAndroid Build Coastguard Worker     md_list->md_arr[md_list_idx].md_size += 1;
249*abb65b4bSAndroid Build Coastguard Worker 
250*abb65b4bSAndroid Build Coastguard Worker     md_list->md_arr[md_list_idx].md_size += tmp_mdp->pld_size;
251*abb65b4bSAndroid Build Coastguard Worker     md_list->md_arr[md_list_idx].md_num++;
252*abb65b4bSAndroid Build Coastguard Worker     return OAPV_OK;
253*abb65b4bSAndroid Build Coastguard Worker }
254*abb65b4bSAndroid Build Coastguard Worker 
oapvm_get(oapvm_t mid,int group_id,int type,void ** data,int * size,unsigned char * uuid)255*abb65b4bSAndroid Build Coastguard Worker int oapvm_get(oapvm_t mid, int group_id, int type, void **data, int *size, unsigned char *uuid)
256*abb65b4bSAndroid Build Coastguard Worker {
257*abb65b4bSAndroid Build Coastguard Worker     oapvm_ctx_t *md_list = meta_id_to_ctx(mid);
258*abb65b4bSAndroid Build Coastguard Worker     for(int i = 0; i < md_list->num; i++) {
259*abb65b4bSAndroid Build Coastguard Worker         if(group_id != md_list->group_ids[i]) {
260*abb65b4bSAndroid Build Coastguard Worker             continue;
261*abb65b4bSAndroid Build Coastguard Worker         }
262*abb65b4bSAndroid Build Coastguard Worker         oapv_mdp_t *mdp = (type == OAPV_METADATA_USER_DEFINED) ? meta_md_find_usd(&md_list->md_arr[i], uuid) : meta_md_find_mdp(&md_list->md_arr[i], type);
263*abb65b4bSAndroid Build Coastguard Worker         if(mdp != NULL) {
264*abb65b4bSAndroid Build Coastguard Worker             *data = mdp->pld_data;
265*abb65b4bSAndroid Build Coastguard Worker             *size = mdp->pld_size;
266*abb65b4bSAndroid Build Coastguard Worker             return OAPV_OK;
267*abb65b4bSAndroid Build Coastguard Worker         }
268*abb65b4bSAndroid Build Coastguard Worker     }
269*abb65b4bSAndroid Build Coastguard Worker 
270*abb65b4bSAndroid Build Coastguard Worker     return OAPV_ERR_NOT_FOUND;
271*abb65b4bSAndroid Build Coastguard Worker }
oapvm_rem(oapvm_t mid,int group_id,int type,unsigned char * uuid)272*abb65b4bSAndroid Build Coastguard Worker int oapvm_rem(oapvm_t mid, int group_id, int type, unsigned char *uuid)
273*abb65b4bSAndroid Build Coastguard Worker {
274*abb65b4bSAndroid Build Coastguard Worker     oapvm_ctx_t *md_list = meta_id_to_ctx(mid);
275*abb65b4bSAndroid Build Coastguard Worker     int          md_list_idx = 0;
276*abb65b4bSAndroid Build Coastguard Worker     while(md_list_idx < md_list->num) {
277*abb65b4bSAndroid Build Coastguard Worker         if(md_list->group_ids[md_list_idx] == group_id) {
278*abb65b4bSAndroid Build Coastguard Worker             break;
279*abb65b4bSAndroid Build Coastguard Worker         }
280*abb65b4bSAndroid Build Coastguard Worker         md_list_idx++;
281*abb65b4bSAndroid Build Coastguard Worker     }
282*abb65b4bSAndroid Build Coastguard Worker     oapv_assert_rv(md_list_idx < md_list->num, OAPV_ERR_NOT_FOUND);
283*abb65b4bSAndroid Build Coastguard Worker     if(type == OAPV_METADATA_USER_DEFINED) {
284*abb65b4bSAndroid Build Coastguard Worker         return meta_md_rm_usd(&md_list->md_arr[md_list_idx], uuid);
285*abb65b4bSAndroid Build Coastguard Worker     }
286*abb65b4bSAndroid Build Coastguard Worker     return meta_md_rm_mdp(&md_list->md_arr[md_list_idx], type);
287*abb65b4bSAndroid Build Coastguard Worker }
288*abb65b4bSAndroid Build Coastguard Worker 
oapvm_set_all(oapvm_t mid,oapvm_payload_t * pld,int num_plds)289*abb65b4bSAndroid Build Coastguard Worker int oapvm_set_all(oapvm_t mid, oapvm_payload_t *pld, int num_plds)
290*abb65b4bSAndroid Build Coastguard Worker {
291*abb65b4bSAndroid Build Coastguard Worker     int          ret;
292*abb65b4bSAndroid Build Coastguard Worker     oapvm_ctx_t *md_list = meta_id_to_ctx(mid);
293*abb65b4bSAndroid Build Coastguard Worker     for(int i = 0; i < num_plds; i++) {
294*abb65b4bSAndroid Build Coastguard Worker         ret = meta_verify_mdp_data(pld[i].type, pld[i].data_size, (u8 *)pld[i].data);
295*abb65b4bSAndroid Build Coastguard Worker         oapv_assert_g(OAPV_SUCCEEDED(ret), ERR);
296*abb65b4bSAndroid Build Coastguard Worker 
297*abb65b4bSAndroid Build Coastguard Worker         int md_list_idx = 0;
298*abb65b4bSAndroid Build Coastguard Worker         while(md_list_idx < md_list->num) {
299*abb65b4bSAndroid Build Coastguard Worker             if(md_list->group_ids[md_list_idx] == pld[i].group_id) {
300*abb65b4bSAndroid Build Coastguard Worker                 break;
301*abb65b4bSAndroid Build Coastguard Worker             }
302*abb65b4bSAndroid Build Coastguard Worker             md_list_idx++;
303*abb65b4bSAndroid Build Coastguard Worker         }
304*abb65b4bSAndroid Build Coastguard Worker         if(md_list_idx == md_list->num) {
305*abb65b4bSAndroid Build Coastguard Worker             md_list->num++;
306*abb65b4bSAndroid Build Coastguard Worker         }
307*abb65b4bSAndroid Build Coastguard Worker 
308*abb65b4bSAndroid Build Coastguard Worker         md_list->group_ids[md_list_idx] = pld[i].group_id;
309*abb65b4bSAndroid Build Coastguard Worker         md_list->md_arr[md_list_idx].md_num++;
310*abb65b4bSAndroid Build Coastguard Worker         oapv_mdp_t **last_ptr = meta_mdp_find_last_with_check(&md_list->md_arr[md_list_idx], pld[i].type,
311*abb65b4bSAndroid Build Coastguard Worker                                                               (pld[i].type == OAPV_METADATA_USER_DEFINED) ? pld[i].uuid : NULL);
312*abb65b4bSAndroid Build Coastguard Worker         while(last_ptr == NULL) {
313*abb65b4bSAndroid Build Coastguard Worker             oapvm_rem(mid, pld[i].group_id, pld[i].type, pld[i].uuid);
314*abb65b4bSAndroid Build Coastguard Worker             last_ptr = meta_mdp_find_last_with_check(&md_list->md_arr[md_list_idx], pld[i].type,
315*abb65b4bSAndroid Build Coastguard Worker                                                      (pld[i].type == OAPV_METADATA_USER_DEFINED) ? pld[i].uuid : NULL);
316*abb65b4bSAndroid Build Coastguard Worker         }
317*abb65b4bSAndroid Build Coastguard Worker         oapv_mdp_t *tmp_mdp = oapv_malloc(sizeof(oapv_mdp_t));
318*abb65b4bSAndroid Build Coastguard Worker         oapv_assert_rv(tmp_mdp != NULL, OAPV_ERR_OUT_OF_MEMORY);
319*abb65b4bSAndroid Build Coastguard Worker         oapv_mset(tmp_mdp, 0, sizeof(oapv_mdp_t));
320*abb65b4bSAndroid Build Coastguard Worker         tmp_mdp->pld_size = pld[i].data_size;
321*abb65b4bSAndroid Build Coastguard Worker         tmp_mdp->pld_type = pld[i].type;
322*abb65b4bSAndroid Build Coastguard Worker         tmp_mdp->pld_data = pld[i].data;
323*abb65b4bSAndroid Build Coastguard Worker         md_list->md_arr[md_list_idx].md_size += tmp_mdp->pld_size;
324*abb65b4bSAndroid Build Coastguard Worker 
325*abb65b4bSAndroid Build Coastguard Worker         *last_ptr = tmp_mdp;
326*abb65b4bSAndroid Build Coastguard Worker     }
327*abb65b4bSAndroid Build Coastguard Worker     return OAPV_OK;
328*abb65b4bSAndroid Build Coastguard Worker 
329*abb65b4bSAndroid Build Coastguard Worker ERR:
330*abb65b4bSAndroid Build Coastguard Worker     return ret;
331*abb65b4bSAndroid Build Coastguard Worker }
332*abb65b4bSAndroid Build Coastguard Worker 
oapvm_get_all(oapvm_t mid,oapvm_payload_t * pld,int * num_plds)333*abb65b4bSAndroid Build Coastguard Worker int oapvm_get_all(oapvm_t mid, oapvm_payload_t *pld, int *num_plds)
334*abb65b4bSAndroid Build Coastguard Worker {
335*abb65b4bSAndroid Build Coastguard Worker     oapvm_ctx_t *md_list = meta_id_to_ctx(mid);
336*abb65b4bSAndroid Build Coastguard Worker     if(pld == NULL) {
337*abb65b4bSAndroid Build Coastguard Worker         int num_payload = 0;
338*abb65b4bSAndroid Build Coastguard Worker         for(int i = 0; i < md_list->num; i++) {
339*abb65b4bSAndroid Build Coastguard Worker             num_payload += md_list->md_arr[i].md_num;
340*abb65b4bSAndroid Build Coastguard Worker         }
341*abb65b4bSAndroid Build Coastguard Worker         *num_plds = num_payload;
342*abb65b4bSAndroid Build Coastguard Worker         return OAPV_OK;
343*abb65b4bSAndroid Build Coastguard Worker     }
344*abb65b4bSAndroid Build Coastguard Worker     int p_cnt = 0;
345*abb65b4bSAndroid Build Coastguard Worker     for(int i = 0; i < md_list->num; i++) {
346*abb65b4bSAndroid Build Coastguard Worker         int         group_id = md_list->group_ids[i];
347*abb65b4bSAndroid Build Coastguard Worker         oapv_mdp_t *mdp = md_list->md_arr[i].md_payload;
348*abb65b4bSAndroid Build Coastguard Worker         while(mdp != NULL) {
349*abb65b4bSAndroid Build Coastguard Worker             oapv_assert_rv(p_cnt < *num_plds, OAPV_ERR_REACHED_MAX);
350*abb65b4bSAndroid Build Coastguard Worker             pld[p_cnt].group_id = group_id;
351*abb65b4bSAndroid Build Coastguard Worker             pld[p_cnt].data_size = mdp->pld_size;
352*abb65b4bSAndroid Build Coastguard Worker             pld[p_cnt].data = mdp->pld_data;
353*abb65b4bSAndroid Build Coastguard Worker             pld[p_cnt].type = mdp->pld_type;
354*abb65b4bSAndroid Build Coastguard Worker             if(pld[p_cnt].type == OAPV_METADATA_USER_DEFINED) {
355*abb65b4bSAndroid Build Coastguard Worker                 oapv_mcpy(pld[p_cnt].uuid, mdp->pld_data, 16);
356*abb65b4bSAndroid Build Coastguard Worker             }
357*abb65b4bSAndroid Build Coastguard Worker             else {
358*abb65b4bSAndroid Build Coastguard Worker                 oapv_mset(pld[p_cnt].uuid, 0, 16);
359*abb65b4bSAndroid Build Coastguard Worker             }
360*abb65b4bSAndroid Build Coastguard Worker             p_cnt++;
361*abb65b4bSAndroid Build Coastguard Worker             mdp = mdp->next;
362*abb65b4bSAndroid Build Coastguard Worker         }
363*abb65b4bSAndroid Build Coastguard Worker     }
364*abb65b4bSAndroid Build Coastguard Worker     *num_plds = p_cnt;
365*abb65b4bSAndroid Build Coastguard Worker     return OAPV_OK;
366*abb65b4bSAndroid Build Coastguard Worker }
367*abb65b4bSAndroid Build Coastguard Worker 
oapvm_rem_all(oapvm_t mid)368*abb65b4bSAndroid Build Coastguard Worker void oapvm_rem_all(oapvm_t mid)
369*abb65b4bSAndroid Build Coastguard Worker {
370*abb65b4bSAndroid Build Coastguard Worker 
371*abb65b4bSAndroid Build Coastguard Worker     oapvm_ctx_t *md_list = meta_id_to_ctx(mid);
372*abb65b4bSAndroid Build Coastguard Worker     for(int i = 0; i < md_list->num; i++) {
373*abb65b4bSAndroid Build Coastguard Worker         meta_free_md(&md_list->md_arr[i]);
374*abb65b4bSAndroid Build Coastguard Worker         oapv_mset(&md_list->md_arr[i], 0, sizeof(oapv_md_t));
375*abb65b4bSAndroid Build Coastguard Worker     }
376*abb65b4bSAndroid Build Coastguard Worker     md_list->num = 0;
377*abb65b4bSAndroid Build Coastguard Worker }
378*abb65b4bSAndroid Build Coastguard Worker 
oapvm_create(int * err)379*abb65b4bSAndroid Build Coastguard Worker oapvm_t oapvm_create(int *err)
380*abb65b4bSAndroid Build Coastguard Worker {
381*abb65b4bSAndroid Build Coastguard Worker     oapvm_ctx_t *md_list;
382*abb65b4bSAndroid Build Coastguard Worker     md_list = oapv_malloc(sizeof(oapvm_ctx_t));
383*abb65b4bSAndroid Build Coastguard Worker     if(md_list == NULL) {
384*abb65b4bSAndroid Build Coastguard Worker         *err = OAPV_ERR_OUT_OF_MEMORY;
385*abb65b4bSAndroid Build Coastguard Worker         return NULL;
386*abb65b4bSAndroid Build Coastguard Worker     }
387*abb65b4bSAndroid Build Coastguard Worker     oapv_mset(md_list, 0, sizeof(oapvm_ctx_t));
388*abb65b4bSAndroid Build Coastguard Worker 
389*abb65b4bSAndroid Build Coastguard Worker     md_list->magic = OAPVM_MAGIC_CODE;
390*abb65b4bSAndroid Build Coastguard Worker     return md_list;
391*abb65b4bSAndroid Build Coastguard Worker }
392*abb65b4bSAndroid Build Coastguard Worker 
oapvm_delete(oapvm_t mid)393*abb65b4bSAndroid Build Coastguard Worker void oapvm_delete(oapvm_t mid)
394*abb65b4bSAndroid Build Coastguard Worker {
395*abb65b4bSAndroid Build Coastguard Worker     oapvm_ctx_t *md_list = meta_id_to_ctx(mid);
396*abb65b4bSAndroid Build Coastguard Worker     for(int i = 0; i < md_list->num; i++) {
397*abb65b4bSAndroid Build Coastguard Worker         meta_free_md(&md_list->md_arr[i]);
398*abb65b4bSAndroid Build Coastguard Worker     }
399*abb65b4bSAndroid Build Coastguard Worker     oapv_mfree(md_list);
400*abb65b4bSAndroid Build Coastguard Worker }
401