Esempio n. 1
0
/**
 * 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;
			}
		}
	}
Esempio n. 2
0
/**
 * 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;
}
Esempio n. 3
0
File: xfer.c Progetto: baloo/ipxe
/**
 * 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 );
}