/* * Send an ACK */ void ompi_btl_usnic_ack_send( ompi_btl_usnic_module_t *module, ompi_btl_usnic_endpoint_t *endpoint) { ompi_btl_usnic_ack_segment_t *ack; #if MSGDEBUG1 uint8_t mac[6]; char src_mac[32]; char dest_mac[32]; #endif /* Get an ACK frag. If we don't get one, just discard this ACK. */ ack = ompi_btl_usnic_ack_segment_alloc(module); if (OPAL_UNLIKELY(NULL == ack)) { opal_output(0, "====================== No frag for sending the ACK -- skipped"); abort(); } /* send the seq of the lowest item in the window that we've received */ ack->ss_base.us_btl_header->ack_seq = endpoint->endpoint_next_contig_seq_to_recv - 1; ack->ss_base.us_sg_entry[0].length = sizeof(ompi_btl_usnic_btl_header_t); #if MSGDEBUG1 memset(src_mac, 0, sizeof(src_mac)); memset(dest_mac, 0, sizeof(dest_mac)); ompi_btl_usnic_sprintf_mac(src_mac, module->if_mac); ompi_btl_usnic_gid_to_mac(&endpoint->endpoint_remote_addr.gid, mac); ompi_btl_usnic_sprintf_mac(dest_mac, mac); opal_output(0, "--> Sending ACK, sg_entry length %d, seq %" UDSEQ " to %s, qp %u", ack->ss_base.us_sg_entry[0].length, ack->ss_base.us_btl_header->ack_seq, dest_mac, endpoint->endpoint_remote_addr.qp_num[ack->ss_channel]); #endif /* send the ACK */ ompi_btl_usnic_post_segment(module, endpoint, ack); /* Stats */ ++module->stats.num_ack_sends; return; }
int ompi_btl_usnic_find_ip(ompi_btl_usnic_module_t *module, uint8_t mac[6]) { int i; uint8_t localmac[6]; char addr_string[32], mac_string[32]; struct sockaddr sa; struct sockaddr_in *sai; /* Loop through all IP interfaces looking for the one with the right MAC */ for (i = opal_ifbegin(); i != -1; i = opal_ifnext(i)) { if (OPAL_SUCCESS == opal_ifindextomac(i, localmac)) { /* Is this the MAC I'm looking for? */ if (0 != memcmp(mac, localmac, 6)) { continue; } /* Yes, it is! */ if (OPAL_SUCCESS != opal_ifindextoname(i, module->if_name, sizeof(module->if_name)) || OPAL_SUCCESS != opal_ifindextoaddr(i, &sa, sizeof(sa)) || OPAL_SUCCESS != opal_ifindextomask(i, &module->if_cidrmask, sizeof(module->if_cidrmask)) || OPAL_SUCCESS != opal_ifindextomac(i, module->if_mac) || OPAL_SUCCESS != opal_ifindextomtu(i, &module->if_mtu)) { continue; } sai = (struct sockaddr_in *) &sa; memcpy(&module->if_ipv4_addr, &sai->sin_addr, 4); /* Save this information to my local address field on the module so that it gets sent in the modex */ module->local_addr.ipv4_addr = module->if_ipv4_addr; module->local_addr.cidrmask = module->if_cidrmask; /* Since verbs doesn't offer a way to get standard Ethernet MTUs (as of libibverbs 1.1.5, the MTUs are enums, and don't inlcude values for 1500 or 9000), look up the MTU in the corresponding enic interface. */ module->local_addr.mtu = module->if_mtu; inet_ntop(AF_INET, &(module->if_ipv4_addr), addr_string, sizeof(addr_string)); ompi_btl_usnic_sprintf_mac(mac_string, mac); opal_output_verbose(5, mca_btl_base_verbose, "btl:usnic: found usNIC device corresponds to IP device %s, %s/%d, MAC %s", module->if_name, addr_string, module->if_cidrmask, mac_string); return OMPI_SUCCESS; } } return OMPI_ERR_NOT_FOUND; }
void ompi_btl_usnic_sprintf_gid_mac(char *out, union ibv_gid *gid) { uint8_t mac[6]; ompi_btl_usnic_gid_to_mac(gid, mac); ompi_btl_usnic_sprintf_mac(out, mac); }