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

Reply via email to