diff --git a/src/include/ipxe/asn1.h b/src/include/ipxe/asn1.h index 5a6c0d9c..847d845b 100644 --- a/src/include/ipxe/asn1.h +++ b/src/include/ipxe/asn1.h @@ -9,7 +9,9 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); +#include #include +#include #include #include @@ -337,6 +339,28 @@ asn1_type ( const struct asn1_cursor *cursor ) { return ( ( cursor->len >= sizeof ( *type ) ) ? *type : ASN1_END ); } +/** + * Get cursor for built object + * + * @v builder ASN.1 object builder + * @ret cursor ASN.1 object cursor + */ +static inline __attribute__ (( always_inline )) struct asn1_cursor * +asn1_built ( struct asn1_builder *builder ) { + union { + struct asn1_builder builder; + struct asn1_cursor cursor; + } *u = container_of ( builder, typeof ( *u ), builder ); + + /* Sanity check */ + linker_assert ( ( ( const void * ) &u->builder.data ) == + &u->cursor.data, asn1_builder_cursor_data_mismatch ); + linker_assert ( &u->builder.len == &u->cursor.len, + asn1_builder_cursor_len_mismatch ); + + return &u->cursor; +} + extern int asn1_start ( struct asn1_cursor *cursor, unsigned int type, size_t extra ); extern int asn1_enter ( struct asn1_cursor *cursor, unsigned int type );