> Maybe just we should just remove any calculations on packet_length for
 > the Ethernet case and simplify the function farther.

Makes sense-- I updated my tree to look like:

void ib_ud_header_init(int                  payload_bytes,
                       int                  lrh_present,
                       int                  eth_present,
                       int                  grh_present,
                       int                  immediate_present,
                       struct ib_ud_header *header)
{
        memset(header, 0, sizeof *header);

        if (lrh_present) {
                u16 packet_length;

                header->lrh.link_version     = 0;
                header->lrh.link_next_header =
                        grh_present ? IB_LNH_IBA_GLOBAL : IB_LNH_IBA_LOCAL;
                packet_length = (IB_LRH_BYTES   +
                                 IB_BTH_BYTES   +
                                 IB_DETH_BYTES  +
                                 grh_present ? IB_GRH_BYTES : 0 +
                                 payload_bytes  +
                                 4              + /* ICRC     */
                                 3) / 4;          /* round up */
                header->lrh.packet_length = cpu_to_be16(packet_length);
        }

        if (grh_present) {
                header->grh.ip_version      = 6;
                header->grh.payload_length  =
                        cpu_to_be16((IB_BTH_BYTES     +
                                     IB_DETH_BYTES    +
                                     payload_bytes    +
                                     4                + /* ICRC     */
                                     3) & ~3);          /* round up */
                header->grh.next_header     = 0x1b;
        }

        if (header->immediate_present)
                header->bth.opcode           = 
IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE;
        else
                header->bth.opcode           = IB_OPCODE_UD_SEND_ONLY;
        header->bth.pad_count                = (4 - payload_bytes) & 3;
        header->bth.transport_header_version = 0;

        header->lrh_present = lrh_present;
        header->eth_present = eth_present;
        header->grh_present = grh_present;
        header->immediate_present = immediate_present;
}

which I think is reasonably clean for now.
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to