freeipmi-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Freeipmi-devel] FIID Re-Implementation


From: Albert Chu
Subject: Re: [Freeipmi-devel] FIID Re-Implementation
Date: Tue, 24 Jan 2006 08:58:04 -0800

Just a few comment I'd make about the new interface as I'm discovering
issues as I transition tools/the rest of the library to the new interface.

1) Due to packet fields being optional/variable length, byte boundary
restrictions must be put into place when reading/writing blocks of data.
 For example, suppose we the following template:

{4, "foo"},
{4, "bar"},
{8, "foobar"},

Suppose I set a 4 bits of the field "foo", 0 bits in "bar", and all 8
bits of "foobar".  When I call the fiid_obj_get_all() function to get
all of the packet data, I would have a packet with 12 bits of data,
which doesn't make any sense.  Since I can't make assumptions about what
the other 4 bits in that byte actually are, I currently return an error
to the user.

2) All "reserved" fields and previously ignored fields must now be set.
 For example, a number of packets have reserved fields like:

{2, "foo"},
{2, "reserved"},
{4, "bar"},

In the past, we could safely ignore the reserved field.  But now that
fields are optional/variable length, if the reserved field is not
actually set, we would assume its optional.

I originally proposed redoing fiid templates like so:

#define FIID_FIELD_REQUIRED         0x0
#define FIID_FIELD_OPTIONAL         0x1
#define FIID_FIELD_DEPENDENT        0x2

#define FIID_FIELD_FIXED_LENGTH     0x0
#define FIID_FIELD_VARIABLE_LENGTH  0x1

typedef struct fiid_field
{
  uint32_t max_field_len;
  char key[FIID_FIELD_MAX];
  uint8_t requirement_flag;
  uint8_t length_flag;
} fiid_field_t;

But later changed my mind to not change anything.  I'm now debating if
it'd be wise to go back to this model.  It'll be more painful to re-do
all of the templates, but could be better longer term??  We would add an
additional #define to specify fields as RESERVED, indicating that they
are "automatically" set with 0s.

Al

--
Albert Chu
address@hidden
925-422-5311
Computer Scientist
High Performance Systems Division
Lawrence Livermore National Laboratory


----- Original Message -----
From: Albert Chu <address@hidden>
Date: Thursday, January 19, 2006 9:00 am
Subject: Re: [Freeipmi-devel] FIID Re-Implementation

> Just a bit of an update so people can make comments on the current
> direction: 
> 
> typedef struct fiid_field
> {
>  uint32_t max_field_len;
>  char key[FIID_FIELD_MAX];
> } fiid_field_t;
> 
> typedef fiid_field_t fiid_template_t[];
> 
> struct fiid_field_data
> {
>  uint32_t max_field_len;
>  char key[FIID_FIELD_MAX];
>  unsigned int field_len;
> };
> 
> struct fiid_obj
> {
>  uint32_t magic;
>  uint8_t *data;
>  unsigned int data_len;
>  struct fiid_field_data *field_data;
>  unsigned int field_data_len;
> };
> 
> int8_t fiid_template_field_lookup (fiid_template_t tmpl, uint8_t 
> *field);int8_t fiid_obj_field_lookup (fiid_obj_t obj, uint8_t *field);
> fiid_obj_t fiid_obj_create (fiid_template_t tmpl);
> int8_t fiid_obj_destroy (fiid_obj_t obj);
> fiid_obj_t fiid_obj_dup (fiid_obj_t src_obj);
> int8_t fiid_obj_clear (fiid_obj_t obj);
> int8_t fiid_obj_clear_field (fiid_obj_t obj, uint8_t *field);
> int8_t fiid_obj_set (fiid_obj_t obj, uint8_t *field, uint64_t val);
> int8_t fiid_obj_get (fiid_obj_t obj, uint8_t *field, uint64_t *val);
> int8_t fiid_obj_set_data (fiid_obj_t obj, uint8_t *field, uint8_t 
> *data,uint32_t data_len);
> int8_t fiid_obj_get_data (fiid_obj_t obj, uint8_t *field, uint8_t 
> *data,uint32_t data_len);
> int8_t fiid_obj_set_block (fiid_obj_t obj, uint8_t *field_start, 
> uint8_t*field_end, uint8_t *data, uint32_t data_len);
> int8_t fiid_obj_get_block (fiid_obj_t obj, uint8_t *field_start, 
> uint8_t*field_end, uint8_t *data, uint32_t data_len);
> 
> A few comments:
> 
> 1) Now that we're moving to abstract away the internal 
> implementation of
> fiid obj's, many of the original functions like fiid_obj_field_start()
> are static functions and are hidden from the user.
> 
> 2) I believe the choice to call the early interface functions
> "fiid_obj_malloc", "fiid_obj_free", and "fiid_obj_memset", were based
> upon the fact that it was known that a fiid_obj_t was a void * 
> pointer. Now that we have abstracted that away, the function have 
> been renamed
> "fiid_obj_create", "fiid_obj_destroy", and "fiid_obj_clear".  This 
> is a
> semantic issue and I would be willing to change this if people 
> disagree.  
> 
> 3) After a fiid object is created, the templates are never passed 
> aroundanymore.  
> 
> 4) I'm going to develop an iterator interface for this API soon too.
> 
> Al
> 
> --
> Albert Chu
> address@hidden
> 925-422-5311
> Computer Scientist
> High Performance Systems Division
> Lawrence Livermore National Laboratory
> 
> 
> ----- Original Message -----
> From: Albert Chu <address@hidden>
> Date: Thursday, January 12, 2006 1:45 pm
> Subject: Re: [Freeipmi-devel] FIID Re-Implementation
> 
> > 
> > > typedef struct fiid_field
> > > {
> > >  uint32_t max_field_len;
> > >  char key[FIID_FIELD_MAX];
> > >  uint8_t requirement_flag;
> > >  uint8_t length_flag;
> > > } fiid_field_t;
> > 
> > Hmmm.  Thinking about this again.  I'm not sure the flags are even
> > necessary.  I believe the 'len' field of a 'struct fiid_setting' 
> > will be
> > able to take care of both of these issues.  If the 'len' written 
> to 
> > thefiid_obj_t is zero, then clearly it is optional or dependent and
> > shouldn't be sent in the packet.  Whatever 'len' it is set to will
> > clearly determine if it is variable length or not.
> > 
> > Al
> > 
> > --
> > Albert Chu
> > address@hidden
> > 925-422-5311
> > Computer Scientist
> > High Performance Systems Division
> > Lawrence Livermore National Laboratory
> > 
> > 
> > ----- Original Message -----
> > From: Albert Chu <address@hidden>
> > Date: Thursday, January 12, 2006 8:45 am
> > Subject: [Freeipmi-devel] FIID Re-Implementation
> > 
> > > Howdy all,
> > > 
> > > I would like to discuss this topic from the FreeIPMI meeting 
> more 
> > > deeply.
> > > I would like to propose we leave my ipmi 2.0 branch 
> > > (al_ipmi_2_0_branch)sitting.  I think it's best not to merge it 
> > > into the head until our
> > > agreed upon objectives for the next generation library are met 
> > for 
> > > ipmi1.5 first.  I am open to discussion about this too though.
> > > 
> > > Fiid Re-Architecture:
> > > ---------------------
> > > 
> > > As was discussed at the meeting, there are two major problems now
> > > showing up due to IPMI 2.0, many more "optional" or "dependent" 
> > fields> exist and many are variable length. Some examples:
> > > 
> > > - The length of authcode/integrity fields are dependent on the 
> > digest> algorithm used.
> > > 
> > > - OEM fields are sent dependent on if the payload is 
> specifically 
> > > citedas a OEM type.
> > > 
> > > The following is my proposal for the fiid re-architecture.  It 
> > > attemptsto abstract information far more to deal with the above 
> > > issues and
> > > issues with later IPMI versions.
> > > 
> > > #defines and structure re-definitions
> > > -------------------------------------
> > > 
> > > #define FIID_FIELD_REQUIRED         0x0
> > > #define FIID_FIELD_OPTIONAL         0x1
> > > #define FIID_FIELD_DEPENDENT        0x2
> > > 
> > > #define FIID_FIELD_FIXED_LENGTH     0x0
> > > #define FIID_FIELD_VARIABLE_LENGTH  0x1
> > > 
> > > typedef struct fiid_field
> > > {
> > >  uint32_t max_field_len;
> > >  char key[FIID_FIELD_MAX];
> > >  uint8_t requirement_flag;
> > >  uint8_t length_flag;
> > > } fiid_field_t;
> > > 
> > > typedef fiid_field_t const fiid_template_t[];
> > > 
> > > struct fiid_setting
> > > {
> > >  fiid_field_t field;
> > >  uint32_t len;
> > > }
> > > 
> > > struct fiid_obj
> > > {
> > >  void *data;
> > >  unsigned int data_len;
> > >  struct fiid_setting *settings;
> > >  unsigned int settings_len;
> > > };
> > > 
> > > struct struct fiid_obj *fiid_obj_t;
> > > 
> > > Notes:
> > > ------
> > > 
> > > fiid_field_t now includes a flags.  One flag will determine if 
> > the 
> > > fieldin the template is required, dependent, or optional.  
> > > Dependent means
> > > some factor determines if the field should be sent. An example 
> of 
> > this> is the authcode field of an IPMI 1.5 packet.  It is only 
> sent 
> > if if 
> > > theauth-type is not NONE.  An optional field is something that 
> > simply> optional.  Off the top of my head, the last byte in a 
> "Get 
> > Chassis> Status" command is optional.  The other flag is to 
> > determine if the 
> > > thefield is fixed or variable length.
> > > 
> > > fiid_obj_t holds the data, the data length for bounds checking, 
> > object> settings, and the length of the settings array.
> > > 
> > > The fiid_obj_settings_t contains the data in the fields of a
> > > fiid_template_t. Note, that I have currently elected to not have
> > > pointers back to the template, because users have the ability to
> > > alter/create/destroy templates through fiid_template_make.  
> > > Instead, the
> > > data from the template will be copied over.
> > > 
> > > It also includes a len field to indicate how much data has been 
> > copied> into the object for this particular field.  So if the len 
> > is 0, don't
> > > copy the data into a packet (i.e. perhaps the data was 
> optional). 
> > This> len variable fixes the variable length issue of some fields 
> > in IPMI 
> > > 2.0. By abstracting away the "settings" in the above format, 
> this 
> > > shouldhopefully make things more extensible in future versions 
> of 
> > > IPMI.
> > > fiid interface:
> > > ---------------
> > > 
> > > I currently don't imagine a need to alter the fiid API 
> (although 
> > some> changes may be done for cleanup if we decide to).  Here's a 
> > list of
> > > changes that would have to be done underneath in the code:
> > > 
> > > fiid_obj_calloc/alloc/malloc - Must build fiid_obj_settings_t 
> > array 
> > > and build structure.  
> > > 
> > > fiid_obj_free - Must free new structures appropriately.
> > > 
> > > fiid_obj_memset/fiid_obj_memset_field - Must clear 'len' field in
> > > fiid_obj_settings_t array.
> > > 
> > > fiid_obj_set/fiid_obj_set_data - Must set 'len' field 
> appropriately.> > 
> > > fiid_obj_get/fiid_obj_get_data - Must account for variable 'len'
> > > appropriately.
> > > 
> > > fiid_obj_set/fiid_obj_get/fiid_obj_set_data/fiid_obj_get_data: The
> > > template is no longer required.  Would we elect to remove it 
> from 
> > > the API??
> > > 
> > > libfreeipmi changes:
> > > --------------------
> > > 
> > > Various code logic must be altered to appropriately use the fiid
> > > interface and abstract away the new structures:
> > > 
> > > i.e.
> > > 
> > > memcpy(pkt,obj + field_offset,field_len)
> > > 
> > > would have to change to:
> > > 
> > > fiid_obj_get_data(obj,tmpl,field_name,pkt,pkt_len)
> > > 
> > > Memsetting of objects must be changed to using the 
> fiid_obj_memset()> > function, because memset() itself is bad.
> > > 
> > > I think you get the idea.
> > > 
> > > API changes:
> > > ------------
> > > 
> > > If we desire to (we need not) we can eliminate passing of 
> > templates to
> > > many API functions.
> > > 
> > > Needless to say there are various issues that we need to discuss.
> > > 
> > > I believe we came to a reasonable agreement on this change at the
> > > FreeIPMI meeting, so I will (probably soon) begin a branch to 
> > begin 
> > > thisre-work.  When it gets time to the details, we will work it 
> out.> > 
> > > Al
> > > 
> > > Al
> > > 
> > > --
> > > Albert Chu
> > > address@hidden
> > > 925-422-5311
> > > Computer Scientist
> > > High Performance Systems Division
> > > Lawrence Livermore National Laboratory
> > > 
> > > 
> > > 
> > > 
> > > _______________________________________________
> > > Freeipmi-devel mailing list
> > > address@hidden
> > > http://lists.gnu.org/mailman/listinfo/freeipmi-devel
> > > 
> > 
> > 
> 
> 





reply via email to

[Prev in Thread] Current Thread [Next in Thread]