/** * Attempt to transmit PeerDist discovery requests on all sockets * * @v uuid Message UUID string * @v id Segment identifier string */ static void peerdisc_socket_tx ( const char *uuid, const char *id ) { struct peerdisc_socket *socket; struct net_device *netdev; struct xfer_metadata meta; union { struct sockaddr sa; struct sockaddr_tcpip st; } address; char *request; size_t len; int rc; /* Construct discovery request */ request = peerdist_discovery_request ( uuid, id ); if ( ! request ) goto err_request; len = strlen ( request ); /* Initialise data transfer metadata */ memset ( &meta, 0, sizeof ( meta ) ); meta.dest = &address.sa; /* Send message on each socket */ for_each_table_entry ( socket, PEERDISC_SOCKETS ) { /* Initialise socket address */ memcpy ( &address.sa, &socket->address.sa, sizeof ( address.sa ) ); /* Send message on each open network device */ for_each_netdev ( netdev ) { /* Skip unopened network devices */ if ( ! netdev_is_open ( netdev ) ) continue; address.st.st_scope_id = netdev->index; /* Discard request (for test purposes) if applicable */ if ( inject_fault ( PEERDISC_DISCARD_RATE ) ) continue; /* Transmit request */ if ( ( rc = xfer_deliver_raw_meta ( &socket->xfer, request, len, &meta ) ) != 0 ) { DBGC ( socket, "PEERDISC %s could not transmit " "via %s: %s\n", socket->name, netdev->name, strerror ( rc ) ); /* Contine to try other net devices/sockets */ continue; } } }
/** * Transmit Fibre Channel ELS frame * * @v els Fibre Channel ELS transaction * @v data Data to transmit * @v len Length of data * @ret rc Return status code */ int fc_els_tx ( struct fc_els *els, const void *data, size_t len ) { 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 ( &meta, 0, sizeof ( meta ) ); meta.flags = ( fc_els_is_request ( els ) ? XFER_FL_OVER : ( XFER_FL_RESPONSE | XFER_FL_OUT ) ); meta.dest = fc_fill_sockaddr ( &dest, &els->peer_port_id ); /* Transmit frame */ if ( ( rc = xfer_deliver_raw_meta ( &els->xchg, data, len, &meta ) ) != 0 ) { DBGC ( els, FCELS_FMT " could not deliver frame: %s\n", FCELS_ARGS ( els ), strerror ( rc ) ); return rc; } return 0; }
/** * Deliver datagram as raw data without metadata * * @v intf Data transfer interface * @v data Data * @v len Length of data * @ret rc Return status code */ int xfer_deliver_raw ( struct interface *intf, const void *data, size_t len ) { return xfer_deliver_raw_meta ( intf, data, len, &dummy_metadata ); }