--- /dev/null
+/*
+ * 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";
+
+function updateFlowStats() {
+ var statsTableBody = document.getElementById('flow-stats-data');
+ while (statsTableBody.firstChild) {
+ statsTableBody.removeChild(statsTableBody.firstChild);
+ }
+
+ $.getJSON(url.concat("/stats/switches"), function(switches){
+ $.each(switches, function(index, dpid){
+ var hex_dpid = parseInt(dpid).toString(16);
+
+ $.getJSON(url.concat("/stats/flow/").concat(dpid), function(flows) {
+ var flowStats = flows[dpid];
+
+ var tr = document.createElement('TR');
+ var numFlows = 0;
+ var switchColTd = document.createElement('TD');
+ switchColTd.appendChild(document.createTextNode(hex_dpid));
+ tr.appendChild(switchColTd);
+
+ var td;
+
+ $.each(flowStats, function(index, obj) {
+ var outPorts = [];
+ if ("actions" in obj) {
+ $.each(obj.actions, function(index, action) {
+ var command = action.split(':')[0];
+ var param = action.split(':')[1];
+
+ if (command == "OUTPUT") {
+ if (param < 65280)
+ outPorts.push(param);
+ }
+ });
+ }
+ if (outPorts.length > 0) {
+ numFlows += 1;
+ var matchFields = new Array("in_port", "dl_src", "dl_dst", "dl_type",
+ "nw_src", "nw_dst", "nw_proto", "tp_src", "tp_dst");
+
+ if (!("match" in obj)) {
+ obj.match = {};
+ }
+
+ $.each(matchFields, function(index, field) {
+ td = document.createElement('TD');
+ if (field in obj.match) {
+ value = obj.match[field];
+ if (field == "dl_type")
+ value = ethertypeToString(obj.match[field]);
+ else if (field == "nw_proto")
+ value = nwprotoToString(obj.match[field]);
+
+ td.appendChild(document.createTextNode(value));
+ }
+ else
+ td.appendChild(document.createTextNode("*"));
+ tr.appendChild(td);
+ });
+
+ td = document.createElement('TD');
+ td.appendChild(document.createTextNode(outPorts));
+ tr.appendChild(td);
+
+ td = document.createElement('TD');
+ var duration = obj.duration_sec + obj.duration_nsec/1000000000;
+ td.appendChild(document.createTextNode(duration));
+ tr.appendChild(td);
+
+ td = document.createElement('TD');
+ td.appendChild(document.createTextNode(obj.packet_count));
+ tr.appendChild(td);
+
+ td = document.createElement('TD');
+ td.appendChild(document.createTextNode(obj.byte_count));
+ tr.appendChild(td);
+
+ statsTableBody.appendChild(tr);
+ tr = document.createElement('TR');
+ }
+ });
+
+ switchColTd.rowSpan = numFlows;
+ });
+ });
+ });
+}
+
+updateFlowStats();
+
+var flowStatsIntervalID = setInterval(function(){updateFlowStats()}, 5000);
+
+function stopFlowStatsTableRefresh() {
+ clearInterval(flowStatsIntervalID);
+}