X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lnet%2Fklnds%2Fviblnd%2Fviblnd.c;h=7995610e440c4841c7b4d3685bfefed8d868fef8;hb=7e80985d02e71f02b9a99f91d6eb0e154ba56c85;hp=d54d4c8e8528a8fe2fd27e8610c2d6dc7b87dfb3;hpb=7c82d3a45a4a5c796e85ead3d07c0b73624f721c;p=fs%2Flustre-release.git diff --git a/lnet/klnds/viblnd/viblnd.c b/lnet/klnds/viblnd/viblnd.c index d54d4c8..7995610e 100644 --- a/lnet/klnds/viblnd/viblnd.c +++ b/lnet/klnds/viblnd/viblnd.c @@ -47,6 +47,131 @@ static ctl_table kibnal_top_ctl_table[] = { }; #endif +void vibnal_assert_wire_constants (void) +{ + /* Wire protocol assertions generated by 'wirecheck' + * running on Linux robert.bartonsoftware.com 2.6.5-1.358 #1 Sat May 8 09:04:50 EDT 2004 i686 + * with gcc version 3.3.3 20040412 (Red Hat Linux 3.3.3-7) */ + + + /* Constants... */ + CLASSERT (IBNAL_MSG_MAGIC == 0x0be91b91); + CLASSERT (IBNAL_MSG_VERSION == 6); + CLASSERT (IBNAL_MSG_CONNREQ == 0xc0); + CLASSERT (IBNAL_MSG_CONNACK == 0xc1); + CLASSERT (IBNAL_MSG_NOOP == 0xd0); + CLASSERT (IBNAL_MSG_IMMEDIATE == 0xd1); + CLASSERT (IBNAL_MSG_PUT_REQ == 0xd2); + CLASSERT (IBNAL_MSG_PUT_NAK == 0xd3); + CLASSERT (IBNAL_MSG_PUT_ACK == 0xd4); + CLASSERT (IBNAL_MSG_PUT_DONE == 0xd5); + CLASSERT (IBNAL_MSG_GET_REQ == 0xd6); + CLASSERT (IBNAL_MSG_GET_DONE == 0xd7); + + /* Checks for struct kib_connparams_t */ + CLASSERT ((int)sizeof(kib_connparams_t) == 12); + CLASSERT ((int)offsetof(kib_connparams_t, ibcp_queue_depth) == 0); + CLASSERT ((int)sizeof(((kib_connparams_t *)0)->ibcp_queue_depth) == 4); + CLASSERT ((int)offsetof(kib_connparams_t, ibcp_max_msg_size) == 4); + CLASSERT ((int)sizeof(((kib_connparams_t *)0)->ibcp_max_msg_size) == 4); + CLASSERT ((int)offsetof(kib_connparams_t, ibcp_max_frags) == 8); + CLASSERT ((int)sizeof(((kib_connparams_t *)0)->ibcp_max_frags) == 4); + + /* Checks for struct kib_immediate_msg_t */ + CLASSERT ((int)sizeof(kib_immediate_msg_t) == 72); + CLASSERT ((int)offsetof(kib_immediate_msg_t, ibim_hdr) == 0); + CLASSERT ((int)sizeof(((kib_immediate_msg_t *)0)->ibim_hdr) == 72); + CLASSERT ((int)offsetof(kib_immediate_msg_t, ibim_payload[13]) == 85); + CLASSERT ((int)sizeof(((kib_immediate_msg_t *)0)->ibim_payload[13]) == 1); + + /* Checks for struct kib_rdma_frag_t */ + CLASSERT ((int)sizeof(kib_rdma_frag_t) == 12); + CLASSERT ((int)offsetof(kib_rdma_frag_t, rf_nob) == 0); + CLASSERT ((int)sizeof(((kib_rdma_frag_t *)0)->rf_nob) == 4); + CLASSERT ((int)offsetof(kib_rdma_frag_t, rf_addr_lo) == 4); + CLASSERT ((int)sizeof(((kib_rdma_frag_t *)0)->rf_addr_lo) == 4); + CLASSERT ((int)offsetof(kib_rdma_frag_t, rf_addr_hi) == 8); + CLASSERT ((int)sizeof(((kib_rdma_frag_t *)0)->rf_addr_hi) == 4); + + /* Checks for struct kib_rdma_desc_t */ + CLASSERT ((int)sizeof(kib_rdma_desc_t) == 8); + CLASSERT ((int)offsetof(kib_rdma_desc_t, rd_key) == 0); + CLASSERT ((int)sizeof(((kib_rdma_desc_t *)0)->rd_key) == 4); + CLASSERT ((int)offsetof(kib_rdma_desc_t, rd_nfrag) == 4); + CLASSERT ((int)sizeof(((kib_rdma_desc_t *)0)->rd_nfrag) == 4); + CLASSERT ((int)offsetof(kib_rdma_desc_t, rd_frags[13]) == 164); + CLASSERT ((int)sizeof(((kib_rdma_desc_t *)0)->rd_frags[13]) == 12); + + /* Checks for struct kib_putreq_msg_t */ + CLASSERT ((int)sizeof(kib_putreq_msg_t) == 80); + CLASSERT ((int)offsetof(kib_putreq_msg_t, ibprm_hdr) == 0); + CLASSERT ((int)sizeof(((kib_putreq_msg_t *)0)->ibprm_hdr) == 72); + CLASSERT ((int)offsetof(kib_putreq_msg_t, ibprm_cookie) == 72); + CLASSERT ((int)sizeof(((kib_putreq_msg_t *)0)->ibprm_cookie) == 8); + + /* Checks for struct kib_putack_msg_t */ + CLASSERT ((int)sizeof(kib_putack_msg_t) == 24); + CLASSERT ((int)offsetof(kib_putack_msg_t, ibpam_src_cookie) == 0); + CLASSERT ((int)sizeof(((kib_putack_msg_t *)0)->ibpam_src_cookie) == 8); + CLASSERT ((int)offsetof(kib_putack_msg_t, ibpam_dst_cookie) == 8); + CLASSERT ((int)sizeof(((kib_putack_msg_t *)0)->ibpam_dst_cookie) == 8); + CLASSERT ((int)offsetof(kib_putack_msg_t, ibpam_rd) == 16); + CLASSERT ((int)sizeof(((kib_putack_msg_t *)0)->ibpam_rd) == 8); + + /* Checks for struct kib_get_msg_t */ + CLASSERT ((int)sizeof(kib_get_msg_t) == 88); + CLASSERT ((int)offsetof(kib_get_msg_t, ibgm_hdr) == 0); + CLASSERT ((int)sizeof(((kib_get_msg_t *)0)->ibgm_hdr) == 72); + CLASSERT ((int)offsetof(kib_get_msg_t, ibgm_cookie) == 72); + CLASSERT ((int)sizeof(((kib_get_msg_t *)0)->ibgm_cookie) == 8); + CLASSERT ((int)offsetof(kib_get_msg_t, ibgm_rd) == 80); + CLASSERT ((int)sizeof(((kib_get_msg_t *)0)->ibgm_rd) == 8); + + /* Checks for struct kib_completion_msg_t */ + CLASSERT ((int)sizeof(kib_completion_msg_t) == 12); + CLASSERT ((int)offsetof(kib_completion_msg_t, ibcm_cookie) == 0); + CLASSERT ((int)sizeof(((kib_completion_msg_t *)0)->ibcm_cookie) == 8); + CLASSERT ((int)offsetof(kib_completion_msg_t, ibcm_status) == 8); + CLASSERT ((int)sizeof(((kib_completion_msg_t *)0)->ibcm_status) == 4); + + /* Checks for struct kib_msg_t */ + CLASSERT ((int)sizeof(kib_msg_t) == 144); + CLASSERT ((int)offsetof(kib_msg_t, ibm_magic) == 0); + CLASSERT ((int)sizeof(((kib_msg_t *)0)->ibm_magic) == 4); + CLASSERT ((int)offsetof(kib_msg_t, ibm_version) == 4); + CLASSERT ((int)sizeof(((kib_msg_t *)0)->ibm_version) == 2); + CLASSERT ((int)offsetof(kib_msg_t, ibm_type) == 6); + CLASSERT ((int)sizeof(((kib_msg_t *)0)->ibm_type) == 1); + CLASSERT ((int)offsetof(kib_msg_t, ibm_credits) == 7); + CLASSERT ((int)sizeof(((kib_msg_t *)0)->ibm_credits) == 1); + CLASSERT ((int)offsetof(kib_msg_t, ibm_nob) == 8); + CLASSERT ((int)sizeof(((kib_msg_t *)0)->ibm_nob) == 4); + CLASSERT ((int)offsetof(kib_msg_t, ibm_cksum) == 12); + CLASSERT ((int)sizeof(((kib_msg_t *)0)->ibm_cksum) == 4); + CLASSERT ((int)offsetof(kib_msg_t, ibm_srcnid) == 16); + CLASSERT ((int)sizeof(((kib_msg_t *)0)->ibm_srcnid) == 8); + CLASSERT ((int)offsetof(kib_msg_t, ibm_srcstamp) == 24); + CLASSERT ((int)sizeof(((kib_msg_t *)0)->ibm_srcstamp) == 8); + CLASSERT ((int)offsetof(kib_msg_t, ibm_dstnid) == 32); + CLASSERT ((int)sizeof(((kib_msg_t *)0)->ibm_dstnid) == 8); + CLASSERT ((int)offsetof(kib_msg_t, ibm_dststamp) == 40); + CLASSERT ((int)sizeof(((kib_msg_t *)0)->ibm_dststamp) == 8); + CLASSERT ((int)offsetof(kib_msg_t, ibm_seq) == 48); + CLASSERT ((int)sizeof(((kib_msg_t *)0)->ibm_seq) == 8); + CLASSERT ((int)offsetof(kib_msg_t, ibm_u.connparams) == 56); + CLASSERT ((int)sizeof(((kib_msg_t *)0)->ibm_u.connparams) == 12); + CLASSERT ((int)offsetof(kib_msg_t, ibm_u.immediate) == 56); + CLASSERT ((int)sizeof(((kib_msg_t *)0)->ibm_u.immediate) == 72); + CLASSERT ((int)offsetof(kib_msg_t, ibm_u.putreq) == 56); + CLASSERT ((int)sizeof(((kib_msg_t *)0)->ibm_u.putreq) == 80); + CLASSERT ((int)offsetof(kib_msg_t, ibm_u.putack) == 56); + CLASSERT ((int)sizeof(((kib_msg_t *)0)->ibm_u.putack) == 24); + CLASSERT ((int)offsetof(kib_msg_t, ibm_u.get) == 56); + CLASSERT ((int)sizeof(((kib_msg_t *)0)->ibm_u.get) == 88); + CLASSERT ((int)offsetof(kib_msg_t, ibm_u.completion) == 56); + CLASSERT ((int)sizeof(((kib_msg_t *)0)->ibm_u.completion) == 12); +} + void kibnal_pause(int ticks) { @@ -185,10 +310,7 @@ kibnal_unpack_msg(kib_msg_t *msg, int nob) break; case IBNAL_MSG_PUT_REQ: - /* CAVEAT EMPTOR! We don't actually put ibprm_rd on the wire; - * it's just there to remember the source buffers while we wait - * for the PUT_ACK */ - if (msg_nob < offsetof(kib_msg_t, ibm_u.putreq.ibprm_rd)) { + if (msg_nob < sizeof(msg->ibm_u.putreq)) { CERROR("Short PUT_REQ: %d(%d)\n", msg_nob, (int)(hdr_size + sizeof(msg->ibm_u.putreq))); return -EPROTO; @@ -1175,7 +1297,7 @@ kibnal_alloc_pages (kib_pages_t **pp, int npages, int allow_write) for (i = 0; i < npages; i++) { phys_pages[i].size = PAGE_SIZE; - phys_pages[i].start = page_to_phys(p->ibp_pages[i]); + phys_pages[i].start = kibnal_page2phys(p->ibp_pages[i]); } VV_ACCESS_CONTROL_MASK_SET_ALL(access); @@ -1778,6 +1900,8 @@ kibnal_module_init (void) { int rc; + vibnal_assert_wire_constants(); + CLASSERT (offsetof(kib_msg_t, ibm_u) + sizeof(kib_connparams_t) <= cm_REQ_priv_data_len); CLASSERT (offsetof(kib_msg_t, ibm_u) + sizeof(kib_connparams_t)