1 // SPDX-License-Identifier: GPL-2.0-only
2 // Copyright 2010 Cisco Systems, Inc. All rights reserved.
4 #include <linux/kernel.h>
5 #include <linux/errno.h>
6 #include <linux/types.h>
7 #include <linux/slab.h>
11 struct vic_provinfo
*vic_provinfo_alloc(gfp_t flags
, const u8
*oui
,
14 struct vic_provinfo
*vp
;
19 vp
= kzalloc(VIC_PROVINFO_MAX_DATA
, flags
);
23 memcpy(vp
->oui
, oui
, sizeof(vp
->oui
));
25 vp
->length
= htonl(sizeof(vp
->num_tlvs
));
30 void vic_provinfo_free(struct vic_provinfo
*vp
)
35 int vic_provinfo_add_tlv(struct vic_provinfo
*vp
, u16 type
, u16 length
,
38 struct vic_provinfo_tlv
*tlv
;
43 if (ntohl(vp
->length
) + offsetof(struct vic_provinfo_tlv
, value
) +
44 length
> VIC_PROVINFO_MAX_TLV_DATA
)
47 tlv
= (struct vic_provinfo_tlv
*)((u8
*)vp
->tlv
+
48 ntohl(vp
->length
) - sizeof(vp
->num_tlvs
));
50 tlv
->type
= htons(type
);
51 tlv
->length
= htons(length
);
52 unsafe_memcpy(tlv
->value
, value
, length
,
53 /* Flexible array of flexible arrays */);
55 vp
->num_tlvs
= htonl(ntohl(vp
->num_tlvs
) + 1);
56 vp
->length
= htonl(ntohl(vp
->length
) +
57 offsetof(struct vic_provinfo_tlv
, value
) + length
);
62 size_t vic_provinfo_size(struct vic_provinfo
*vp
)
64 return vp
? ntohl(vp
->length
) + sizeof(*vp
) - sizeof(vp
->num_tlvs
) : 0;