added some temporal archives for checking new web pages
[VSoRC/.git] / js / tap.js
diff --git a/js/tap.js b/js/tap.js
new file mode 100644 (file)
index 0000000..c61c263
--- /dev/null
+++ b/js/tap.js
@@ -0,0 +1,223 @@
+/*
+ * Copyright (C) 2014 SDN Hub
+ *
+ * Licensed under the GNU GENERAL PUBLIC LICENSE, Version 3.
+ * You may not use this file except in compliance with this License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.gnu.org/licenses/gpl-3.0.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied.
+ */
+
+var url = "http://" + location.hostname + ":8080";
+var originalMain;
+
+var portMap = {};
+
+function updateSwitchList() {
+    var switchSelect = document.getElementById("switch");
+    $.getJSON(url.concat("/v1.0/topology/switches"), function(switches){
+        $.each(switches, function(index, value){
+            var el = document.createElement("option");
+            el.textContent = value.dpid;
+            el.value = value.dpid;
+            switchSelect.appendChild(el);
+
+            portMap[value.dpid] = value.ports;
+        });
+    }).then(updatePorts);
+}
+
+function updatePorts() {
+    var srcPortSelect = document.getElementById("src-ports");
+    removeAllChildren(srcPortSelect);
+
+    var allEl = document.createElement("option");
+    allEl.textContent = "all";
+    allEl.value = "all";
+    allEl.setAttribute('selected', 'selected');
+    srcPortSelect.appendChild(allEl);
+
+    var sinkPortSelect = document.getElementById("sink-ports");
+    removeAllChildren(sinkPortSelect);
+
+    var dpid = $('#switch').val();
+    $.each(portMap[dpid], function(key, value) {
+        var portNum = parseInt(value.port_no);
+        var el = document.createElement("option");
+        el.textContent = portNum;
+        el.value = portNum;
+        srcPortSelect.appendChild(el);
+
+        el = document.createElement("option");
+        el.textContent = portNum;
+        el.value = portNum;
+        sinkPortSelect.appendChild(el);
+   });
+}
+
+/* Format of the POST data is as follows:
+
+{'fields': {'  'dl_src': mac string,
+               'dl_dst': mac string,
+               'dl_type': int,
+               'dl_vlan': int,
+               'nw_src': ip string,
+               'nw_dst': ip string,
+               'nw_proto': int,
+               'tp_src': int,
+               'tp_dst': int},
+'sources': list of {'dpid': int, 'port_no': int},
+'sinks': list of {'dpid': int, 'port_no': int}
+}
+
+ */
+
+function makePostData() {
+    var tapInfo = {};
+    var dpid = $('#switch').val();
+    var srcPorts = $('#src-ports').val();
+    var sinkPorts = $('#sink-ports').val();
+
+    if (sinkPorts == undefined) {
+        alert("Sink ports need to be specified.");
+        return undefined;
+    } 
+
+    tapInfo['sources'] = [];
+    tapInfo['sinks'] = [];
+    tapInfo['fields'] = {};
+
+    if ($.inArray('all', srcPorts) != -1)
+         tapInfo.sources.push({'dpid': parseInt(dpid), 'port_no': 'all'});
+    else {
+        $.each(srcPorts, function(index, value) {
+            port = {'dpid': parseInt(dpid), 'port_no': parseInt(value)};
+            tapInfo.sources.push(port);
+        });
+    }
+    $.each(sinkPorts, function(index, value) {
+        var port = {'dpid': parseInt(dpid), 'port_no': parseInt(value)};
+        tapInfo.sinks.push(port);
+    });
+
+    var macStr = $('#mac-addr').val();
+    var ipStr = $('#ip-addr').val();
+    var trafficType = $('#traffic-type').val();
+    var macClass = $('#mac-class').val();
+    var ipClass = $('#ip-class').val();
+
+    if (macClass != "--Ignore--") {
+        if (macStr == undefined || macStr=="") {
+            alert("MAC address needs to be specified.");
+            return undefined;
+        }
+    }
+    if (macClass == 'Source') 
+        tapInfo.fields['dl_src'] = macStr;
+    else if (macClass == 'Destination') 
+        tapInfo.fields['dl_dst'] = macStr;
+    else if (macClass == 'Src or Dest') 
+        tapInfo.fields['dl_host'] = macStr;
+
+    if (ipClass != "--Ignore--") {
+        if (ipStr == undefined || ipStr=="") {
+            alert("MAC address needs to be specified.");
+            return undefined;
+        }
+        tapInfo.fields['dl_type'] = 0x800;
+    }
+    if (ipClass == 'Source') 
+        tapInfo.fields['nw_src'] = ipStr;
+    else if (ipClass == 'Destination') 
+        tapInfo.fields['nw_dst'] = ipStr;
+    else if (ipClass == 'Src or Dest') 
+        tapInfo.fields['nw_host'] = ipStr;
+
+    if (trafficType == 'ARP') {
+        tapInfo.fields['dl_type'] = 0x806;
+    }
+
+    // Set prerequisite of IPv4 for all other types
+    else if (trafficType == 'ICMP') {
+        tapInfo.fields['dl_type'] = 0x800;
+        tapInfo.fields['nw_proto'] = 1;
+
+    } else if (trafficType == 'TCP') {
+        tapInfo.fields['dl_type'] = 0x800;
+        tapInfo.fields['nw_proto'] = 6;
+    }
+    else if (trafficType == 'HTTP') {
+        tapInfo.fields['dl_type'] = 0x800;
+        tapInfo.fields['nw_proto'] = 6;
+        tapInfo.fields['tp_port'] = 80;
+    }
+    else if (trafficType == 'HTTPS') {
+        tapInfo.fields['dl_type'] = 0x800;
+        tapInfo.fields['tp_port'] = 443;
+        tapInfo.fields['nw_proto'] = 6;
+    }
+    else if (trafficType == 'UDP') {
+        tapInfo.fields['dl_type'] = 0x800;
+        tapInfo.fields['nw_proto'] = 0x11;
+    }
+    else if (trafficType == 'DNS') {
+        tapInfo.fields['dl_type'] = 0x800;
+        tapInfo.fields['tp_port'] = 53;
+        tapInfo.fields['nw_proto'] = 0x11;
+    } else if (trafficType == 'DHCP') {
+        tapInfo.fields['dl_type'] = 0x800;
+        tapInfo.fields['tp_port'] = 67;
+        tapInfo.fields['nw_proto'] = 0x11;
+    } 
+    console.log(tapInfo.fields);
+
+    return tapInfo;
+}
+
+function restoreMain() {
+    $("#main").replaceWith(originalMain);
+    $('#post-status').html('');
+}
+
+function setTap() {
+    var tapInfo = makePostData();
+    if (tapInfo == undefined)
+        return;
+
+    $.post(url.concat("/v1.0/tap/create"), JSON.stringify(tapInfo), function() { 
+    }, "json")
+    .done(function() {
+        originalMain = $('#main').clone();
+        $('#post-status').html('');
+        $('#main').html('<h2>Tap created</h2><p>Successfully created tap. Check the <a href="/web/stats.html#flow">flow statistics</a> to verify that the rules have been created.</p><button class="pure-button pure-button-primary" onclick="restoreMain()">Create another tap</button>');
+    })
+    .fail(function() {
+        $('#post-status').html('<p style="color:red; background:silver;">Error: Tap creation failed. Please verify your input.');
+    });
+}
+
+
+function clearTap() {
+    var tapInfo = makePostData();
+    if (tapInfo == undefined)
+        return;
+
+    $.post(url.concat("/v1.0/tap/delete"), JSON.stringify(tapInfo), function() { 
+    }, "json")
+    .done(function() {
+        originalMain = $('#main').clone();
+        $('#post-status').html('');
+        $('#main').html('<h2>Tap deleted</h2><p>Successfully deleted tap. Check the <a href="/web/stats.html#flow">flow statistics</a> to verify that the rules have been deleted.</p><button class="pure-button pure-button-primary" onclick="restoreMain()">Create another tap</button>');
+    })
+    .fail(function() {
+        $('#post-status').html('<p style="color:red; background:silver;">Error: Tap deletion failed. Please verify your input.');
+    });
+}
+
+updateSwitchList();
+