?? dhcpoption.java
字號:
} catch (IOException e) {
logger.log(Level.SEVERE, "Unexpected IOException", e);
return buf.toByteArray();
}
}
/**
* Converts DHO_DHCP_AGENT_OPTIONS (82) option type to a LinkedMap.
*
* <p>Order of parameters is preserved (use avc <tt>LinkedHashmap</tt<).
* Keys are of type <tt>Byte</tt>, values are of type <tt>String</tt>.
*
* @param buf byte[] buffer returned by </tt>getOptionRaw</tt>
* @return the LinkedHashmap of values, <tt>null</tt> if buf is <tt>null</tt>
*/
public static final Map<Byte, String> agentOptionsToMap(byte[] buf) {
if (buf == null) {
return null;
}
Map<Byte, String> map = new LinkedHashMap<Byte, String>();
int i = 0;
while (i < buf.length) {
if (buf.length - i < 2) {
break; // not enough data left
}
Byte key = buf[i++];
int size = unsignedByte(buf[i++]);
int instock = buf.length - i;
if (size > instock) {
size = instock;
}
map.put(key, DHCPPacket.bytesToString(buf, i, size));
i += size;
}
return map;
}
/**
* Returns the type of the option based on the option code.
*
* <p>The type is returned as a <tt>Class</tt> object:
* <ul>
* <li><tt>InetAddress.class</tt></li>
* <li><tt>InetAddress[].class</tt></li>
* <li><tt>int.class</tt></li>
* <li><tt>short.class</tt></li>
* <li><tt>short[].class</tt></li>
* <li><tt>byte.class</tt></li>
* <li><tt>byte[].class</tt></li>
* <li><tt>String.class</tt></li>
* </ul>
*
* <p>Please use <tt>getSimpleName()</tt> methode of <tt>Class</tt> object for the String representation.
* @param code the DHCP option code
* @return the Class object representing accepted types
*/
public static Class getOptionFormat(byte code) {
OptionFormat format = _DHO_FORMATS.get(code);
if (format == null) {
return null;
}
switch (format) {
case INET:
return InetAddress.class;
case INETS:
return InetAddress[].class;
case INT:
return int.class;
case SHORT:
return short.class;
case SHORTS:
return short[].class;
case BYTE:
return byte.class;
case BYTES:
return byte[].class;
case STRING:
return String.class;
default:
return null;
}
}
/**
* Simple method for converting from string to supported class format.
*
* <p>Support values are:
* <ul>
* <li>InetAddress, inet</li>
* <li>InetAddress[], inets</li>
* <li>int</li>
* <li>short</li>
* <li>short[], shorts</li>
* <li>byte</li>
* <li>byte[], bytes</li>
* <li>String, string</li>
* </ul>
* @param className name of the data format (see above)
* @return <tt>Class</tt> or <tt>null</tt> if not supported
*/
public static Class string2Class(String className) {
if ("InetAddress".equals(className)) return InetAddress.class;
if ("inet".equals(className)) return InetAddress.class;
if ("InetAddress[]".equals(className)) return InetAddress[].class;
if ("inets".equals(className)) return InetAddress[].class;
if ("int".equals(className)) return int.class;
if ("short".equals(className)) return short.class;
if ("short[]".equals(className)) return short[].class;
if ("shorts".equals(className)) return short[].class;
if ("byte".equals(className)) return byte.class;
if ("byte[]".equals(className)) return byte[].class;
if ("bytes".equals(className)) return byte[].class;
if ("String".equals(className)) return String.class;
if ("string".equals(className)) return String.class;
return null;
}
/**
* Parse an option from a pure string representation.
*
* <P>The expected class is passed as a parameter, and can be provided by the
* <tt>string2Class()</tt> method from a string representation of the class.
*
* <P>TODO examples
*
* @param code DHCP option code
* @param format expected Java Class after conversion
* @param value string representation of the value
* @return the DHCPOption object
*/
public static DHCPOption parseNewOption(byte code, Class format, String value) {
if ((format == null) || (value == null)) {
throw new NullPointerException();
}
if (short.class.equals(format)) { // short
return newOptionAsShort(code, (short)Integer.parseInt(value));
} else if (short[].class.equals(format)) { // short[]
String[] listVal = value.split(" ");
short[] listShort = new short[listVal.length];
for (int i=0; i<listVal.length; i++) {
listShort[i] = (short) Integer.parseInt(listVal[i]);
}
return newOptionAsShorts(code, listShort);
} else if (int.class.equals(format)) { // int
return newOptionAsInt(code, Integer.parseInt(value));
} else if (String.class.equals(format)) { // String
return newOptionAsString(code, value);
} else if (byte.class.equals(format)) { // byte
return newOptionAsByte(code, (byte) Integer.parseInt(value));
// TODO be explicit about BYTE allowed from -128 to 255 (unsigned int support)
} else if (byte[].class.equals(format)) { // byte[]
value = value.replace(".", " ");
String[] listVal = value.split(" ");
byte[] listBytes = new byte[listVal.length];
for (int i=0; i<listVal.length; i++) {
listBytes[i] = (byte) Integer.parseInt(listVal[i]);
}
return new DHCPOption(code, listBytes);
} else if (InetAddress.class.equals(format)) { // InetAddress
try {
return newOptionAsInetAddress(code, InetAddress.getByName(value));
} catch (UnknownHostException e) {
logger.log(Level.SEVERE, "Invalid address:"+value, e);
return null;
}
} else if (InetAddress[].class.equals(format)) { // InetAddress[]
String[] listVal = value.split(" ");
InetAddress[] listInet = new InetAddress[listVal.length];
try {
for (int i=0; i<listVal.length; i++) {
listInet[i] = InetAddress.getByName(listVal[i]);
}
} catch (UnknownHostException e) {
logger.log(Level.SEVERE, "Invalid address", e);
return null;
}
return newOptionAsInetAddresses(code, listInet);
}
return null;
}
// ----------------------------------------------------------------------
// Internal constants for high-level option type conversions.
//
// formats of options
//
enum OptionFormat {
INET, // 4 bytes IP, size = 4
INETS, // list of 4 bytes IP, size = 4*n
INT, // 4 bytes integer, size = 4
SHORT, // 2 bytes short, size = 2
SHORTS, // list of 2 bytes shorts, size = 2*n
BYTE, // 1 byte, size = 1
BYTES, // list of bytes, size = n
STRING, // string, size = n
//RELAYS = 9; // DHCP sub-options (rfc 3046)
//ID = 10; // client identifier : byte (htype) + string (chaddr)
}
//
// list of formats by options
//
private static final Object[] _OPTION_FORMATS = {
DHO_SUBNET_MASK, OptionFormat.INET,
DHO_TIME_OFFSET, OptionFormat.INT,
DHO_ROUTERS, OptionFormat.INETS,
DHO_TIME_SERVERS, OptionFormat.INETS,
DHO_NAME_SERVERS, OptionFormat.INETS,
DHO_DOMAIN_NAME_SERVERS, OptionFormat.INETS,
DHO_LOG_SERVERS, OptionFormat.INETS,
DHO_COOKIE_SERVERS, OptionFormat.INETS,
DHO_LPR_SERVERS, OptionFormat.INETS,
DHO_IMPRESS_SERVERS, OptionFormat.INETS,
DHO_RESOURCE_LOCATION_SERVERS, OptionFormat.INETS,
DHO_HOST_NAME, OptionFormat.STRING,
DHO_BOOT_SIZE, OptionFormat.SHORT,
DHO_MERIT_DUMP, OptionFormat.STRING,
DHO_DOMAIN_NAME, OptionFormat.STRING,
DHO_SWAP_SERVER, OptionFormat.INET,
DHO_ROOT_PATH, OptionFormat.STRING,
DHO_EXTENSIONS_PATH, OptionFormat.STRING,
DHO_IP_FORWARDING, OptionFormat.BYTE,
DHO_NON_LOCAL_SOURCE_ROUTING, OptionFormat.BYTE,
DHO_POLICY_FILTER, OptionFormat.INETS,
DHO_MAX_DGRAM_REASSEMBLY, OptionFormat.SHORT,
DHO_DEFAULT_IP_TTL, OptionFormat.BYTE,
DHO_PATH_MTU_AGING_TIMEOUT, OptionFormat.INT,
DHO_PATH_MTU_PLATEAU_TABLE, OptionFormat.SHORTS,
DHO_INTERFACE_MTU, OptionFormat.SHORT,
DHO_ALL_SUBNETS_LOCAL, OptionFormat.BYTE,
DHO_BROADCAST_ADDRESS, OptionFormat.INET,
DHO_PERFORM_MASK_DISCOVERY, OptionFormat.BYTE,
DHO_MASK_SUPPLIER, OptionFormat.BYTE,
DHO_ROUTER_DISCOVERY, OptionFormat.BYTE,
DHO_ROUTER_SOLICITATION_ADDRESS, OptionFormat.INET,
DHO_STATIC_ROUTES, OptionFormat.INETS,
DHO_TRAILER_ENCAPSULATION, OptionFormat.BYTE,
DHO_ARP_CACHE_TIMEOUT, OptionFormat.INT,
DHO_IEEE802_3_ENCAPSULATION, OptionFormat.BYTE,
DHO_DEFAULT_TCP_TTL, OptionFormat.BYTE,
DHO_TCP_KEEPALIVE_INTERVAL, OptionFormat.INT,
DHO_TCP_KEEPALIVE_GARBAGE, OptionFormat.BYTE,
DHO_NIS_SERVERS, OptionFormat.INETS,
DHO_NTP_SERVERS, OptionFormat.INETS,
DHO_NETBIOS_NAME_SERVERS, OptionFormat.INETS,
DHO_NETBIOS_DD_SERVER, OptionFormat.INETS,
DHO_NETBIOS_NODE_TYPE, OptionFormat.BYTE,
DHO_NETBIOS_SCOPE, OptionFormat.STRING,
DHO_FONT_SERVERS, OptionFormat.INETS,
DHO_X_DISPLAY_MANAGER, OptionFormat.INETS,
DHO_DHCP_REQUESTED_ADDRESS, OptionFormat.INET,
DHO_DHCP_LEASE_TIME, OptionFormat.INT,
DHO_DHCP_OPTION_OVERLOAD, OptionFormat.BYTE,
DHO_DHCP_MESSAGE_TYPE, OptionFormat.BYTE,
DHO_DHCP_SERVER_IDENTIFIER, OptionFormat.INET,
DHO_DHCP_PARAMETER_REQUEST_LIST, OptionFormat.BYTES,
DHO_DHCP_MESSAGE, OptionFormat.STRING,
DHO_DHCP_MAX_MESSAGE_SIZE, OptionFormat.SHORT,
DHO_DHCP_RENEWAL_TIME, OptionFormat.INT,
DHO_DHCP_REBINDING_TIME, OptionFormat.INT,
DHO_VENDOR_CLASS_IDENTIFIER, OptionFormat.STRING,
DHO_NWIP_DOMAIN_NAME, OptionFormat.STRING,
DHO_NISPLUS_DOMAIN, OptionFormat.STRING,
DHO_NISPLUS_SERVER, OptionFormat.STRING,
DHO_TFTP_SERVER, OptionFormat.STRING,
DHO_BOOTFILE, OptionFormat.STRING,
DHO_MOBILE_IP_HOME_AGENT, OptionFormat.INETS,
DHO_SMTP_SERVER, OptionFormat.INETS,
DHO_POP3_SERVER, OptionFormat.INETS,
DHO_NNTP_SERVER, OptionFormat.INETS,
DHO_WWW_SERVER, OptionFormat.INETS,
DHO_FINGER_SERVER, OptionFormat.INETS,
DHO_IRC_SERVER, OptionFormat.INETS,
DHO_STREETTALK_SERVER, OptionFormat.INETS,
DHO_STDA_SERVER, OptionFormat.INETS,
DHO_NDS_SERVERS, OptionFormat.INETS,
DHO_NDS_TREE_NAME, OptionFormat.STRING,
DHO_NDS_CONTEXT, OptionFormat.STRING,
DHO_CLIENT_LAST_TRANSACTION_TIME, OptionFormat.INT,
DHO_ASSOCIATED_IP, OptionFormat.INETS,
DHO_USER_AUTHENTICATION_PROTOCOL, OptionFormat.STRING,
DHO_AUTO_CONFIGURE, OptionFormat.BYTE,
DHO_NAME_SERVICE_SEARCH, OptionFormat.SHORTS,
DHO_SUBNET_SELECTION, OptionFormat.INET,
DHO_DOMAIN_SEARCH, OptionFormat.STRING,
};
static final Map<Byte, OptionFormat> _DHO_FORMATS = new LinkedHashMap<Byte, OptionFormat>();
/*
* preload at startup Maps with constants
* allowing reverse lookup
*/
static {
// construct map of formats
for (int i=0; i<_OPTION_FORMATS.length / 2; i++) {
_DHO_FORMATS.put((Byte) _OPTION_FORMATS[i*2],(OptionFormat) _OPTION_FORMATS[i*2+1]);
}
}
// ========================================================================
// main: print DHCP options for Javadoc
public static void main(String[] args) {
String all = "";
String inet1 = "";
String inets = "";
String int1 = "";
String short1 = "";
String shorts = "";
String byte1 = "";
String bytes = "";
String string1 = "";
for (Byte codeByte : _DHO_NAMES.keySet()) {
byte code = codeByte.byteValue();
String s = "";
if (code != DHO_PAD && code != DHO_END) {
s = " * " + _DHO_NAMES.get(codeByte) + '(' + (code & 0xFF) + ")\n";
}
all += s;
if (_DHO_FORMATS.containsKey(codeByte)) {
switch (_DHO_FORMATS.get(codeByte)) {
case INET: inet1 += s; break;
case INETS: inets += s; break;
case INT: int1 += s; break;
case SHORT: short1 += s; break;
case SHORTS: shorts += s; break;
case BYTE: byte1 += s; break;
case BYTES: bytes += s; break;
case STRING: string1 += s; break;
default:
}
}
}
System.out.println("---All codes---");
System.out.println(all);
System.out.println("---INET---");
System.out.println(inet1);
System.out.println("---INETS---");
System.out.println(inets);
System.out.println("---INT---");
System.out.println(int1);
System.out.println("---SHORT---");
System.out.println(short1);
System.out.println("---SHORTS---");
System.out.println(shorts);
System.out.println("---BYTE---");
System.out.println(byte1);
System.out.println("---BYTES---");
System.out.println(bytes);
System.out.println("---STRING---");
System.out.println(string1);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -