* [PATCHv10 03/12] ib_core: IBoE UD packet packing support @ 2010-08-26 14:17 Eli Cohen 2010-10-14 20:12 ` Roland Dreier 0 siblings, 1 reply; 7+ messages in thread From: Eli Cohen @ 2010-08-26 14:17 UTC (permalink / raw) To: Roland Dreier; +Cc: RDMA list Add support functions to aid in packing IBoE packets. Signed-off-by: Eli Cohen <eli-VPRAkNaXOzVS1MOuV/RT9w@public.gmane.org> --- drivers/infiniband/core/ud_header.c | 128 ++++++++++++++++++++++++++--------- include/rdma/ib_pack.h | 30 +++++++- 2 files changed, 124 insertions(+), 34 deletions(-) diff --git a/drivers/infiniband/core/ud_header.c b/drivers/infiniband/core/ud_header.c index 650b501..58b5537 100644 --- a/drivers/infiniband/core/ud_header.c +++ b/drivers/infiniband/core/ud_header.c @@ -80,6 +80,29 @@ static const struct ib_field lrh_table[] = { .size_bits = 16 } }; +static const struct ib_field eth_table[] = { + { STRUCT_FIELD(eth, dmac_h), + .offset_words = 0, + .offset_bits = 0, + .size_bits = 32 }, + { STRUCT_FIELD(eth, dmac_l), + .offset_words = 1, + .offset_bits = 0, + .size_bits = 16 }, + { STRUCT_FIELD(eth, smac_h), + .offset_words = 1, + .offset_bits = 16, + .size_bits = 16 }, + { STRUCT_FIELD(eth, smac_l), + .offset_words = 2, + .offset_bits = 0, + .size_bits = 32 }, + { STRUCT_FIELD(eth, type), + .offset_words = 3, + .offset_bits = 0, + .size_bits = 16 } +}; + static const struct ib_field grh_table[] = { { STRUCT_FIELD(grh, ip_version), .offset_words = 0, @@ -180,17 +203,15 @@ static const struct ib_field deth_table[] = { /** * ib_ud_header_init - Initialize UD header structure * @payload_bytes:Length of packet payload + * @lrh_present: specify if LRH is present + * @eth_present: specify if Eth header is present * @grh_present:GRH flag (if non-zero, GRH will be included) - * @immediate_present: specify if immediate data should be used + * @immediate_present: specify if immediate data is present * @header:Structure to initialize - * - * ib_ud_header_init() initializes the lrh.link_version, lrh.link_next_header, - * lrh.packet_length, grh.ip_version, grh.payload_length, - * grh.next_header, bth.opcode, bth.pad_count and - * bth.transport_header_version fields of a &struct ib_ud_header given - * the payload length and whether a GRH will be included. */ 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) @@ -199,42 +220,79 @@ void ib_ud_header_init(int payload_bytes, memset(header, 0, sizeof *header); - 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 + - payload_bytes + - 4 + /* ICRC */ - 3) / 4; /* round up */ - - header->grh_present = grh_present; + if (lrh_present) { + 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; + } + + if (eth_present) + packet_length += IB_ETH_BYTES; + packet_length += IB_BTH_BYTES + IB_DETH_BYTES + payload_bytes + + 4 + /* ICRC */ + 3; /* round up */ + packet_length /= 4; if (grh_present) { - packet_length += IB_GRH_BYTES / 4; - 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 */ + packet_length += IB_GRH_BYTES / 4; + 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; } - header->lrh.packet_length = cpu_to_be16(packet_length); + if (lrh_present) + header->lrh.packet_length = cpu_to_be16(packet_length); - header->immediate_present = immediate_present; - if (immediate_present) + 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; } EXPORT_SYMBOL(ib_ud_header_init); /** + * ib_lrh_header_pack - Pack LRH header struct into wire format + * @lrh:unpacked LRH header struct + * @buf:Buffer to pack into + * + * ib_lrh_header_pack() packs the LRH header structure @lrh into + * wire format in the buffer @buf. + */ +int ib_lrh_header_pack(struct ib_unpacked_lrh *lrh, void *buf) +{ + ib_pack(lrh_table, ARRAY_SIZE(lrh_table), lrh, buf); + return 0; +} +EXPORT_SYMBOL(ib_lrh_header_pack); + +/** + * ib_lrh_header_unpack - Unpack LRH structure from wire format + * @lrh:unpacked LRH header struct + * @buf:Buffer to pack into + * + * ib_lrh_header_unpack() unpacks the LRH header structure from + * wire format (in buf) into @lrh. + */ +int ib_lrh_header_unpack(void *buf, struct ib_unpacked_lrh *lrh) +{ + ib_unpack(lrh_table, ARRAY_SIZE(lrh_table), buf, lrh); + return 0; +} +EXPORT_SYMBOL(ib_lrh_header_unpack); + +/** * ib_ud_header_pack - Pack UD header struct into wire format * @header:UD header struct * @buf:Buffer to pack into @@ -247,9 +305,17 @@ int ib_ud_header_pack(struct ib_ud_header *header, { int len = 0; - ib_pack(lrh_table, ARRAY_SIZE(lrh_table), - &header->lrh, buf); - len += IB_LRH_BYTES; + if (header->lrh_present) { + ib_pack(lrh_table, ARRAY_SIZE(lrh_table), + &header->lrh, buf + len); + len += IB_LRH_BYTES; + } + if (header->eth_present) { + ib_pack(eth_table, ARRAY_SIZE(eth_table), + &header->eth, buf + len); + len += IB_ETH_BYTES; + } + if (header->grh_present) { ib_pack(grh_table, ARRAY_SIZE(grh_table), diff --git a/include/rdma/ib_pack.h b/include/rdma/ib_pack.h index cbb50f4..67a85f3 100644 --- a/include/rdma/ib_pack.h +++ b/include/rdma/ib_pack.h @@ -37,6 +37,7 @@ enum { IB_LRH_BYTES = 8, + IB_ETH_BYTES = 14, IB_GRH_BYTES = 40, IB_BTH_BYTES = 12, IB_DETH_BYTES = 8 @@ -210,8 +211,29 @@ struct ib_unpacked_deth { __be32 source_qpn; }; +struct ib_unpacked_eth { + u8 dmac_h[4]; + u8 dmac_l[2]; + u8 smac_h[2]; + u8 smac_l[4]; + __be16 type; +}; + struct ib_ud_header { + int lrh_present; struct ib_unpacked_lrh lrh; + int eth_present; + struct ib_unpacked_eth eth; + int grh_present; + struct ib_unpacked_grh grh; + struct ib_unpacked_bth bth; + struct ib_unpacked_deth deth; + int immediate_present; + __be32 immediate_data; +}; + +struct eth_ud_header { + struct ib_unpacked_eth eth; int grh_present; struct ib_unpacked_grh grh; struct ib_unpacked_bth bth; @@ -230,9 +252,11 @@ void ib_unpack(const struct ib_field *desc, void *buf, void *structure); -void ib_ud_header_init(int payload_bytes, - int grh_present, - int immediate_present, +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); int ib_ud_header_pack(struct ib_ud_header *header, -- 1.7.2.2 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCHv10 03/12] ib_core: IBoE UD packet packing support 2010-08-26 14:17 [PATCHv10 03/12] ib_core: IBoE UD packet packing support Eli Cohen @ 2010-10-14 20:12 ` Roland Dreier [not found] ` <adazkugildn.fsf-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org> 0 siblings, 1 reply; 7+ messages in thread From: Roland Dreier @ 2010-10-14 20:12 UTC (permalink / raw) To: Eli Cohen; +Cc: RDMA list > + if (lrh_present) { > + 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; > + } > + > + if (eth_present) > + packet_length += IB_ETH_BYTES; How does this code in ib_ud_header_init() work if lrh_present == 0 and eth_present == 1? It seems packet_length is never initialized in that case, or am I missing something? Anyway I changed the patch in my tree to do packet_length = IB_ETH_BYTES if eth_present is set. I'm assuming lrh_present and eth_present are exclusive; in fact it might be a better interface to ib_ud_header_init() if we passed in a link layer type instead of requiring the caller to do it... that would save from everyone having to do + ib_ud_header_init(send_size, !is_eth, is_eth, is_grh, 0, &sqp->ud_header); as ends up later in the patch series. This could be a future cleanup if we care. - R. -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 7+ messages in thread
[parent not found: <adazkugildn.fsf-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>]
* Re: [PATCHv10 03/12] ib_core: IBoE UD packet packing support [not found] ` <adazkugildn.fsf-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org> @ 2010-10-14 21:26 ` Eli Cohen 2010-10-14 21:43 ` Roland Dreier 0 siblings, 1 reply; 7+ messages in thread From: Eli Cohen @ 2010-10-14 21:26 UTC (permalink / raw) To: Roland Dreier; +Cc: RDMA list On Thu, Oct 14, 2010 at 01:12:52PM -0700, Roland Dreier wrote: > > + if (lrh_present) { > > + 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; > > + } > > + > > + if (eth_present) > > + packet_length += IB_ETH_BYTES; > > How does this code in ib_ud_header_init() work if lrh_present == 0 and > eth_present == 1? It seems packet_length is never initialized in that > case, or am I missing something? It's a bug but harmless. packet_length is not used in the case of Ethernet link layer so the fact that it is not initialized doesn't cause any harm. Im the case of IB link layer it is initialized. > > Anyway I changed the patch in my tree to do > > packet_length = IB_ETH_BYTES > > if eth_present is set. > Maybe just we should just remove any calculations on packet_length for the Ethernet case and simplify the function farther. > I'm assuming lrh_present and eth_present are exclusive; in fact it might > be a better interface to ib_ud_header_init() if we passed in a link > layer type instead of requiring the caller to do it... that would save > from everyone having to do > > + ib_ud_header_init(send_size, !is_eth, is_eth, is_grh, 0, &sqp->ud_header); > > as ends up later in the patch series. > > This could be a future cleanup if we care. > Yes, they are mutual exclusive - I agree we can pass in a link layer parameter instead. -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCHv10 03/12] ib_core: IBoE UD packet packing support 2010-10-14 21:26 ` Eli Cohen @ 2010-10-14 21:43 ` Roland Dreier [not found] ` <adapqvcih6l.fsf-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org> 0 siblings, 1 reply; 7+ messages in thread From: Roland Dreier @ 2010-10-14 21:43 UTC (permalink / raw) To: Eli Cohen; +Cc: RDMA list > 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 majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 7+ messages in thread
[parent not found: <adapqvcih6l.fsf-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>]
* Re: [PATCHv10 03/12] ib_core: IBoE UD packet packing support [not found] ` <adapqvcih6l.fsf-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org> @ 2010-10-14 21:57 ` Eli Cohen 2010-10-14 22:34 ` Ralph Campbell 0 siblings, 1 reply; 7+ messages in thread From: Eli Cohen @ 2010-10-14 21:57 UTC (permalink / raw) To: Roland Dreier; +Cc: RDMA list On Thu, Oct 14, 2010 at 02:43:30PM -0700, Roland Dreier wrote: > > 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. Looks good. -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 7+ messages in thread
* RE: [PATCHv10 03/12] ib_core: IBoE UD packet packing support 2010-10-14 21:57 ` Eli Cohen @ 2010-10-14 22:34 ` Ralph Campbell [not found] ` <35AAF1E4A771E142979F27B51793A488873ABE0767-HolNjIBXvBOXx9kJd3VG2h2eb7JE58TQ@public.gmane.org> 0 siblings, 1 reply; 7+ messages in thread From: Ralph Campbell @ 2010-10-14 22:34 UTC (permalink / raw) To: Eli Cohen, Roland Dreier; +Cc: RDMA list ________________________________________ From: linux-rdma-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org [linux-rdma-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org] On Behalf Of Eli Cohen [eli-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org] Sent: Thursday, October 14, 2010 2:57 PM To: Roland Dreier Cc: RDMA list Subject: Re: [PATCHv10 03/12] ib_core: IBoE UD packet packing support On Thu, Oct 14, 2010 at 02:43:30PM -0700, Roland Dreier wrote: > > 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) This should be "if (immediate_present)". header->immediate_present is zero due to the memset() above. > 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. Looks good. -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 7+ messages in thread
[parent not found: <35AAF1E4A771E142979F27B51793A488873ABE0767-HolNjIBXvBOXx9kJd3VG2h2eb7JE58TQ@public.gmane.org>]
* Re: [PATCHv10 03/12] ib_core: IBoE UD packet packing support [not found] ` <35AAF1E4A771E142979F27B51793A488873ABE0767-HolNjIBXvBOXx9kJd3VG2h2eb7JE58TQ@public.gmane.org> @ 2010-10-15 4:27 ` Roland Dreier 0 siblings, 0 replies; 7+ messages in thread From: Roland Dreier @ 2010-10-15 4:27 UTC (permalink / raw) To: Ralph Campbell; +Cc: Eli Cohen, RDMA list > > if (header->immediate_present) > > This should be "if (immediate_present)". > header->immediate_present is zero due to the memset() above. Thanks, fixed that up. -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2010-10-15 4:27 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-08-26 14:17 [PATCHv10 03/12] ib_core: IBoE UD packet packing support Eli Cohen
2010-10-14 20:12 ` Roland Dreier
[not found] ` <adazkugildn.fsf-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>
2010-10-14 21:26 ` Eli Cohen
2010-10-14 21:43 ` Roland Dreier
[not found] ` <adapqvcih6l.fsf-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>
2010-10-14 21:57 ` Eli Cohen
2010-10-14 22:34 ` Ralph Campbell
[not found] ` <35AAF1E4A771E142979F27B51793A488873ABE0767-HolNjIBXvBOXx9kJd3VG2h2eb7JE58TQ@public.gmane.org>
2010-10-15 4:27 ` Roland Dreier
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox