⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 abstractnetdriver.java

📁 纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统
💻 JAVA
字号:
/*
 * $Id: AbstractNetDriver.java,v 1.1 2003/11/25 11:52:25 epr Exp $
 */
package org.jnode.driver.net;

import java.util.HashMap;

import javax.naming.NameNotFoundException;

import org.apache.log4j.Logger;
import org.jnode.driver.Device;
import org.jnode.driver.DeviceAlreadyRegisteredException;
import org.jnode.driver.DeviceManager;
import org.jnode.driver.Driver;
import org.jnode.driver.DriverException;
import org.jnode.naming.InitialNaming;
import org.jnode.net.HardwareAddress;
import org.jnode.net.LayerHeader;
import org.jnode.net.ProtocolAddressInfo;
import org.jnode.net.SocketBuffer;
import org.jnode.net.util.NetUtils;
import org.jnode.util.Queue;
import org.jnode.util.QueueProcessor;
import org.jnode.util.QueueProcessorThread;

/**
 * @author epr
 */
public abstract class AbstractNetDriver extends Driver implements NetDeviceAPI, QueueProcessor {

	/** My logger */
	private final Logger log = Logger.getLogger(getClass());
	/** Device prefix for ethernet devices */
	public static final String ETH_DEVICE_PREFIX = "eth";
	/** Device prefix for loopback devices */
	public static final String LOOPBACK_DEVICE_PREFIX = "lo";

	/** Number of received bytes */
	private long rx_count;
	/** Number of transmitted bytes */
	private long tx_count;
	/** Mapping between protocol id and protocol address */
	private final HashMap protocolAddresses = new HashMap();
	/** Queue used to store frames ready for transmission */
	private final Queue txQueue = new Queue();
	/** Thread used to transmit frames */
	private QueueProcessorThread txThread;
		
	/**
	 * @see org.jnode.driver.Driver#startDevice()
	 */
	protected void startDevice() throws DriverException {
		final Device device = getDevice();
		try {
			final DeviceManager dm = (DeviceManager)InitialNaming.lookup(DeviceManager.NAME);
			dm.rename(device, getDevicePrefix(), true);
		} catch (DeviceAlreadyRegisteredException ex) {
			log.error("Cannot rename device", ex);
		} catch (NameNotFoundException ex) {
			throw new DriverException("Cannot find DeviceManager", ex);
		}
		device.registerAPI(NetDeviceAPI.class, this);
		txThread = new QueueProcessorThread(device.getId() + "-tx", txQueue, this);
		txThread.start();
	}

	/**
	 * @see org.jnode.driver.Driver#stopDevice()
	 */
	protected void stopDevice() throws DriverException {
		txThread.stopProcessor();
		txThread = null;
		getDevice().unregisterAPI(NetDeviceAPI.class);
	}

	/**
	 * @see org.jnode.driver.net.NetDeviceAPI#transmit(SocketBuffer, HardwareAddress)
	 */
	public final void transmit(SocketBuffer skbuf, HardwareAddress destination) 
	throws NetworkException {
		// Update all layer headers
		int offset = 0;
		offset = updateLayerHeader(skbuf, skbuf.getLinkLayerHeader(), offset);
		offset = updateLayerHeader(skbuf, skbuf.getNetworkLayerHeader(), offset);
		offset = updateLayerHeader(skbuf, skbuf.getTransportLayerHeader(), offset);
		
		//log.debug("Adding to transmit queue");
		txQueue.add(new Object[] { skbuf, destination });
	}
	
	private final int updateLayerHeader(SocketBuffer skbuf, LayerHeader hdr, int offset) {
		if (hdr != null) {
			hdr.finalizeHeader(skbuf, offset);
			return offset + hdr.getLength();
		} else {
			return offset;
		}
	}

	/**
	 * @see org.jnode.util.QueueProcessor#process(java.lang.Object)
	 */
	public void process(Object object) {
		try {
			//log.debug("<transmit dev=" + getDevice().getId() + ">");
			final Object[] data = (Object[])object;
			final SocketBuffer skbuf = (SocketBuffer)data[0];
			final HardwareAddress destination = (HardwareAddress)data[1];
			tx_count += skbuf.getSize(); 
			doTransmit(skbuf, destination);
			//log.debug("</transmit dev=" + getDevice().getId() + ">");
		} catch (NetworkException ex) {
			log.error("Cannot transmit packet", ex);
		}
	}
	
	/**
	 * @see org.jnode.driver.net.NetDeviceAPI#transmit(SocketBuffer, HardwareAddress)
	 */
	protected abstract void doTransmit(SocketBuffer skbuf, HardwareAddress destination) 
	throws NetworkException;
	
	/**
	 * Gets the prefix for the device name
	 * @see #ETH_DEVICE_PREFIX
	 */
	protected abstract String getDevicePrefix();
	
	/**
	 * Pass a received frame onto the PacketTypeManager.
	 * @param skbuf
	 */
	protected void onReceive(SocketBuffer skbuf)
	throws NetworkException {
		skbuf.setDevice(getDevice());
		rx_count += skbuf.getSize();
		NetUtils.sendToPTM(skbuf);
	}

	/**
	 * Gets the protocol address information for a given protocol.
	 * @param protocolID
	 * @return The protocol address information, or null if not found.
	 */
	public ProtocolAddressInfo getProtocolAddressInfo(int protocolID) {
		return (ProtocolAddressInfo)protocolAddresses.get(new Integer(protocolID));
	}

	/**
	 * Sets the protocol address information for a given protocol.
	 * @param protocolID
	 */
	public void setProtocolAddressInfo(int protocolID, ProtocolAddressInfo addressInfo) {
		protocolAddresses.put(new Integer(protocolID), addressInfo);
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -