2 * Utilites for XDR encode and decode of data
4 * Copyright (C) 2010, Broadcom Corporation
7 * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation;
8 * the contents of this file may not be disclosed to third parties, copied
9 * or duplicated in any form, in whole or in part, without the prior
10 * written permission of Broadcom Corporation.
12 * $Id: bcm_xdr.c,v 1.7 2008-11-07 20:26:33 Exp $
17 #include <bcmendian.h>
21 bcm_xdr_buf_init(bcm_xdr_buf_t
*b
, void *buf
, size_t len
)
23 b
->buf
= b
->origbuf
= buf
;
24 b
->size
= b
->origsize
= (uint
)len
;
28 bcm_xdr_pack_uint8_vec(bcm_xdr_buf_t
*b
, uint8
*vec
, uint32 elems
)
31 err
= bcm_xdr_pack_opaque(b
, elems
, vec
);
37 bcm_xdr_unpack_uint8_vec(bcm_xdr_buf_t
*b
, uint8
*vec
, uint32 elems
)
40 err
= bcm_xdr_unpack_opaque_cpy(b
, elems
, vec
);
45 /* Pack 16-bit vectors */
47 bcm_xdr_pack_uint16_vec(bcm_xdr_buf_t
*b
, uint len
, void *vec
)
51 uint16
*vec16
= (uint16
*)vec
, *buf16
= (uint16
*)b
->buf
;
52 ASSERT((len
% sizeof(uint16
)) == 0);
54 /* calc residual padding to 4 bytes */
59 if (b
->size
< tot_len
)
62 /* Do the 16 bit swap and copy */
63 for (i
= 0; i
< (int)(len
/sizeof(uint16
)); i
++)
64 buf16
[i
] = htol16(vec16
[i
]);
67 memset(b
->buf
+ len
, 0, r
);
75 /* Unpack 16-bit vectors */
77 bcm_xdr_unpack_uint16_vec(bcm_xdr_buf_t
*b
, uint len
, void *vec
)
80 uint16
*vec16
= (uint16
*)vec
;
81 ASSERT((len
% sizeof(uint16
)) == 0);
83 err
= bcm_xdr_unpack_opaque_cpy(b
, len
, vec
);
85 /* Do the 16 bit swapping in the copied buffer */
86 for (i
= 0; i
< (int)(len
/sizeof(uint16
)); i
++)
87 vec16
[i
] = ltoh16(vec16
[i
]);
92 /* Pack 32-bit vectors */
94 bcm_xdr_pack_uint32_vec(bcm_xdr_buf_t
*b
, uint len
, void *vec
)
97 uint32
*vec32
= (uint32
*)vec
, *buf32
= (uint32
*)b
->buf
;
98 ASSERT((len
% sizeof(uint32
)) == 0);
103 /* Do the 32 bit swap and copy */
104 for (i
= 0; i
< (int)(len
/sizeof(uint32
)); i
++)
105 buf32
[i
] = htol32(vec32
[i
]);
113 /* Unpack 32-bit vectors */
115 bcm_xdr_unpack_uint32_vec(bcm_xdr_buf_t
*b
, uint len
, void *vec
)
118 uint32
*vec32
= (uint32
*)vec
;
119 ASSERT((len
% sizeof(uint32
)) == 0);
121 err
= bcm_xdr_unpack_opaque_cpy(b
, len
, vec
);
123 /* Do the 32 bit swapping in the copied buffer */
124 for (i
= 0; i
< (int)(len
/sizeof(uint32
)); i
++)
125 vec32
[i
] = ltoh32(vec32
[i
]);
131 bcm_xdr_pack_uint32(bcm_xdr_buf_t
*b
, uint32 val
)
136 *(uint32
*)(b
->buf
) = htol32((uint32
)val
);
144 bcm_xdr_unpack_uint32(bcm_xdr_buf_t
*b
, uint32
*pval
)
149 *pval
= ltoh32(*(uint32
*)(b
->buf
));
158 bcm_xdr_pack_int32(bcm_xdr_buf_t
*b
, int32 val
)
160 return bcm_xdr_pack_uint32(b
, (uint32
)val
);
164 bcm_xdr_unpack_int32(bcm_xdr_buf_t
*b
, int32
*pval
)
166 return bcm_xdr_unpack_uint32(b
, (uint32
*)pval
);
170 bcm_xdr_pack_int8(bcm_xdr_buf_t
*b
, int8 val
)
172 return bcm_xdr_pack_uint32(b
, (uint32
)val
);
176 bcm_xdr_unpack_int8(bcm_xdr_buf_t
*b
, int8
*pval
)
181 err
= bcm_xdr_unpack_uint32(b
, &val
);
188 bcm_xdr_pack_opaque_raw(bcm_xdr_buf_t
*b
, uint len
, void *data
)
192 memcpy(b
->buf
, data
, len
);
200 /* Pad 0 at the remaining part of a rpc buffer */
202 bcm_xdr_pack_opaque_pad(bcm_xdr_buf_t
*b
)
207 /* calc residual padding to 4 bytes */
208 len
= (size_t)(b
->buf
- b
->origbuf
);
217 memset(b
->buf
, 0, r
);
225 /* pack a word-aligned buffer without dealing with the endianess, pad 0 at the end and make
226 * it word-aligned if len is not multiple of 4
229 bcm_xdr_pack_opaque(bcm_xdr_buf_t
*b
, uint len
, void *data
)
234 /* calc residual padding to 4 bytes */
239 if (b
->size
< tot_len
)
242 memcpy(b
->buf
, data
, len
);
243 memset(b
->buf
+ len
, 0, r
);
252 bcm_xdr_unpack_opaque(bcm_xdr_buf_t
*b
, uint len
, void **pdata
)
257 /* calc residual padding to 4 bytes */
261 if (b
->size
< tot_len
)
273 bcm_xdr_unpack_opaque_cpy(bcm_xdr_buf_t
*b
, uint len
, void *data
)
278 err
= bcm_xdr_unpack_opaque(b
, len
, &xdr_data
);
282 memcpy(data
, xdr_data
, len
);
288 bcm_xdr_pack_opaque_varlen(bcm_xdr_buf_t
*b
, uint len
, void *data
)
292 err
= bcm_xdr_pack_uint32(b
, len
);
296 return bcm_xdr_pack_opaque(b
, len
, data
);
300 bcm_xdr_unpack_opaque_varlen(bcm_xdr_buf_t
*b
, uint
*plen
, void **pdata
)
304 err
= bcm_xdr_unpack_uint32(b
, plen
);
308 return bcm_xdr_unpack_opaque(b
, *plen
, pdata
);
312 bcm_xdr_pack_string(bcm_xdr_buf_t
*b
, char *str
)
314 return bcm_xdr_pack_opaque_varlen(b
, strlen(str
), str
);
318 bcm_xdr_unpack_string(bcm_xdr_buf_t
*b
, uint
*plen
, char **pstr
)
320 return bcm_xdr_unpack_opaque_varlen(b
, plen
, (void**)pstr
);