OpenVSwitch 端口掩码计算工具

1 篇文章 0 订阅
[size=small] [url=http://openvswitch.org/releases/openvswitch-1.6.1.tar.gz]OpenVSwitch 1.6[/url] 开源版本放出来了,这个版本在进行 OF 流设置的时候,有一个很有趣的功能,就是可以指定端口掩码。
早在 OpenVSwitch 1.4 版本的时候就注意到这个功能,可惜 [url=http://openvswitch.org/cgi-bin/ovsman.cgi?page=utilities%2Fovs-ofctl.8]ovs-ofctl 使用手册[/url]中说这个功能只有 1.6 及以上版本才能使用。好不容易 1.6 版本放出来了,但 OpenVSwitch 却没有提供计算端口掩码的工具,坑爹啊~~~
没办法,勤劳是咱的优良传统,咱就“自己动手,丰衣足食”吧。写了个 Java 的小工具,可以计算端口掩码,发出来共享给大家。欢迎批评指正~~~
用法很简单,直接调用静态方法 OvsUtil.getPortMask(minPortNum, maxPortNum) 就 OK 了。
[/size]

import java.util.ArrayList;
import java.util.List;

/**
* @author E2718282
* @version 0.1-beta
* @date 2012-3-24
*
* OVS工具类
*/
public class OvsUtil {

/**
* 端口位掩码数组
*
* 对于portBitMasks[i],按位与portBitMasks[i][0]可获取低i位的值,<br>
* 按位与portBitMasks[i][1]可获取高(16-i)位的值
*/
private static final int[][] portBitMasks = new int[][] { { 0, 0xffff },
{ 0x1, 0xfffe }, { 0x3, 0xfffc }, { 0x7, 0xfff8 }, { 0xf, 0xfff0 },
{ 0x1f, 0xffe0 }, { 0x3f, 0xffc0 }, { 0x7f, 0xff80 },
{ 0xff, 0xff00 }, { 0x1ff, 0xfe00 }, { 0x3ff, 0xfc00 },
{ 0x7ff, 0xf800 }, { 0xfff, 0xf000 }, { 0x1fff, 0xe000 },
{ 0x3fff, 0xc000 }, { 0x7fff, 0x8000 }, { 0xffff, 0 } };

/**
* 根据端口范围获取端口范围的掩码表示序列
*
* 由于端口号在1-65535之间,所以用int型表示足够了
*
* @param min
* 最小端口号
* @param max
* 最大端口号
*
* @return 表示最小端口号到最大端口号范围的掩码序列
*/
public static String[] getPortMask(int min, int max) {
if (min < 1 || max > 0xffff || min > max) {
System.out.println("错误的端口号或端口号范围!");
return new String[0];
}

List<String> masks = new ArrayList<String>();

for (int n = min; n <= max;) {
int i = 1;
for (; i <= 16; ++i) {
int x = n + portBitMasks[i][0];
if (x > max || (x & portBitMasks[i][1]) != (n & portBitMasks[i][1])) {
break;
}
}

// 因为i已经+1了,所以这里的--i就是掩码的长度
masks.add(toPortMask(n, --i));
// 下一个掩码前缀开始的地方
n += (portBitMasks[i][0] + 1);
}

return masks.toArray(new String[0]);
}

/**
* 根据开始端口号和掩码长度生成端口掩码
*
* @param port
* 端口号
* @param maskLen
* 掩码长度
*
* @return port/mask格式的端口掩码,如果掩码长度为0,则只返回端口号
*/
private static String toPortMask(int port, int maskLen) {
if (0 == maskLen) {
return "0x" + Integer.toHexString(port);
}

return "0x" + Integer.toHexString(port & portBitMasks[maskLen][1]) + "/0x"
+ Integer.toHexString(portBitMasks[maskLen][1]);
}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值