def get_gbe_core_details(self, read_arp=False, read_cpu=False):
        """
        Get 10GbE core details.
        assemble struct for header stuff...

        .. code-block:: python

            \"\"\"
            0x00 - 0x07: MAC address
            0x08 - 0x0b: Not used
            0x0c - 0x0f: Gateway addr
            0x10 - 0x13: IP addr
            0x14 - 0x17: Not assigned
            0x18 - 0x1b: Buffer sizes
            0x1c - 0x1f: Not assigned
            0x20    :    Soft reset (bit 0)
            0x21    :    Fabric enable (bit 0)
            0x22 - 0x23: Fabric port
            0x24 - 0x27: XAUI status (bit 2,3,4,5 = lane sync, bit6 = chan_bond)
            0x28 - 0x2b: PHY config
            0x28    :    RX_eq_mix
            0x29    :    RX_eq_pol
            0x2a    :    TX_preemph
            0x2b    :    TX_diff_ctrl
            0x30 - 0x33: Multicast IP RX base address
            0x34 - 0x37: Multicast IP mask
            0x38 - 0x3b: Subnet mask
            0x1000  :    CPU TX buffer
            0x2000  :    CPU RX buffer
            0x3000  :    ARP tables start
            word_width = 8
            \"\"\"
            self.add_field(Bitfield.Field('mac0', 0,            word_width,                 0, 0 * word_width))
            self.add_field(Bitfield.Field('mac1', 0,            word_width,                 0, 1 * word_width))
            self.add_field(Bitfield.Field('mac2', 0,            word_width,                 0, 2 * word_width))
            self.add_field(Bitfield.Field('mac3', 0,            word_width,                 0, 3 * word_width))
            self.add_field(Bitfield.Field('mac4', 0,            word_width,                 0, 4 * word_width))
            self.add_field(Bitfield.Field('mac5', 0,            word_width,                 0, 5 * word_width))
            self.add_field(Bitfield.Field('mac6', 0,            word_width,                 0, 6 * word_width))
            self.add_field(Bitfield.Field('mac7', 0,            word_width,                 0, 7 * word_width))
            self.add_field(Bitfield.Field('unused_1', 0,        (0x0c - 0x08) * word_width, 0, 8 * word_width))
            self.add_field(Bitfield.Field('gateway_ip0', 0,     word_width,                 0, 0x0c * word_width))
            self.add_field(Bitfield.Field('gateway_ip1', 0,     word_width,                 0, 0x0d * word_width))
            self.add_field(Bitfield.Field('gateway_ip2', 0,     word_width,                 0, 0x0e * word_width))
            self.add_field(Bitfield.Field('gateway_ip3', 0,     word_width,                 0, 0x0f * word_width))
            self.add_field(Bitfield.Field('ip0', 0,             word_width,                 0, 0x10 * word_width))
            self.add_field(Bitfield.Field('ip1', 0,             word_width,                 0, 0x11 * word_width))
            self.add_field(Bitfield.Field('ip2', 0,             word_width,                 0, 0x12 * word_width))
            self.add_field(Bitfield.Field('ip3', 0,             word_width,                 0, 0x13 * word_width))
            self.add_field(Bitfield.Field('unused_2', 0,        (0x18 - 0x14) * word_width, 0, 0x14 * word_width))
            self.add_field(Bitfield.Field('buf_sizes', 0,       (0x1c - 0x18) * word_width, 0, 0x18 * word_width))
            self.add_field(Bitfield.Field('unused_3', 0,        (0x20 - 0x1c) * word_width, 0, 0x1c * word_width))
            self.add_field(Bitfield.Field('soft_reset', 2,      1,                          0, 0x20 * word_width))
            self.add_field(Bitfield.Field('fabric_enable', 2,   1,                          0, 0x21 * word_width))
            self.add_field(Bitfield.Field('port', 0,            (0x24 - 0x22) * word_width, 0, 0x22 * word_width))
            self.add_field(Bitfield.Field('xaui_status', 0,     (0x28 - 0x24) * word_width, 0, 0x24 * word_width))
            self.add_field(Bitfield.Field('rx_eq_mix', 0,       word_width,                 0, 0x28 * word_width))
            self.add_field(Bitfield.Field('rq_eq_pol', 0,       word_width,                 0, 0x29 * word_width))
            self.add_field(Bitfield.Field('tx_preempth', 0,     word_width,                 0, 0x2a * word_width))
            self.add_field(Bitfield.Field('tx_diff_ctrl', 0,    word_width,                 0, 0x2b * word_width))
            #self.add_field(Bitfield.Field('buffer_tx', 0,       0x1000 * word_width,        0, 0x1000 * word_width))
            #self.add_field(Bitfield.Field('buffer_rx', 0,       0x1000 * word_width,        0, 0x2000 * word_width))
            #self.add_field(Bitfield.Field('arp_table', 0,       0x1000 * word_width,        0, 0x3000 * word_width))
        """
        if self.memmap_compliant:
            data = self.parent.read(self.name, 16384)
            data = list(struct.unpack('>16384B', data))
            returnval = {
                'ip_prefix': '%i.%i.%i.' % (data[0x14], data[0x15], data[0x16]),
                'ip': IpAddress('%i.%i.%i.%i' % (data[0x14], data[0x15], 
                                                 data[0x16], data[0x17])),
                'subnet_mask': IpAddress('%i.%i.%i.%i' % (
                                  data[0x1c], data[0x1d], data[0x1e], data[0x1f])),
                'mac': Mac('%i:%i:%i:%i:%i:%i' % (data[0x0e], data[0x0f],
                                                  data[0x10], data[0x11],
                                                  data[0x12], data[0x13])),
                'gateway_ip': IpAddress('%i.%i.%i.%i' % (data[0x18], data[0x19],
                                                         data[0x1a], data[0x1b])),
                'fabric_port': ((data[0x32] << 8) + (data[0x33])),
                'fabric_en': bool(data[0x2f] & 1),
                'multicast': {'base_ip': IpAddress('%i.%i.%i.%i' % (
                    data[0x20], data[0x21], data[0x22], data[0x23])),
                              'ip_mask': IpAddress('%i.%i.%i.%i' % (
                                  data[0x24], data[0x25], data[0x26], data[0x27])),
                              'rx_ips': []}
            }
        else:
            data = self.parent.read(self.name, 16384)
            data = list(struct.unpack('>16384B', data))
            returnval = {
                'ip_prefix': '%i.%i.%i.' % (data[0x10], data[0x11], data[0x12]),
                'ip': IpAddress('%i.%i.%i.%i' % (data[0x10], data[0x11], 
                                                 data[0x12], data[0x13])),
                'subnet_mask': IpAddress('%i.%i.%i.%i' % (
                                  data[0x38], data[0x39], data[0x3a], data[0x3b])),
                'mac': Mac('%i:%i:%i:%i:%i:%i' % (data[0x02], data[0x03],
                                                  data[0x04], data[0x05],
                                                  data[0x06], data[0x07])),
                'gateway_ip': IpAddress('%i.%i.%i.%i' % (data[0x0c], data[0x0d],
                                                         data[0x0e], data[0x0f])),
                'fabric_port': ((data[0x22] << 8) + (data[0x23])),
                'fabric_en': bool(data[0x21] & 1),
                'xaui_lane_sync': [bool(data[0x27] & 4), bool(data[0x27] & 8),
                                   bool(data[0x27] & 16), bool(data[0x27] & 32)],
                'xaui_status': [data[0x24], data[0x25], data[0x26], data[0x27]],
                'xaui_chan_bond': bool(data[0x27] & 64),
                'xaui_phy': {'rx_eq_mix': data[0x28], 'rx_eq_pol': data[0x29],
                             'tx_preemph': data[0x2a], 'tx_swing': data[0x2b]},
                'multicast': {'base_ip': IpAddress('%i.%i.%i.%i' % (
                    data[0x30], data[0x31], data[0x32], data[0x33])),
                              'ip_mask': IpAddress('%i.%i.%i.%i' % (
                                  data[0x34], data[0x35], data[0x36], data[0x37])),
                              'rx_ips': []}
            }
        possible_addresses = [int(returnval['multicast']['base_ip'])]
        mask_int = int(returnval['multicast']['ip_mask'])
        for ctr in range(32):
            mask_bit = (mask_int >> ctr) & 1
            if not mask_bit:
                new_ips = []
                for ip in possible_addresses:
                    new_ips.append(ip & (~(1 << ctr)))
                    new_ips.append(new_ips[-1] | (1 << ctr))
                possible_addresses.extend(new_ips)
        tmp = list(set(possible_addresses))
        for ip in tmp:
            returnval['multicast']['rx_ips'].append(IpAddress(ip))
        if read_arp:
            returnval['arp'] = self.get_arp_details(data)
        if read_cpu:
            returnval.update(self.get_cpu_details(data))
        self.core_details = returnval
        return returnval