_3c90xtxbuffer.java
来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 90 行
JAVA
90 行
/*
* $Id: _3c90xTxBuffer.java,v 1.1 2003/11/25 11:52:22 epr Exp $
*/
package org.jnode.driver.net._3c90x;
import org.jnode.net.SocketBuffer;
import org.jnode.net.ethernet.EthernetConstants;
import org.jnode.system.MemoryResource;
import org.jnode.system.ResourceManager;
import org.jnode.vm.Address;
/**
* @author epr
*/
public class _3c90xTxBuffer implements _3c90xConstants {
private static final int DPD_SIZE = 16;
private static final int FRAME_SIZE = EthernetConstants.ETH_FRAME_LEN;
/** The actual data */
private final byte[] data;
/** MemoryResource mapper around data */
private final MemoryResource mem;
/** Offset within mem of first DPD */
private final int firstDPDOffset;
/** Offset within mem of first ethernet frame */
private final int firstFrameOffset;
/** 32-bit address first DPD */
private final Address firstDPDAddress;
/** 32-bit address of first ethernet frame */
private final Address firstFrameAddress;
/**
* Create a new instance
* @param rm
*/
public _3c90xTxBuffer(ResourceManager rm) {
// Create a large enough buffer
final int size = (DPD_SIZE + FRAME_SIZE) + 16 /*alignment*/;
this.data = new byte[size];
this.mem = rm.asMemoryResource(data);
final Address memAddr = mem.getAddress();
int addr = Address.as32bit(memAddr);
int offset = 0;
// Align on 16-byte boundary
while ((addr & 15) != 0) {
addr++;
offset++;
}
this.firstDPDOffset = offset;
this.firstDPDAddress = Address.add(memAddr, firstDPDOffset);
this.firstFrameOffset = firstDPDOffset + DPD_SIZE;
this.firstFrameAddress = Address.add(memAddr, firstFrameOffset);
}
/**
* Initialize this ring to its default (empty) state
*/
public void initialize(SocketBuffer src)
throws IllegalArgumentException {
// Setup the DPD
final int dpdOffset = firstDPDOffset;
// Copy the data from the buffer
final int len = src.getSize();
if (len > FRAME_SIZE) {
throw new IllegalArgumentException("Length must be <= ETH_FRAME_LEN");
}
src.get(data, firstFrameOffset, 0, len);
// Set next DPD ptr
mem.setInt(dpdOffset + 0, 0);
// Set frame start header
mem.setInt(dpdOffset + 4, 0x8000); // txIndicate
// Set fragment address
mem.setInt(dpdOffset + 8, Address.as32bit(firstFrameAddress));
// Set fragment size
mem.setInt(dpdOffset + 12, len | (1 << 31));
}
/**
* Gets the address of the first DPD in this buffer.
*/
public Address getFirstDPDAddress() {
return firstDPDAddress;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?