For some reason I am having a hard time running mininet which produces the
forwarding rules.
Anyways here is my code:
import java.io.File;
import java.io.PrintWriter;
import java.io.FileWriter;
import java.util.Collections;
import java.util.LinkedList;
public class Forwarding {
static void dieUsage() {
System.err.println("Usage:");
System.err.println("java Forwarding <depth> <fanout> [dotfile]");
System.err.println("(depth and fanout must be integers >= 1)");
System.exit(1);
}
public static void main(String[] argv) {
int depth = -1;
int fanout = -1;
String filename = null;
if(argv.length >= 2) {
depth = Integer.parseInt(argv[0]);
fanout = Integer.parseInt(argv[1]);
} else dieUsage();
if(depth < 1 || fanout < 1) dieUsage();
if(argv.length >= 3) {
filename = argv[2];
}
TreeNode root = new TreeNode();
root.build(depth, fanout);
System.out.println(root);
if(filename != null) {
root.saveDOT(new File(filename));
}
LinkedList<TreeNode> leaves = root.getLeaves(); // these are the
HOSTS
// TODO:
// Go through each unique pair (src,dst) of leaves, and compute the
path from src to dst.
// For a single path, you can use the Interface class to store each
hop on the path (iface can be used for
// the input interface, and iface2 can be used for the output
interface).
System.out.println (sudo dpctl add-flow unix:/tmp/s2
"idle_timeout=0,hard_timeout=0,in_port=1,ip,nw_src=10.0.0.1,nw_dst=10.0.0.3,actions=output:3"
sudo dpctl add-flow unix:/tmp/s1
"idle_timeout=0,hard_timeout=0,in_port=1,ip,nw_src=10.0.0.1,nw_dst=10.0.0.3,actions=output:2"
sudo dpctl add-flow unix:/tmp/s3
"idle_timeout=0,hard_timeout=0,in_port=3,ip,nw_src=10.0.0.1,nw_dst=10.0.0.3,actions=output:1"
sudo dpctl add-flow unix:/tmp/s2
"idle_timeout=0,hard_timeout=0,in_port=1,arp,nw_src=10.0.0.1,nw_dst=10.0.0.3,actions=output:3"
sudo dpctl add-flow unix:/tmp/s1
"idle_timeout=0,hard_timeout=0,in_port=1,arp,nw_src=10.0.0.1,nw_dst=10.0.0.3,actions=output:2"
sudo dpctl add-flow unix:/tmp/s3
"idle_timeout=0,hard_timeout=0,in_port=3,arp,nw_src=10.0.0.1,nw_dst=10.0.0.3,actions=output:1"
sudo dpctl add-flow unix:/tmp/s3
"idle_timeout=0,hard_timeout=0,in_port=1,ip,nw_src=10.0.0.3,nw_dst=10.0.0.1,actions=output:3"
sudo dpctl add-flow unix:/tmp/s1
"idle_timeout=0,hard_timeout=0,in_port=2,ip,nw_src=10.0.0.3,nw_dst=10.0.0.1,actions=output:1"
sudo dpctl add-flow unix:/tmp/s2
"idle_timeout=0,hard_timeout=0,in_port=3,ip,nw_src=10.0.0.3,nw_dst=10.0.0.1,actions=output:1"
sudo dpctl add-flow unix:/tmp/s3
"idle_timeout=0,hard_timeout=0,in_port=1,arp,nw_src=10.0.0.3,nw_dst=10.0.0.1,actions=output:3"
sudo dpctl add-flow unix:/tmp/s1
"idle_timeout=0,hard_timeout=0,in_port=2,arp,nw_src=10.0.0.3,nw_dst=10.0.0.1,actions=output:1"
sudo dpctl add-flow unix:/tmp/s2
"idle_timeout=0,hard_timeout=0,in_port=3,arp,nw_src=10.0.0.3,nw_dst=10.0.0.1,actions=output:1")
public void printAllPaths(int src, int dst)
{
boolean[] isVisited = new boolean[v];
ArrayList<Integer> pathList = new ArrayList<>();
pathList.add(s);
printAllPathsUtil(src, dst, iface2);
}
}
class Interface {
int iface;
TreeNode node;
private int iface2 = 0;
Interface(TreeNode node) {
this(0, node);
}
Interface(int iface, TreeNode node) {
this.iface = iface;
this.node = node;
}
Interface(int iface1, TreeNode node, int iface2) {
this.iface = iface1;
this.iface2 = iface2;
this.node = node;
}
int getIface2() {
return iface2;
}
void setIface2(int iface2) {
this.iface2 = iface2;
}
public String toString() {
String s;
if(iface2 == 0) s= String.format("(%d->%s)", iface, node.getName());
else s = String.format("(%d->%s->%d)", iface, node.getName(),
iface2);
return s;
}
}
class TreeNode {
private Interface parent;
int id;
LinkedList<Interface> children = new LinkedList<Interface>();
boolean isLeaf;
private static int routerId;
private static int hostId;
TreeNode() {
this.parent = null;
this.id = 1;
}
TreeNode(TreeNode parent, int id) {
this(parent, id, false);
}
TreeNode(TreeNode parent, int id, boolean isLeaf) {
this.parent = new Interface(parent);
this.id = id;
this.isLeaf = isLeaf;
updateParent();
}
int getChildInterface(TreeNode child) {
for(Interface i : children) {
if(child.equals(i.node)) return i.iface;
}
return 0;
}
TreeNode getParent() {
return (parent != null ? parent.node : null);
}
int getParentInterface() {
return (parent != null ? parent.iface : 0);
}
void addChild(TreeNode n) {
int i = children.size() + (isLeaf() ? 0 : 1);
children.add(new Interface(i, n));
updateParent();
}
boolean isLeaf() {
return isLeaf;
}
String getName() {
return String.format("%s%d", isLeaf() ? "h" : "s", id);
}
LinkedList<TreeNode> getLeaves() {
LinkedList<TreeNode> l = new LinkedList<TreeNode>();
if(isLeaf()) {
l.add(this);
} else {
for(Interface i : children) {
l.addAll(i.node.getLeaves());
}
}
return l;
}
void build(int depth, int fanout) {
routerId = id;
hostId = 0;
build(this, depth, fanout);
}
private static void build(TreeNode root, int depth, int fanout) {
for(int i = 0; i < fanout; i++) {
boolean isLeaf = (depth == 1);
int id = isLeaf ? ++hostId : ++routerId;
TreeNode n = new TreeNode(root, id, isLeaf);
root.addChild(n);
if(!isLeaf) build(n, depth-1, fanout);
}
}
private void updateParent() {
if(parent != null) {
if(isLeaf()) parent.iface = 0;
else parent.iface = children.size()+1;
}
}
public String toString() {
return toString(0);
}
public String toString(int num) {
String str = "";
String space = num == 0 ? "" : String.format("%"+num+"s", " ");
for(Interface i : children) {
TreeNode n = i.node;
str += String.format("%s%d->%s,\n", space+" ", i.iface,
n.toString(num+3));
}
return String.format("%s{name=%s, parent=%s,\n%s%s}", isLeaf() ?
"Host" : "Router", getName(), parent != null ? parent : "None", str, space);
}
String toDotString() {
String s = String.format("%s [];\n", getName());
for(Interface i : children) {
s += i.node.toDotString();
s += String.format("%s -- %s [taillabel=\"%d\",
headlabel=\"%d\"];\n", getName(), i.node.getName(), i.iface,
i.node.getParentInterface());
}
return s;
}
void saveDOT(File f) {
try {
PrintWriter out = new PrintWriter(new FileWriter(f), true);
out.println("graph {");
out.print(toDotString());
out.println("}");
out.close();
} catch(Exception ex) {
}
}
}
Basically I build mininet which takes as input depth and fanout arguments,
and produces the forwarding rules (in the dpctl format) which allow
communication between all of the hosts in Mininet for a topology with that
depth and fanout. In other words, after installing the forwarding rules,
pingall should succeed in Mininet.
but I don't know if I am in right direction ?
--
Sent from:
http://openbsd-archive.7691.n7.nabble.com/openbsd-dev-tech-f151936.html