/*===========================================================================
FUNCTION DSMBIT_BIT_COPY

DESCRIPTION
  Copies bitwise from one item into another.

DEPENDENCIES
  Only copies from one item into one item are supported.

PARAMETERS
  src_ptr     - DSM item to copy from
  dst_ptr     - DSM item to copy into
  src_offset  - Bit offset to start copying from
  dst_offset  - Bit offset to start copying into
  len         - Number of bits to copy

RETURN VALUE
  Number of bits copied

SIDE_EFFECTS

===========================================================================*/
uint16 dsmbiti_bit_copy
(
  dsm_item_type*  src_ptr,
  dsm_item_type*  dst_ptr,
  uint16          src_offset,
  uint16          dst_offset,
  uint16          len,
  const char * file,
  uint32 line
)
{
  int i;
  /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

  /* Sanity check on the item pointers */
  if ( (src_ptr == NULL) || (dst_ptr == NULL) )
  {
    MSG(MSG_SSID_DFLT, MSG_LEGACY_ERROR,"NULL dsm item pointer");
    return 0;
  }

  /* Sanity chack that we copy within the items */
  if ( ((((src_offset + len) / 8) + 1) > src_ptr->used)
       ||
       ((((dst_offset + len) / 8) + 1) > DSMI_SIZE(dst_ptr) ) ) 
  {
    MSG_1(MSG_SSID_DFLT, MSG_LEGACY_ERROR,"Copy length %d exceeds item size", len);
    return 0;
  }

  /* Copy each bit */
  for ( i=0; i<len; i++ )
  {
    /* Null out destination bit */
    *(dst_ptr->data_ptr + ((dst_offset + i) / 8)) &= 
      ~dsmbit_bit_copy_mask[(dst_offset + i) % 8];

    /* Or source bit into the very spot */
    *(dst_ptr->data_ptr + ((dst_offset + i) / 8)) |= 
      ((*(src_ptr->data_ptr + ((src_offset + i) / 8))
        & dsmbit_bit_copy_mask[(src_offset + i) % 8]) 
       >> (7 - ((src_offset + i) % 8)))
      << (7 - ((dst_offset + i) % 8));
  }

  /* Update the destination item's used field */
  dst_ptr->used = ((dst_offset + len) / 8) + (((dst_offset + len) % 8) * 1);

#ifdef FEATURE_DSM_MEM_CHK
  dsmi_touch_item(dst_ptr,file,line);
#endif

  return len;
}
Beispiel #2
0
void
dsmi_set_meta
(
  dsm_item_type * item_ptr,
  void * meta_ptr,
  uint32 size,
  const char * file,
  uint32 line
)
{
  
  dsm_pool_mgmt_table_type *table;

  ASSERT( item_ptr != NULL && meta_ptr != NULL );
  ASSERT( DSM_POOL_ITEM_SIZE(item_ptr->pool_id) == 0 );

#ifdef FEATURE_DSM_MEM_CHK_EXPENSIVE_ALWAYS_VERIFY_PACKET
  dsmi_verify_packet(item_ptr);
#endif /* FEATURE_DSM_MEM_CHK_EXPENSIVE_ALWAYS_VERIFY_PACKET */

#ifdef FEATURE_DSM_MEM_CHK
  dsmi_verify_pool_id(item_ptr->pool_id);
#endif

#ifdef FEATURE_DSM_MEM_CHK_QUEUE_CACHE_LENGTH
  ASSERT(item_ptr->enqueued_packet_length == 0);
#endif

  table = (dsm_pool_mgmt_table_type *)item_ptr->pool_id;
  ASSERT( table->pad_size >= size && size > 0 );
  
  memcpy( (uint8*)(item_ptr) - size,  meta_ptr, size );

#ifdef FEATURE_DSM_MEM_CHK
  dsmi_touch_item(item_ptr, file, line);
#endif /* FEATURE_DSM_MEM_CHK */
  
} /* dsm_set_meta */