Skip to content
Snippets Groups Projects
Commit 7e869bbc authored by sanjivininaikar's avatar sanjivininaikar
Browse files

Update StaticFlowEntryPusherResource.java

Suggested changes made
parent bb497f4f
No related branches found
No related tags found
No related merge requests found
...@@ -31,6 +31,7 @@ import net.floodlightcontroller.core.annotations.LogMessageDoc; ...@@ -31,6 +31,7 @@ import net.floodlightcontroller.core.annotations.LogMessageDoc;
import net.floodlightcontroller.staticflowentry.StaticFlowEntries; import net.floodlightcontroller.staticflowentry.StaticFlowEntries;
import net.floodlightcontroller.staticflowentry.StaticFlowEntryPusher; import net.floodlightcontroller.staticflowentry.StaticFlowEntryPusher;
import net.floodlightcontroller.storage.IStorageSourceService; import net.floodlightcontroller.storage.IStorageSourceService;
import net.floodlightcontroller.util.MatchUtils;
/** /**
* Pushes a static flow entry to the storage source * Pushes a static flow entry to the storage source
...@@ -41,130 +42,128 @@ import net.floodlightcontroller.storage.IStorageSourceService; ...@@ -41,130 +42,128 @@ import net.floodlightcontroller.storage.IStorageSourceService;
public class StaticFlowEntryPusherResource extends ServerResource { public class StaticFlowEntryPusherResource extends ServerResource {
protected static Logger log = LoggerFactory.getLogger(StaticFlowEntryPusherResource.class); protected static Logger log = LoggerFactory.getLogger(StaticFlowEntryPusherResource.class);
/**
* Validates if all the mandatory fields are set properly while adding an IPv6 flow /**
* @param Map containing the fields of the flow * Validates if all the mandatory fields are set properly while adding an IPv6 flow
* @return state indicating whether a flow is valid or not * @param Map containing the fields of the flow
*/ * @return state indicating whether a flow is valid or not
private int checkMatch(Map<String, Object> rows) { */
private int checkFlow(Map<String, Object> rows) {
//sanjivini //Declaring & Initializing flags
//Declaring & Initializing flags int state = 0;
int state = 0; boolean dl_type = false;
boolean dl_type = false; boolean nw_proto = false;
boolean nw_proto = false; boolean nw_layer = false;
boolean nw_layer = false; boolean icmp6_type = false;
boolean icmp6_type = false; boolean icmp6_code = false;
boolean icmp6_code = false; boolean nd_target = false;
boolean nd_target = false; boolean nd_sll = false;
boolean nd_sll = false; boolean nd_tll = false;
boolean nd_tll = false; boolean ip6 = false;
boolean ip6 = false; boolean ip4 = false;
boolean ip4 = false;
String eth_type = null;
String eth_type = null; String nw_protocol = null;
String nw_protocol = null; int icmp_type = -1;
int icmp_type = -1;
//Determine the dl_type if set
//Determine the dl_type if set if (rows.containsKey(StaticFlowEntryPusher.COLUMN_DL_TYPE)) {
if (rows.containsKey(StaticFlowEntryPusher.COLUMN_DL_TYPE)) { dl_type = true;
dl_type = true; eth_type = (String) rows.get(StaticFlowEntryPusher.COLUMN_DL_TYPE);
eth_type = (String) rows.get(StaticFlowEntryPusher.COLUMN_DL_TYPE); if (eth_type.equalsIgnoreCase("0x86dd") || eth_type.equals("34525")) {
if (eth_type.equalsIgnoreCase("0x86dd") || eth_type.equals("34525")) { ip6 = true;
ip6 = true; }
} else if (eth_type.equalsIgnoreCase("0x800") || eth_type.equals("2048")||
else if (eth_type.equalsIgnoreCase("0x800") || eth_type.equals("2048")||
eth_type.equalsIgnoreCase("0x806") || eth_type.equals("2054")) { eth_type.equalsIgnoreCase("0x806") || eth_type.equals("2054")) {
ip4 = true; ip4 = true;
} }
else { //else {
state = 2; // state = 2;
return state; // return state;
} //}
} }
if (rows.containsKey(StaticFlowEntryPusher.COLUMN_NW_DST) || if (rows.containsKey(StaticFlowEntryPusher.COLUMN_NW_DST) ||
rows.containsKey(StaticFlowEntryPusher.COLUMN_NW_SRC)) { rows.containsKey(StaticFlowEntryPusher.COLUMN_NW_SRC)) {
nw_layer = true; nw_layer = true;
ip4 = true; ip4 = true;
} }
if (rows.containsKey(StaticFlowEntryPusher.COLUMN_ICMP_CODE) || if (rows.containsKey(StaticFlowEntryPusher.COLUMN_ICMP_CODE) ||
rows.containsKey(StaticFlowEntryPusher.COLUMN_ICMP_TYPE) || rows.containsKey(StaticFlowEntryPusher.COLUMN_ICMP_TYPE) ||
rows.containsKey(StaticFlowEntryPusher.COLUMN_ARP_DHA) || rows.containsKey(StaticFlowEntryPusher.COLUMN_ARP_DHA) ||
rows.containsKey(StaticFlowEntryPusher.COLUMN_ARP_SHA) || rows.containsKey(StaticFlowEntryPusher.COLUMN_ARP_SHA) ||
rows.containsKey(StaticFlowEntryPusher.COLUMN_ARP_SPA) || rows.containsKey(StaticFlowEntryPusher.COLUMN_ARP_SPA) ||
rows.containsKey(StaticFlowEntryPusher.COLUMN_ARP_DPA) || rows.containsKey(StaticFlowEntryPusher.COLUMN_ARP_DPA) ||
rows.containsKey(StaticFlowEntryPusher.COLUMN_ARP_OPCODE)) { rows.containsKey(StaticFlowEntryPusher.COLUMN_ARP_OPCODE)) {
ip4 = true; ip4 = true;
} }
if (rows.containsKey(StaticFlowEntryPusher.COLUMN_IPV6_FLOW_LABEL) || if (rows.containsKey(StaticFlowEntryPusher.COLUMN_IPV6_FLOW_LABEL) ||
rows.containsKey(StaticFlowEntryPusher.COLUMN_NW6_SRC) || rows.containsKey(StaticFlowEntryPusher.COLUMN_NW6_SRC) ||
rows.containsKey(StaticFlowEntryPusher.COLUMN_NW6_DST) rows.containsKey(StaticFlowEntryPusher.COLUMN_NW6_DST)) {
) { nw_layer = true;
nw_layer = true; ip6 = true;
ip6 = true; }
} if (rows.containsKey(StaticFlowEntryPusher.COLUMN_NW_PROTO)) {
if (rows.containsKey(StaticFlowEntryPusher.COLUMN_NW_PROTO)) { nw_proto = true;
nw_proto = true; nw_protocol = (String) rows.get(StaticFlowEntryPusher.COLUMN_NW_PROTO);
nw_protocol = (String) rows.get(StaticFlowEntryPusher.COLUMN_NW_PROTO); }
} if (rows.containsKey(StaticFlowEntryPusher.COLUMN_ICMP6_CODE)) {
if (rows.containsKey(StaticFlowEntryPusher.COLUMN_ICMP6_CODE)) { icmp6_code = true;
icmp6_code = true; ip6 = true;
ip6 = true; }
} if (rows.containsKey(StaticFlowEntryPusher.COLUMN_ICMP6_TYPE)) {
if (rows.containsKey(StaticFlowEntryPusher.COLUMN_ICMP6_TYPE)) { icmp6_type = true;
icmp6_type = true; ip6 = true;
ip6 = true; icmp_type = Integer.parseInt((String) rows.get(StaticFlowEntryPusher.COLUMN_ICMP6_TYPE));
icmp_type = Integer.parseInt((String) rows.get(StaticFlowEntryPusher.COLUMN_ICMP6_TYPE)); }
} if (rows.containsKey(StaticFlowEntryPusher.COLUMN_ND_SLL)) {
if (rows.containsKey(StaticFlowEntryPusher.COLUMN_ND_SLL)) { nd_sll = true;
nd_sll = true; ip6 = true;
ip6 = true; }
} if (rows.containsKey(StaticFlowEntryPusher.COLUMN_ND_TLL)) {
if (rows.containsKey(StaticFlowEntryPusher.COLUMN_ND_TLL)) { nd_tll = true;
nd_tll = true; ip6 = true;
ip6 = true; }
} if (rows.containsKey(StaticFlowEntryPusher.COLUMN_ND_TARGET)) {
if (rows.containsKey(StaticFlowEntryPusher.COLUMN_ND_TARGET)) { nd_target = true;
nd_target = true; ip6 = true;
ip6 = true; }
}
if (nw_layer == true || nw_proto == true) {
if (nw_layer == true || nw_proto == true) { if (dl_type == true) {
if (dl_type == true) { if (!(ip4 == true || ip6 == true)) {
if (!(ip4 == true || ip6 == true)) { //invalid dl_type
//invalid dl_type state = 2;
state = 2; return state;
return state; }
} }
} else {
else { //dl_type not set
//dl_type not set state = 1;
state = 1; return state;
return state; }
} }
} if (icmp6_type == true || icmp6_code == true ) {
if (icmp6_type == true || icmp6_code == true ) { if (nw_proto == true) {
if (nw_proto == true) { if (!(nw_protocol.equals("58") || nw_protocol.equalsIgnoreCase("0x3A"))) {
if (!(nw_protocol.equals("58") || nw_protocol.equalsIgnoreCase("0x3A"))) { //invalid nw_proto
//invalid nw_proto state = 4;
state = 4; return state;
return state; }
} }
} else {
else { //nw_proto not set
//nw_proto not set state = 3;
state = 3; return state;
return state; }
} }
}
if (nd_sll == true || nd_tll == true || nd_target == true) {
if (nd_sll == true || nd_tll == true || nd_target == true) { if (icmp6_type == true) {
if (icmp6_type == true) { //icmp_type must be set to 135/136 to set ipv6_nd_target
//icmp_type must be set to 135/136 to set ipv6_nd_target
if (nd_target == true) { if (nd_target == true) {
if (!(icmp_type == 135 || icmp_type == 136)) { if (!(icmp_type == 135 || icmp_type == 136)) {
//invalid icmp6_type //invalid icmp6_type
state = 6; state = 6;
return state; return state;
} }
} }
...@@ -172,7 +171,7 @@ public class StaticFlowEntryPusherResource extends ServerResource { ...@@ -172,7 +171,7 @@ public class StaticFlowEntryPusherResource extends ServerResource {
else if (nd_tll == true) { else if (nd_tll == true) {
if (!(icmp_type == 136)) { if (!(icmp_type == 136)) {
//invalid icmp6_type //invalid icmp6_type
state = 6; state = 6;
return state; return state;
} }
} }
...@@ -180,58 +179,87 @@ public class StaticFlowEntryPusherResource extends ServerResource { ...@@ -180,58 +179,87 @@ public class StaticFlowEntryPusherResource extends ServerResource {
else if (nd_sll == true) { else if (nd_sll == true) {
if (!(icmp_type == 135)) { if (!(icmp_type == 135)) {
//invalid icmp6_type //invalid icmp6_type
state = 6; state = 6;
return state; return state;
} }
} }
} }
else { else {
//icmp6_type not set //icmp6_type not set
state = 5; state = 5;
return state; return state;
} }
} }
if ((ip4 == true && ip6 == true) || int result = checkActions(rows);
(StaticFlowEntries.ip4 == true && StaticFlowEntries.ip6 == true) ||
(StaticFlowEntries.ip4 == true && ip6 == true) || if ((ip4 == true && ip6 == true) || (result == -1) ||
(StaticFlowEntries.ip6 == true && ip4 == true)) { (result == 1 && ip6 == true) || (result == 2 && ip4 == true)) {
//ipv4 & ipv6 conflict //ipv4 & ipv6 conflict
state = 7; state = 7;
return state; return state;
} }
return state; return state;
//sanjivini
}
/*
boolean matchEther = false; /**
String val = (String) rows.get(StaticFlowEntryPusher.COLUMN_DL_TYPE); * Validates actions/instructions
if (val != null) { *
int type = 0; * -1 --> IPv4/IPv6 conflict
// check both hex and decimal * 0 --> no IPv4 or IPv6 actions
if (val.startsWith("0x")) { * 1 --> IPv4 only actions
type = Integer.parseInt(val.substring(2), 16); * 2 --> IPv6 only actions
} else { *
try { * @param Map containing the fields of the flow
type = Integer.parseInt(val); * @return state indicating whether a flow is valid or not
} catch (NumberFormatException e) { /* fail silently */ /*} */
} public static int checkActions(Map<String, Object> entry) {
if ((type == 2048)|| (type == 34525)) matchEther = true;
} boolean ip6 = false;
boolean ip4 = false;
if ((rows.containsKey(StaticFlowEntryPusher.COLUMN_NW_DST) || String actions = null;
rows.containsKey(StaticFlowEntryPusher.COLUMN_NW_SRC) ||
rows.containsKey(StaticFlowEntryPusher.COLUMN_NW6_SRC) || if (entry.containsKey(StaticFlowEntryPusher.COLUMN_ACTIONS) ||
rows.containsKey(StaticFlowEntryPusher.COLUMN_NW6_DST) || entry.containsKey(StaticFlowEntryPusher.COLUMN_INSTR_APPLY_ACTIONS) ||
rows.containsKey(StaticFlowEntryPusher.COLUMN_NW_PROTO) || entry.containsKey(StaticFlowEntryPusher.COLUMN_INSTR_WRITE_ACTIONS)) {
rows.containsKey(StaticFlowEntryPusher.COLUMN_NW_TOS)) && if (entry.containsKey(StaticFlowEntryPusher.COLUMN_ACTIONS)) {
(matchEther == false)) actions = (String) entry.get(StaticFlowEntryPusher.COLUMN_ACTIONS);
return false; }
else if (entry.containsKey(StaticFlowEntryPusher.COLUMN_INSTR_APPLY_ACTIONS)) {
actions = (String) entry.get(StaticFlowEntryPusher.COLUMN_INSTR_APPLY_ACTIONS);
}
else if (entry.containsKey(StaticFlowEntryPusher.COLUMN_INSTR_WRITE_ACTIONS)) {
actions = (String) entry.get(StaticFlowEntryPusher.COLUMN_INSTR_WRITE_ACTIONS);
}
if (actions.contains(MatchUtils.STR_ICMPV6_CODE) || actions.contains(MatchUtils.STR_ICMPV6_TYPE) ||
actions.contains(MatchUtils.STR_IPV6_DST) || actions.contains(MatchUtils.STR_IPV6_SRC) ||
actions.contains(MatchUtils.STR_IPV6_FLOW_LABEL) || actions.contains(MatchUtils.STR_IPV6_ND_SSL) ||
actions.contains(MatchUtils.STR_IPV6_ND_TARGET) || actions.contains(MatchUtils.STR_IPV6_ND_TTL)) {
ip6 = true;
}
if (actions.contains(MatchUtils.STR_NW_SRC) || actions.contains(MatchUtils.STR_NW_DST) ||
actions.contains(MatchUtils.STR_ARP_OPCODE) || actions.contains(MatchUtils.STR_ARP_SHA) ||
actions.contains(MatchUtils.STR_ARP_DHA) || actions.contains(MatchUtils.STR_ARP_SPA) ||
actions.contains(MatchUtils.STR_ARP_DPA) || actions.contains(MatchUtils.STR_ICMP_CODE) ||
actions.contains(MatchUtils.STR_ICMP_TYPE)) {
ip4 = true;
}
}
if (ip6 == false && ip4 == false) {
return 0; // no actions involving ipv4 or ipv6
} else if (ip6 == false && ip4 == true) {
return 1; //ipv4
} else if (ip6 == true && ip4 == false) {
return 2; //ipv6
} else {
return -1; // conflict of ipv4 and ipv6 actions
}
}
return true;
*/
}
/** /**
* Takes a Static Flow Pusher string in JSON format and parses it into * Takes a Static Flow Pusher string in JSON format and parses it into
...@@ -253,7 +281,7 @@ public class StaticFlowEntryPusherResource extends ServerResource { ...@@ -253,7 +281,7 @@ public class StaticFlowEntryPusherResource extends ServerResource {
try { try {
rowValues = StaticFlowEntries.jsonToStorageEntry(fmJson); rowValues = StaticFlowEntries.jsonToStorageEntry(fmJson);
String status = null; String status = null;
int state = checkMatch(rowValues); int state = checkFlow(rowValues);
if (state == 1) { if (state == 1) {
status = "Warning! Must specify eth_type of IPv4/IPv6 to " + status = "Warning! Must specify eth_type of IPv4/IPv6 to " +
"match on IPv4/IPv6 fields! The flow has been discarded."; "match on IPv4/IPv6 fields! The flow has been discarded.";
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment