/** * Send redirection event * * @v intf Data transfer interface * @v type New location type * @v args Remaining arguments depend upon location type * @ret rc Return status code */ int xfer_vredirect ( struct interface *intf, int type, va_list args ) { struct interface tmp = INTF_INIT ( null_intf_desc ); struct interface *dest; xfer_vredirect_TYPE ( void * ) *op = intf_get_dest_op_no_passthru ( intf, xfer_vredirect, &dest ); void *object = intf_object ( dest ); int rc; DBGC ( INTF_COL ( intf ), "INTF " INTF_INTF_FMT " redirect\n", INTF_INTF_DBG ( intf, dest ) ); if ( op ) { rc = op ( object, type, args ); } else { /* Default is to reopen the interface as instructed, * then send xfer_window_changed() messages to both * new child and parent interfaces. Since our * original child interface is likely to be closed and * unplugged as a result of the call to * xfer_vreopen(), we create a temporary interface in * order to be able to send xfer_window_changed() to * the parent. */ intf_plug ( &tmp, dest ); rc = xfer_vreopen ( dest, type, args ); if ( rc == 0 ) { xfer_window_changed ( dest ); xfer_window_changed ( &tmp ); } intf_unplug ( &tmp ); } if ( rc != 0 ) { DBGC ( INTF_COL ( intf ), "INTF " INTF_INTF_FMT " redirect " "failed: %s\n", INTF_INTF_DBG ( intf, dest ), strerror ( rc ) ); } intf_put ( dest ); return rc; }
/** The syslog server */ static struct sockaddr_tcpip logserver = { .st_family = AF_INET, .st_port = htons ( SYSLOG_PORT ), }; /** Syslog UDP interface operations */ static struct interface_operation syslogger_operations[] = {}; /** Syslog UDP interface descriptor */ static struct interface_descriptor syslogger_desc = INTF_DESC_PURE ( syslogger_operations ); /** The syslog UDP interface */ static struct interface syslogger = INTF_INIT ( syslogger_desc ); /****************************************************************************** * * Console driver * ****************************************************************************** */ /** Syslog line buffer */ static char syslog_buffer[SYSLOG_BUFSIZE]; /** Syslog line console */ static struct line_console syslog_line = { .buffer = syslog_buffer, .len = sizeof ( syslog_buffer ),
free_iob ( iobuf ); return rc; } /** PXE UDP data transfer interface operations */ static struct interface_operation pxe_udp_xfer_operations[] = { INTF_OP ( xfer_deliver, struct pxe_udp_connection *, pxe_udp_deliver ), }; /** PXE UDP data transfer interface descriptor */ static struct interface_descriptor pxe_udp_xfer_desc = INTF_DESC ( struct pxe_udp_connection, xfer, pxe_udp_xfer_operations ); /** The PXE UDP connection */ static struct pxe_udp_connection pxe_udp = { .xfer = INTF_INIT ( pxe_udp_xfer_desc ), .local = { .sin_family = AF_INET, }, }; /** * UDP OPEN * * @v pxenv_udp_open Pointer to a struct s_PXENV_UDP_OPEN * @v s_PXENV_UDP_OPEN::src_ip IP address of this station, or 0.0.0.0 * @ret #PXENV_EXIT_SUCCESS Always * @ret s_PXENV_UDP_OPEN::Status PXE status code * @err #PXENV_STATUS_UDP_OPEN UDP connection already open * @err #PXENV_STATUS_OUT_OF_RESOURCES Could not open connection *
/***************************************************************************** * * The null interface * */ /** Null interface operations */ static struct interface_operation null_intf_op[] = {}; /** Null interface descriptor */ struct interface_descriptor null_intf_desc = INTF_DESC_PURE ( null_intf_op ); /** The null interface */ struct interface null_intf = INTF_INIT ( null_intf_desc ); /***************************************************************************** * * Object interface plumbing * */ /** * Plug an object interface into a new destination object interface * * @v intf Object interface * @v dest New destination object interface * * The reference to the existing destination interface is dropped, a * reference to the new destination interface is obtained, and the