#222
diff --git a/src/main/java/net/floodlightcontroller/bgproute/BgpRouteResource.java b/src/main/java/net/floodlightcontroller/bgproute/BgpRouteResource.java
new file mode 100644
index 0000000..d5abb5a
--- /dev/null
+++ b/src/main/java/net/floodlightcontroller/bgproute/BgpRouteResource.java
@@ -0,0 +1,139 @@
+package net.floodlightcontroller.bgproute;
+
+import org.restlet.resource.Get;
+import org.restlet.resource.Post;
+import org.restlet.resource.Delete;
+import org.restlet.resource.ServerResource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import net.floodlightcontroller.restclient.RestClient;
+
+public class BgpRouteResource extends ServerResource {
+
+ protected static Logger log = LoggerFactory
+ .getLogger(BgpRouteResource.class);
+
+ private String addrToString(byte [] addr) {
+ String str = "";
+
+ for (int i = 0; i < 4; i++) {
+ int val = (addr[i] & 0xff);
+ str += val;
+ if (i != 3)
+ str += ".";
+ }
+
+ return str;
+ }
+
+ @SuppressWarnings("unused")
+ @Get
+ public String get(String fmJson) {
+ String dest = (String) getRequestAttributes().get("dest");
+ String output = "";
+ IBgpRouteService bgpRoute = (IBgpRouteService)getContext().getAttributes().
+ get(IBgpRouteService.class.getCanonicalName());
+
+ if (dest != null) {
+ Prefix p = new Prefix(dest, 32);
+ if (p == null) {
+ return "[GET]: dest address format is wrong";
+ }
+ byte [] nexthop = bgpRoute.lookupRib(p.getAddress()).nextHop.getAddress();
+ if (nexthop != null) {
+ output += "{\"result\": \"" + addrToString(nexthop) + "\"}\n";
+ } else {
+ output += "{\"result\": \"Nexthop does not exist\"}\n";
+ }
+ } else {
+ Ptree ptree = bgpRoute.getPtree();
+ output += "{\n \"rib\": [\n";
+ boolean printed = false;
+ for (PtreeNode node = ptree.begin(); node != null; node = ptree.next(node)) {
+ if (node.rib == null) {
+ continue;
+ }
+ if (printed == true) {
+ output += ",\n";
+ }
+ output += " {\"prefix\": \"" + addrToString(node.key) + "/" + node.keyBits +"\", ";
+ output += "\"nexthop\": \"" + addrToString(node.rib.nextHop.getAddress()) +"\"}";
+ printed = true;
+ }
+ //output += "{\"router_id\": \"" + addrToString(node.rib.routerId.getAddress()) +"\"}\n";
+ output += "\n ]\n}\n";
+ }
+
+ return output;
+ }
+ @Post
+ public String store(String fmJson) {
+ IBgpRouteService bgpRoute = (IBgpRouteService)getContext().getAttributes().
+ get(IBgpRouteService.class.getCanonicalName());
+
+ Ptree ptree = bgpRoute.getPtree();
+
+ String router_id = (String) getRequestAttributes().get("routerid");
+ String prefix = (String) getRequestAttributes().get("prefix");
+ String mask = (String) getRequestAttributes().get("mask");
+ String nexthop = (String) getRequestAttributes().get("nexthop");
+ String capability = (String) getRequestAttributes().get("capability");
+ String reply = null;
+
+ if (capability == null) {
+ // this is a prefix add
+ Prefix p = new Prefix(prefix, Integer.valueOf(mask));
+ PtreeNode node = ptree.acquire(p.getAddress(), p.masklen);
+ Rib rib = new Rib(router_id, nexthop, p.masklen);
+
+ if (node.rib != null) {
+ node.rib = null;
+ ptree.delReference(node);
+ }
+ node.rib = rib;
+
+ reply = "[POST: " + prefix + "/" + mask + ":" + nexthop + "]";
+ log.info(reply);
+
+ RestClient.get("http://localhost:5000/bgp_update");
+ }
+
+ return reply + "\n";
+ }
+
+ @Delete
+ public String delete(String fmJson) {
+ IBgpRouteService bgpRoute = (IBgpRouteService)getContext().getAttributes().
+ get(IBgpRouteService.class.getCanonicalName());
+
+ Ptree ptree = bgpRoute.getPtree();
+
+ String routerId = (String) getRequestAttributes().get("routerid");
+ String prefix = (String) getRequestAttributes().get("prefix");
+ String mask = (String) getRequestAttributes().get("mask");
+ String nextHop = (String) getRequestAttributes().get("nexthop");
+ String capability = (String) getRequestAttributes().get("capability");
+ String reply = null;
+
+ if (capability == null) {
+ // this is a prefix delete
+ Prefix p = new Prefix(prefix, Integer.valueOf(mask));
+ PtreeNode node = ptree.lookup(p.getAddress(), p.masklen);
+ Rib r = new Rib(routerId, nextHop, p.masklen);
+
+ if (node != null && node.rib != null) {
+ if (r.equals(node.rib)) {
+ node.rib = null;
+ ptree.delReference(node);
+ }
+ }
+
+ reply = "[DELE: " + prefix + "/" + mask + ":" + nextHop + "]";
+ log.info(reply);
+
+ RestClient.get("http://localhost:5000/bgp_update");
+ }
+
+ return reply + "\n";
+ }
+}