Floodlight源码阅读之TreeMap存储ACL(一)
来源:互联网 发布:网络拓扑发现算法 编辑:程序博客网 时间:2024/04/27 21:53
<span style="font-family: 'Microsoft YaHei', Verdana, sans-serif, SimSun; font-size: 13.3333px; line-height: 21.3333px; background-color: rgb(255, 255, 255);">Floodlight 控制器是一个企业级的,使用apache协议的,使用Java开发的OpenFlow控制器</span>
Floodlight的所有ACL的规则都存储在TreeMap中,提供存储和删除接口。ok,下面直接看代码
提供一个保存的方法
@Postpublic String store(String json) {IACLService aclService = (IACLService) getContext().getAttributes().get(IACLService.class.getCanonicalName());ACLRule newRule;try {newRule = jsonToRule(json);} catch (Exception e) {log.error("Error parsing ACL rule: " + json, e);return "{\"status\" : \"Failed! " + e.getMessage() + "\"}";}String status = null;String nw_src = newRule.getNw_src();String nw_dst = newRule.getNw_dst();if (nw_src == null && nw_dst == null){status = "Failed! Either nw_src or nw_dst must be specified.";return ("{\"status\" : \"" + status + "\"}");}if(aclService.addRule(newRule)){status = "Success! New rule added.";}else{status = "Failed! The new ACL rule matches an existing rule.";}return ("{\"status\" : \"" + status + "\"}");}
使用restlet框架,接收Post请求。jsonToRule将json字符串转化为对象,直接看保存方法addRule,在这个方法里面首先对下标加+1,如果判断对象存在就减-1返回false。
通过put方法加入加入到aclRules中。这是aclRules的定义:Map<Integer, ACLRule> aclRules;
@Overridepublic boolean addRule(ACLRule rule) {rule.setId(lastRuleId++);if (checkRuleMatch(rule)) {lastRuleId--;return false;}aclRules.put(rule.getId(), rule);logger.info("ACL rule(id:{}) is added.", rule.getId());if (rule.getAction() != Action.ALLOW) {enforceAddedRule(rule);}return true;}
它同样提供一个删除的方法,首先是while循环遍历元素是否存在,如果存在则删除。
@Deletepublic String remove(String json) {IACLService ACL = (IACLService) getContext().getAttributes().get(IACLService.class.getCanonicalName());ACLRule rule;try {rule = jsonToRule(json);} catch (Exception e) {log.error("Error parsing ACL rule: " + json, e);return "{\"status\" : \"Failed! " + e.getMessage() + "\"}";}// check whether the rule existsboolean exists = false;Iterator<ACLRule> iter = ACL.getRules().iterator();while (iter.hasNext()) {ACLRule r = iter.next();if (r.getId() == rule.getId()) {exists = true;break;}}String status = null;if (!exists) {status = "Failed! a rule with this ID doesn't exist.";log.error(status);} else {ACL.removeRule(rule.getId());status = "Success! Rule deleted";}return ("{\"status\" : \"" + status + "\"}");}
删除的方法如下
@Overridepublic void removeRule(int ruleId) {aclRules.remove(ruleId);logger.info("ACL rule(id:{}) is removed.", ruleId);enforceRemovedRule(ruleId);}至于enforceRemovedRule这个函数的作用,就是在流表中删除该ACL。
1 0
- Floodlight源码阅读之TreeMap存储ACL(一)
- Floodlight源码阅读之链路发现
- Floodlight源码阅读之网络拓扑
- Java源码阅读之TreeMap
- TreeMap源码阅读总结
- Java源码阅读-TreeMap
- 【JDK1.8】JDK1.8集合源码阅读——TreeMap(一)
- Floodlight源码阅读之内存数据库
- Floodlight源码阅读之内存数据库(二)
- OkHttp源码阅读之旅(一)
- JDK8源码阅读之File(一)
- 源码阅读(一)
- 源码阅读(一)
- bluedroid源码分析之ACL包发送和接收(一)
- floodlight之forwarding模块源码解析
- OpenJDK 源代码阅读之 TreeMap
- JAVA 8 treemap 源码阅读笔记
- Spark源码阅读笔记之任务调度(一)
- QQ通讯机制讨论
- ccah-500 第13题Which three basic configuration parameters must you set to migrate
- 解决ubuntu ufw开启时,kvm虚拟机网络全部无法访问
- LeetCode128—Longest Consecutive Sequence
- 关于用python 的imaplib提取自己163,qq邮箱的内容
- Floodlight源码阅读之TreeMap存储ACL(一)
- mysql悲观锁总结和实践
- Mina基础框架及客户端-服务端框架对应实现例子
- js中数组,其他都是对象
- 判别对象类型
- JVM的内存区域划分
- Request获取url各种信息的方法
- mysql乐观锁总结和实践
- Android梳理 屏幕适配