diff --git a/src/include/ipxe/fc.h b/src/include/ipxe/fc.h index 00571f1f..a907c4cb 100644 --- a/src/include/ipxe/fc.h +++ b/src/include/ipxe/fc.h @@ -71,6 +71,8 @@ extern const char * fc_id_ntoa ( const struct fc_port_id *id ); extern int fc_id_aton ( const char *id_text, struct fc_port_id *id ); extern const char * fc_ntoa ( const struct fc_name *wwn ); extern int fc_aton ( const char *wwn_text, struct fc_name *wwn ); +extern struct sockaddr * fc_fill_sockaddr ( struct sockaddr_fc *sa_fc, + struct fc_port_id *id ); /****************************************************************************** * diff --git a/src/net/fc.c b/src/net/fc.c index d5761c89..e8e92159 100644 --- a/src/net/fc.c +++ b/src/net/fc.c @@ -146,6 +146,26 @@ int fc_aton ( const char *wwn_text, struct fc_name *wwn ) { } } +/** + * Fill Fibre Channel socket address + * + * @v sa_fc Fibre Channel socket address to fill in + * @v id Fibre Channel port ID + * @ret sa Socket address + */ +struct sockaddr * fc_fill_sockaddr ( struct sockaddr_fc *sa_fc, + struct fc_port_id *id ) { + union { + struct sockaddr sa; + struct sockaddr_fc fc; + } *u = container_of ( sa_fc, typeof ( *u ), fc ); + + memset ( sa_fc, 0, sizeof ( *sa_fc ) ); + sa_fc->sfc_family = AF_FC; + memcpy ( &sa_fc->sfc_port_id, id, sizeof ( sa_fc->sfc_port_id ) ); + return &u->sa; +} + /****************************************************************************** * * Fibre Channel link state @@ -549,6 +569,8 @@ static int fc_xchg_rx ( struct fc_exchange *xchg, struct io_buffer *iobuf, struct fc_port *port = xchg->port; struct fc_frame_header *fchdr = iobuf->data; struct xfer_metadata fc_meta; + struct sockaddr_fc src; + struct sockaddr_fc dest; int rc; /* Record peer exchange ID */ @@ -605,6 +627,8 @@ static int fc_xchg_rx ( struct fc_exchange *xchg, struct io_buffer *iobuf, fc_meta.flags |= XFER_FL_ABS_OFFSET; fc_meta.offset = ntohl ( fchdr->parameter ); } + fc_meta.src = fc_fill_sockaddr ( &src, &fchdr->s_id ); + fc_meta.dest = fc_fill_sockaddr ( &dest, &fchdr->d_id ); /* Reset timeout */ start_timer_fixed ( &xchg->timer, FC_TIMEOUT ); diff --git a/src/net/fcels.c b/src/net/fcels.c index fe2f5c22..67ee5ef5 100644 --- a/src/net/fcels.c +++ b/src/net/fcels.c @@ -119,25 +119,18 @@ static struct fc_els_handler * fc_els_detect ( struct fc_els *els, * @ret rc Return status code */ int fc_els_tx ( struct fc_els *els, const void *data, size_t len ) { - union { - struct sockaddr sa; - struct sockaddr_fc fc; - } dest; struct xfer_metadata meta; + struct sockaddr_fc dest; int rc; DBGC2 ( els, FCELS_FMT " transmitting:\n", FCELS_ARGS ( els ) ); DBGC2_HDA ( els, 0, data, len ); /* Construct metadata */ - memset ( &dest, 0, sizeof ( dest ) ); - dest.fc.sfc_family = AF_FC; - memcpy ( &dest.fc.sfc_port_id, &els->peer_port_id, - sizeof ( dest.fc.sfc_port_id ) ); memset ( &meta, 0, sizeof ( meta ) ); meta.flags = ( fc_els_is_request ( els ) ? XFER_FL_OVER : ( XFER_FL_RESPONSE | XFER_FL_OUT ) ); - meta.dest = &dest.sa; + meta.dest = fc_fill_sockaddr ( &dest, &els->peer_port_id ); /* Transmit frame */ if ( ( rc = xfer_deliver_raw_meta ( &els->xchg, data, len,