blob: 281925377110b6c34618e9022fa04d2a8d897832 [file] [log] [blame]
pingping-lina2cbfad2013-03-07 08:39:21 +08001package net.floodlightcontroller.bgproute;
2
3import java.util.Collection;
4import java.util.Map;
5import java.util.ArrayList;
6import java.util.HashMap;
7
8import net.floodlightcontroller.core.module.FloodlightModuleContext;
9import net.floodlightcontroller.core.module.FloodlightModuleException;
10import net.floodlightcontroller.core.module.IFloodlightModule;
11import net.floodlightcontroller.core.module.IFloodlightService;
12import net.floodlightcontroller.core.IFloodlightProviderService;
13
14import net.floodlightcontroller.linkdiscovery.ILinkDiscovery.LDUpdate;
15import net.floodlightcontroller.restserver.IRestApiService;
16import net.floodlightcontroller.topology.ITopologyListener;
17import net.floodlightcontroller.topology.ITopologyService;
18import net.floodlightcontroller.restclient.RestClient;
19
20import net.floodlightcontroller.linkdiscovery.ILinkDiscovery;
21
22import org.slf4j.Logger;
23import org.slf4j.LoggerFactory;
24
25public class BgpRoute implements IFloodlightModule, IBgpRouteService, ITopologyListener {
26
27 protected static Logger log = LoggerFactory.getLogger(BgpRoute.class);
28
29 protected IFloodlightProviderService floodlightProvider;
30 protected ITopologyService topology;
31
32 protected static Ptree ptree;
33
34 @Override
35 public Collection<Class<? extends IFloodlightService>> getModuleServices() {
36 Collection<Class<? extends IFloodlightService>> l = new ArrayList<Class<? extends IFloodlightService>>();
37 l.add(IBgpRouteService.class);
38 return l;
39 }
40
41 @Override
42 public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {
43 Map<Class<? extends IFloodlightService>, IFloodlightService> m = new HashMap<Class<? extends IFloodlightService>, IFloodlightService>();
44 m.put(IBgpRouteService.class, this);
45 return m;
46 }
47
48 protected IRestApiService restApi;
49
50 @Override
51 public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
52 Collection<Class<? extends IFloodlightService>> l = new ArrayList<Class<? extends IFloodlightService>>();
53 l.add(IFloodlightProviderService.class);
54 l.add(ITopologyService.class);
55 l.add(IBgpRouteService.class);
56 return l;
57 }
58
59 @Override
60 public void init(FloodlightModuleContext context)
61 throws FloodlightModuleException {
62
63 ptree = new Ptree(32);
64
65 // Register floodlight provider and REST handler.
66 floodlightProvider = context.getServiceImpl(IFloodlightProviderService.class);
67 restApi = context.getServiceImpl(IRestApiService.class);
68 topology = context.getServiceImpl(ITopologyService.class);
69
70 // Test.
71 //test();
72 }
73
74 public Ptree getPtree() {
75 return ptree;
76 }
77
78 // Return nexthop address as byte array.
79 public Rib lookupRib(byte[] dest) {
80 if (ptree == null) {
81 log.debug("lookupRib: ptree null");
82 return null;
83 }
84
85 PtreeNode node = ptree.match(dest, 32);
86 if (node == null) {
87 log.debug("lookupRib: ptree node null");
88 return null;
89 }
90 if (node.rib == null) {
91 log.debug("lookupRib: ptree rib null");
92 return null;
93 }
94 ptree.delReference(node);
95
96 return node.rib;
97 }
98
99 @SuppressWarnings("unused")
100 private void test() {
101 System.out.println("Here it is");
102 Prefix p = new Prefix("128.0.0.0", 8);
103 Prefix q = new Prefix("8.0.0.0", 8);
104 Prefix r = new Prefix("10.0.0.0", 24);
105 Prefix a = new Prefix("10.0.0.1", 32);
106
107 ptree.acquire(p.getAddress(), p.masklen);
108 ptree.acquire(q.getAddress(), q.masklen);
109 ptree.acquire(r.getAddress(), r.masklen);
110
111 System.out.println("Traverse start");
112 for (PtreeNode node = ptree.begin(); node != null; node = ptree.next(node)) {
113 Prefix p_result = new Prefix(node.key, node.keyBits);
114 }
115
116 PtreeNode n = ptree.match(a.getAddress(), a.masklen);
117 if (n != null) {
118 System.out.println("Matched prefix for 10.0.0.1:");
119 Prefix x = new Prefix(n.key, n.keyBits);
120 ptree.delReference(n);
121 }
122
123 n = ptree.lookup(p.getAddress(), p.masklen);
124 if (n != null) {
125 ptree.delReference(n);
126 ptree.delReference(n);
127 }
128 System.out.println("Traverse start");
129 for (PtreeNode node = ptree.begin(); node != null; node = ptree.next(node)) {
130 Prefix p_result = new Prefix(node.key, node.keyBits);
131 }
132
133 n = ptree.lookup(q.getAddress(), q.masklen);
134 if (n != null) {
135 ptree.delReference(n);
136 ptree.delReference(n);
137 }
138 System.out.println("Traverse start");
139 for (PtreeNode node = ptree.begin(); node != null; node = ptree.next(node)) {
140 Prefix p_result = new Prefix(node.key, node.keyBits);
141 }
142
143 n = ptree.lookup(r.getAddress(), r.masklen);
144 if (n != null) {
145 ptree.delReference(n);
146 ptree.delReference(n);
147 }
148 System.out.println("Traverse start");
149 for (PtreeNode node = ptree.begin(); node != null; node = ptree.next(node)) {
150 Prefix p_result = new Prefix(node.key, node.keyBits);
151 }
152
153 }
154
155 @Override
156 public void startUp(FloodlightModuleContext context) {
157 restApi.addRestletRoutable(new BgpRouteWebRoutable());
158 topology.addListener((ITopologyListener) this);
159 }
160
161 @Override
162 public void topologyChanged() {
163 boolean change = false;
164 String changelog = "";
165
166 for (LDUpdate ldu : topology.getLastLinkUpdates()) {
167 if (ldu.getOperation().equals(ILinkDiscovery.UpdateOperation.PORT_DOWN)) {
168 change = true;
169 changelog = changelog + " down ";
170 } else if (ldu.getOperation().equals(ILinkDiscovery.UpdateOperation.PORT_UP)) {
171 change = true;
172 changelog = changelog + " up ";
173 }
174 }
175 log.info ("received topo change" + changelog);
176
177 if (change) {
178 RestClient.get ("http://localhost:5000/topo_change");
179 }
180 }
181}