v1.5 updates

Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
This commit is contained in:
FUJITA Tomonori
2012-12-12 10:20:14 -08:00
parent 3162eff59c
commit b84fa7bae1
26 changed files with 10437 additions and 354 deletions

View File

@@ -1,4 +1,4 @@
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: 390104d5a7e55c9d1dd51e2c690ef52c
config: 9cc56b0e7a3966388527623e29025148
tags: fbb0d17656682115ca4d033fb2f83ba1

View File

@@ -0,0 +1,9 @@
*************
Configuration
*************
.. toctree::
:maxdepth: 2
tls.rst

View File

@@ -15,6 +15,7 @@ Contents:
getting_started.rst
openstack.rst
developing.rst
configuration.rst
Indices and tables
==================

View File

@@ -1 +0,0 @@
.. include:: ../../README.rst

75
doc/_sources/tls.txt Normal file
View File

@@ -0,0 +1,75 @@
********************
Setup TLS Connection
********************
If you want to use secure channel to connect OpenFlow switches, you
need to use TLS connection. This document describes how to setup Ryu
to connect to the Open vSwitch over TLS.
Configuring a Public Key Infrastructure
========================================
If you don't have a PKI, the ovs-pki script included with Open vSwitch
can help you. This section is based on the INSTALL.SSL in the Open
vSwitch source code.
NOTE: How to install Open vSwitch isn't described in this
document. Please refer to the Open vSwitch documents.
Create a PKI by using ovs-pki script::
% ovs-pki init
(Default directory is /usr/local/var/lib/openvswitch/pki)
The pki directory consists of controllerca and switchca
subdirectories. Each directory contains CA files.
Create a controller private key and certificate::
% ovs-pki req+sign ctl controller
ctl-privkey.pem and ctl-cert.pem are generated in the current
directory.
Create a switch private key and certificate::
% ovs-pki req+sign sc switch
sc-privkey.pem and sc-cert.pem are generated in the current directory.
Testing TLS Connection
======================
Configuring ovs-vswitchd to use CA files using the ovs-vsctl "set-ssl"
command, e.g.::
% ovs-vsctl set-ssl sc-privkey.pem sc-cert.pem /usr/local/var/lib/openvswitch/pki/controllerca/cacert.pem
% ovs-vsctl add-br br0
% ovs-vsctl set-controller br0 ssl:127.0.0.1:6633
Run Ryu with CA files::
% ryu-manager --ctl_privkey ctl-privkey.pem \
--ctl_cert ctl-cert.pem \
--ca_cert /usr/local/var/lib/openvswitch/pki/switchca/cacert.pem \
--verbose
You can see something like::
loading app ryu.controller.ofp_handler
instantiating app ryu.controller.ofp_handler
connected socket:<SSLSocket fileno=4 sock=127.0.0.1:6633 peer=127.0.0.1:56493> address:('127.0.0.1', 56493)
unhandled event <ryu.controller.dispatcher.EventQueueCreate object at 0x2fdcd90>
hello ev <ryu.controller.ofp_event.EventOFPHello object at 0x2fdce90>
move onto config mode
unhandled event <ryu.controller.dispatcher.EventDispatcherChange object at 0x2fdcfd0>
switch features ev version: 0x1 msg_type 0x6 xid 0xc23353f2 port OFPPhyPort(port_no=65534, hw_addr='\x16\xd8u\xe7[C', name='br0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', config=1, state=1, curr=0, advertised=0, supported=0, peer=0)
move onto main mode
unhandled event <ryu.controller.dispatcher.EventDispatcherChange object at 0x2fdcfd0>

View File

@@ -79,11 +79,11 @@ div.sphinxsidebar input {
font-size: 1em;
}
div.sphinxsidebar input[type="text"] {
div.sphinxsidebar #searchbox input[type="text"] {
width: 170px;
}
div.sphinxsidebar input[type="submit"] {
div.sphinxsidebar #searchbox input[type="submit"] {
width: 30px;
}

9398
doc/_static/jquery.js vendored

File diff suppressed because it is too large Load Diff

View File

@@ -1,23 +1,807 @@
// Underscore.js 0.5.5
// (c) 2009 Jeremy Ashkenas, DocumentCloud Inc.
// Underscore is freely distributable under the terms of the MIT license.
// Portions of Underscore are inspired by or borrowed from Prototype.js,
// Oliver Steele's Functional, and John Resig's Micro-Templating.
// For all details and documentation:
// http://documentcloud.github.com/underscore/
(function(){var j=this,n=j._,i=function(a){this._wrapped=a},m=typeof StopIteration!=="undefined"?StopIteration:"__break__",b=j._=function(a){return new i(a)};if(typeof exports!=="undefined")exports._=b;var k=Array.prototype.slice,o=Array.prototype.unshift,p=Object.prototype.toString,q=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;b.VERSION="0.5.5";b.each=function(a,c,d){try{if(a.forEach)a.forEach(c,d);else if(b.isArray(a)||b.isArguments(a))for(var e=0,f=a.length;e<f;e++)c.call(d,
a[e],e,a);else{var g=b.keys(a);f=g.length;for(e=0;e<f;e++)c.call(d,a[g[e]],g[e],a)}}catch(h){if(h!=m)throw h;}return a};b.map=function(a,c,d){if(a&&b.isFunction(a.map))return a.map(c,d);var e=[];b.each(a,function(f,g,h){e.push(c.call(d,f,g,h))});return e};b.reduce=function(a,c,d,e){if(a&&b.isFunction(a.reduce))return a.reduce(b.bind(d,e),c);b.each(a,function(f,g,h){c=d.call(e,c,f,g,h)});return c};b.reduceRight=function(a,c,d,e){if(a&&b.isFunction(a.reduceRight))return a.reduceRight(b.bind(d,e),c);
var f=b.clone(b.toArray(a)).reverse();b.each(f,function(g,h){c=d.call(e,c,g,h,a)});return c};b.detect=function(a,c,d){var e;b.each(a,function(f,g,h){if(c.call(d,f,g,h)){e=f;b.breakLoop()}});return e};b.select=function(a,c,d){if(a&&b.isFunction(a.filter))return a.filter(c,d);var e=[];b.each(a,function(f,g,h){c.call(d,f,g,h)&&e.push(f)});return e};b.reject=function(a,c,d){var e=[];b.each(a,function(f,g,h){!c.call(d,f,g,h)&&e.push(f)});return e};b.all=function(a,c,d){c=c||b.identity;if(a&&b.isFunction(a.every))return a.every(c,
d);var e=true;b.each(a,function(f,g,h){(e=e&&c.call(d,f,g,h))||b.breakLoop()});return e};b.any=function(a,c,d){c=c||b.identity;if(a&&b.isFunction(a.some))return a.some(c,d);var e=false;b.each(a,function(f,g,h){if(e=c.call(d,f,g,h))b.breakLoop()});return e};b.include=function(a,c){if(b.isArray(a))return b.indexOf(a,c)!=-1;var d=false;b.each(a,function(e){if(d=e===c)b.breakLoop()});return d};b.invoke=function(a,c){var d=b.rest(arguments,2);return b.map(a,function(e){return(c?e[c]:e).apply(e,d)})};b.pluck=
function(a,c){return b.map(a,function(d){return d[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);var e={computed:-Infinity};b.each(a,function(f,g,h){g=c?c.call(d,f,g,h):f;g>=e.computed&&(e={value:f,computed:g})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);var e={computed:Infinity};b.each(a,function(f,g,h){g=c?c.call(d,f,g,h):f;g<e.computed&&(e={value:f,computed:g})});return e.value};b.sortBy=function(a,c,d){return b.pluck(b.map(a,
function(e,f,g){return{value:e,criteria:c.call(d,e,f,g)}}).sort(function(e,f){e=e.criteria;f=f.criteria;return e<f?-1:e>f?1:0}),"value")};b.sortedIndex=function(a,c,d){d=d||b.identity;for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?(e=g+1):(f=g)}return e};b.toArray=function(a){if(!a)return[];if(a.toArray)return a.toArray();if(b.isArray(a))return a;if(b.isArguments(a))return k.call(a);return b.values(a)};b.size=function(a){return b.toArray(a).length};b.first=function(a,c,d){return c&&!d?k.call(a,
0,c):a[0]};b.rest=function(a,c,d){return k.call(a,b.isUndefined(c)||d?1:c)};b.last=function(a){return a[a.length-1]};b.compact=function(a){return b.select(a,function(c){return!!c})};b.flatten=function(a){return b.reduce(a,[],function(c,d){if(b.isArray(d))return c.concat(b.flatten(d));c.push(d);return c})};b.without=function(a){var c=b.rest(arguments);return b.select(a,function(d){return!b.include(c,d)})};b.uniq=function(a,c){return b.reduce(a,[],function(d,e,f){if(0==f||(c===true?b.last(d)!=e:!b.include(d,
e)))d.push(e);return d})};b.intersect=function(a){var c=b.rest(arguments);return b.select(b.uniq(a),function(d){return b.all(c,function(e){return b.indexOf(e,d)>=0})})};b.zip=function(){for(var a=b.toArray(arguments),c=b.max(b.pluck(a,"length")),d=new Array(c),e=0;e<c;e++)d[e]=b.pluck(a,String(e));return d};b.indexOf=function(a,c){if(a.indexOf)return a.indexOf(c);for(var d=0,e=a.length;d<e;d++)if(a[d]===c)return d;return-1};b.lastIndexOf=function(a,c){if(a.lastIndexOf)return a.lastIndexOf(c);for(var d=
a.length;d--;)if(a[d]===c)return d;return-1};b.range=function(a,c,d){var e=b.toArray(arguments),f=e.length<=1;a=f?0:e[0];c=f?e[0]:e[1];d=e[2]||1;e=Math.ceil((c-a)/d);if(e<=0)return[];e=new Array(e);f=a;for(var g=0;1;f+=d){if((d>0?f-c:c-f)>=0)return e;e[g++]=f}};b.bind=function(a,c){var d=b.rest(arguments,2);return function(){return a.apply(c||j,d.concat(b.toArray(arguments)))}};b.bindAll=function(a){var c=b.rest(arguments);if(c.length==0)c=b.functions(a);b.each(c,function(d){a[d]=b.bind(a[d],a)});
return a};b.delay=function(a,c){var d=b.rest(arguments,2);return setTimeout(function(){return a.apply(a,d)},c)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(b.rest(arguments)))};b.wrap=function(a,c){return function(){var d=[a].concat(b.toArray(arguments));return c.apply(c,d)}};b.compose=function(){var a=b.toArray(arguments);return function(){for(var c=b.toArray(arguments),d=a.length-1;d>=0;d--)c=[a[d].apply(this,c)];return c[0]}};b.keys=function(a){if(b.isArray(a))return b.range(0,a.length);
var c=[];for(var d in a)q.call(a,d)&&c.push(d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=function(a){return b.select(b.keys(a),function(c){return b.isFunction(a[c])}).sort()};b.extend=function(a,c){for(var d in c)a[d]=c[d];return a};b.clone=function(a){if(b.isArray(a))return a.slice(0);return b.extend({},a)};b.tap=function(a,c){c(a);return a};b.isEqual=function(a,c){if(a===c)return true;var d=typeof a;if(d!=typeof c)return false;if(a==c)return true;if(!a&&c||a&&!c)return false;
if(a.isEqual)return a.isEqual(c);if(b.isDate(a)&&b.isDate(c))return a.getTime()===c.getTime();if(b.isNaN(a)&&b.isNaN(c))return true;if(b.isRegExp(a)&&b.isRegExp(c))return a.source===c.source&&a.global===c.global&&a.ignoreCase===c.ignoreCase&&a.multiline===c.multiline;if(d!=="object")return false;if(a.length&&a.length!==c.length)return false;d=b.keys(a);var e=b.keys(c);if(d.length!=e.length)return false;for(var f in a)if(!b.isEqual(a[f],c[f]))return false;return true};b.isEmpty=function(a){return b.keys(a).length==
0};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=function(a){return!!(a&&a.concat&&a.unshift)};b.isArguments=function(a){return a&&b.isNumber(a.length)&&!b.isArray(a)&&!r.call(a,"length")};b.isFunction=function(a){return!!(a&&a.constructor&&a.call&&a.apply)};b.isString=function(a){return!!(a===""||a&&a.charCodeAt&&a.substr)};b.isNumber=function(a){return p.call(a)==="[object Number]"};b.isDate=function(a){return!!(a&&a.getTimezoneOffset&&a.setUTCFullYear)};b.isRegExp=function(a){return!!(a&&
a.test&&a.exec&&(a.ignoreCase||a.ignoreCase===false))};b.isNaN=function(a){return b.isNumber(a)&&isNaN(a)};b.isNull=function(a){return a===null};b.isUndefined=function(a){return typeof a=="undefined"};b.noConflict=function(){j._=n;return this};b.identity=function(a){return a};b.breakLoop=function(){throw m;};var s=0;b.uniqueId=function(a){var c=s++;return a?a+c:c};b.template=function(a,c){a=new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+a.replace(/[\r\t\n]/g,
" ").replace(/'(?=[^%]*%>)/g,"\t").split("'").join("\\'").split("\t").join("'").replace(/<%=(.+?)%>/g,"',$1,'").split("<%").join("');").split("%>").join("p.push('")+"');}return p.join('');");return c?a(c):a};b.forEach=b.each;b.foldl=b.inject=b.reduce;b.foldr=b.reduceRight;b.filter=b.select;b.every=b.all;b.some=b.any;b.head=b.first;b.tail=b.rest;b.methods=b.functions;var l=function(a,c){return c?b(a).chain():a};b.each(b.functions(b),function(a){var c=b[a];i.prototype[a]=function(){var d=b.toArray(arguments);
o.call(d,this._wrapped);return l(c.apply(b,d),this._chain)}});b.each(["pop","push","reverse","shift","sort","splice","unshift"],function(a){var c=Array.prototype[a];i.prototype[a]=function(){c.apply(this._wrapped,arguments);return l(this._wrapped,this._chain)}});b.each(["concat","join","slice"],function(a){var c=Array.prototype[a];i.prototype[a]=function(){return l(c.apply(this._wrapped,arguments),this._chain)}});i.prototype.chain=function(){this._chain=true;return this};i.prototype.value=function(){return this._wrapped}})();
// Underscore.js 1.1.6
// (c) 2011 Jeremy Ashkenas, DocumentCloud Inc.
// Underscore is freely distributable under the MIT license.
// Portions of Underscore are inspired or borrowed from Prototype,
// Oliver Steele's Functional, and John Resig's Micro-Templating.
// For all details and documentation:
// http://documentcloud.github.com/underscore
(function() {
// Baseline setup
// --------------
// Establish the root object, `window` in the browser, or `global` on the server.
var root = this;
// Save the previous value of the `_` variable.
var previousUnderscore = root._;
// Establish the object that gets returned to break out of a loop iteration.
var breaker = {};
// Save bytes in the minified (but not gzipped) version:
var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
// Create quick reference variables for speed access to core prototypes.
var slice = ArrayProto.slice,
unshift = ArrayProto.unshift,
toString = ObjProto.toString,
hasOwnProperty = ObjProto.hasOwnProperty;
// All **ECMAScript 5** native function implementations that we hope to use
// are declared here.
var
nativeForEach = ArrayProto.forEach,
nativeMap = ArrayProto.map,
nativeReduce = ArrayProto.reduce,
nativeReduceRight = ArrayProto.reduceRight,
nativeFilter = ArrayProto.filter,
nativeEvery = ArrayProto.every,
nativeSome = ArrayProto.some,
nativeIndexOf = ArrayProto.indexOf,
nativeLastIndexOf = ArrayProto.lastIndexOf,
nativeIsArray = Array.isArray,
nativeKeys = Object.keys,
nativeBind = FuncProto.bind;
// Create a safe reference to the Underscore object for use below.
var _ = function(obj) { return new wrapper(obj); };
// Export the Underscore object for **CommonJS**, with backwards-compatibility
// for the old `require()` API. If we're not in CommonJS, add `_` to the
// global object.
if (typeof module !== 'undefined' && module.exports) {
module.exports = _;
_._ = _;
} else {
root._ = _;
}
// Current version.
_.VERSION = '1.1.6';
// Collection Functions
// --------------------
// The cornerstone, an `each` implementation, aka `forEach`.
// Handles objects implementing `forEach`, arrays, and raw objects.
// Delegates to **ECMAScript 5**'s native `forEach` if available.
var each = _.each = _.forEach = function(obj, iterator, context) {
if (obj == null) return;
if (nativeForEach && obj.forEach === nativeForEach) {
obj.forEach(iterator, context);
} else if (_.isNumber(obj.length)) {
for (var i = 0, l = obj.length; i < l; i++) {
if (iterator.call(context, obj[i], i, obj) === breaker) return;
}
} else {
for (var key in obj) {
if (hasOwnProperty.call(obj, key)) {
if (iterator.call(context, obj[key], key, obj) === breaker) return;
}
}
}
};
// Return the results of applying the iterator to each element.
// Delegates to **ECMAScript 5**'s native `map` if available.
_.map = function(obj, iterator, context) {
var results = [];
if (obj == null) return results;
if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
each(obj, function(value, index, list) {
results[results.length] = iterator.call(context, value, index, list);
});
return results;
};
// **Reduce** builds up a single result from a list of values, aka `inject`,
// or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
_.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
var initial = memo !== void 0;
if (obj == null) obj = [];
if (nativeReduce && obj.reduce === nativeReduce) {
if (context) iterator = _.bind(iterator, context);
return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
}
each(obj, function(value, index, list) {
if (!initial && index === 0) {
memo = value;
initial = true;
} else {
memo = iterator.call(context, memo, value, index, list);
}
});
if (!initial) throw new TypeError("Reduce of empty array with no initial value");
return memo;
};
// The right-associative version of reduce, also known as `foldr`.
// Delegates to **ECMAScript 5**'s native `reduceRight` if available.
_.reduceRight = _.foldr = function(obj, iterator, memo, context) {
if (obj == null) obj = [];
if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
if (context) iterator = _.bind(iterator, context);
return memo !== void 0 ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
}
var reversed = (_.isArray(obj) ? obj.slice() : _.toArray(obj)).reverse();
return _.reduce(reversed, iterator, memo, context);
};
// Return the first value which passes a truth test. Aliased as `detect`.
_.find = _.detect = function(obj, iterator, context) {
var result;
any(obj, function(value, index, list) {
if (iterator.call(context, value, index, list)) {
result = value;
return true;
}
});
return result;
};
// Return all the elements that pass a truth test.
// Delegates to **ECMAScript 5**'s native `filter` if available.
// Aliased as `select`.
_.filter = _.select = function(obj, iterator, context) {
var results = [];
if (obj == null) return results;
if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);
each(obj, function(value, index, list) {
if (iterator.call(context, value, index, list)) results[results.length] = value;
});
return results;
};
// Return all the elements for which a truth test fails.
_.reject = function(obj, iterator, context) {
var results = [];
if (obj == null) return results;
each(obj, function(value, index, list) {
if (!iterator.call(context, value, index, list)) results[results.length] = value;
});
return results;
};
// Determine whether all of the elements match a truth test.
// Delegates to **ECMAScript 5**'s native `every` if available.
// Aliased as `all`.
_.every = _.all = function(obj, iterator, context) {
var result = true;
if (obj == null) return result;
if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);
each(obj, function(value, index, list) {
if (!(result = result && iterator.call(context, value, index, list))) return breaker;
});
return result;
};
// Determine if at least one element in the object matches a truth test.
// Delegates to **ECMAScript 5**'s native `some` if available.
// Aliased as `any`.
var any = _.some = _.any = function(obj, iterator, context) {
iterator || (iterator = _.identity);
var result = false;
if (obj == null) return result;
if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
each(obj, function(value, index, list) {
if (result = iterator.call(context, value, index, list)) return breaker;
});
return result;
};
// Determine if a given value is included in the array or object using `===`.
// Aliased as `contains`.
_.include = _.contains = function(obj, target) {
var found = false;
if (obj == null) return found;
if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
any(obj, function(value) {
if (found = value === target) return true;
});
return found;
};
// Invoke a method (with arguments) on every item in a collection.
_.invoke = function(obj, method) {
var args = slice.call(arguments, 2);
return _.map(obj, function(value) {
return (method.call ? method || value : value[method]).apply(value, args);
});
};
// Convenience version of a common use case of `map`: fetching a property.
_.pluck = function(obj, key) {
return _.map(obj, function(value){ return value[key]; });
};
// Return the maximum element or (element-based computation).
_.max = function(obj, iterator, context) {
if (!iterator && _.isArray(obj)) return Math.max.apply(Math, obj);
var result = {computed : -Infinity};
each(obj, function(value, index, list) {
var computed = iterator ? iterator.call(context, value, index, list) : value;
computed >= result.computed && (result = {value : value, computed : computed});
});
return result.value;
};
// Return the minimum element (or element-based computation).
_.min = function(obj, iterator, context) {
if (!iterator && _.isArray(obj)) return Math.min.apply(Math, obj);
var result = {computed : Infinity};
each(obj, function(value, index, list) {
var computed = iterator ? iterator.call(context, value, index, list) : value;
computed < result.computed && (result = {value : value, computed : computed});
});
return result.value;
};
// Sort the object's values by a criterion produced by an iterator.
_.sortBy = function(obj, iterator, context) {
return _.pluck(_.map(obj, function(value, index, list) {
return {
value : value,
criteria : iterator.call(context, value, index, list)
};
}).sort(function(left, right) {
var a = left.criteria, b = right.criteria;
return a < b ? -1 : a > b ? 1 : 0;
}), 'value');
};
// Use a comparator function to figure out at what index an object should
// be inserted so as to maintain order. Uses binary search.
_.sortedIndex = function(array, obj, iterator) {
iterator || (iterator = _.identity);
var low = 0, high = array.length;
while (low < high) {
var mid = (low + high) >> 1;
iterator(array[mid]) < iterator(obj) ? low = mid + 1 : high = mid;
}
return low;
};
// Safely convert anything iterable into a real, live array.
_.toArray = function(iterable) {
if (!iterable) return [];
if (iterable.toArray) return iterable.toArray();
if (_.isArray(iterable)) return iterable;
if (_.isArguments(iterable)) return slice.call(iterable);
return _.values(iterable);
};
// Return the number of elements in an object.
_.size = function(obj) {
return _.toArray(obj).length;
};
// Array Functions
// ---------------
// Get the first element of an array. Passing **n** will return the first N
// values in the array. Aliased as `head`. The **guard** check allows it to work
// with `_.map`.
_.first = _.head = function(array, n, guard) {
return (n != null) && !guard ? slice.call(array, 0, n) : array[0];
};
// Returns everything but the first entry of the array. Aliased as `tail`.
// Especially useful on the arguments object. Passing an **index** will return
// the rest of the values in the array from that index onward. The **guard**
// check allows it to work with `_.map`.
_.rest = _.tail = function(array, index, guard) {
return slice.call(array, (index == null) || guard ? 1 : index);
};
// Get the last element of an array.
_.last = function(array) {
return array[array.length - 1];
};
// Trim out all falsy values from an array.
_.compact = function(array) {
return _.filter(array, function(value){ return !!value; });
};
// Return a completely flattened version of an array.
_.flatten = function(array) {
return _.reduce(array, function(memo, value) {
if (_.isArray(value)) return memo.concat(_.flatten(value));
memo[memo.length] = value;
return memo;
}, []);
};
// Return a version of the array that does not contain the specified value(s).
_.without = function(array) {
var values = slice.call(arguments, 1);
return _.filter(array, function(value){ return !_.include(values, value); });
};
// Produce a duplicate-free version of the array. If the array has already
// been sorted, you have the option of using a faster algorithm.
// Aliased as `unique`.
_.uniq = _.unique = function(array, isSorted) {
return _.reduce(array, function(memo, el, i) {
if (0 == i || (isSorted === true ? _.last(memo) != el : !_.include(memo, el))) memo[memo.length] = el;
return memo;
}, []);
};
// Produce an array that contains every item shared between all the
// passed-in arrays.
_.intersect = function(array) {
var rest = slice.call(arguments, 1);
return _.filter(_.uniq(array), function(item) {
return _.every(rest, function(other) {
return _.indexOf(other, item) >= 0;
});
});
};
// Zip together multiple lists into a single array -- elements that share
// an index go together.
_.zip = function() {
var args = slice.call(arguments);
var length = _.max(_.pluck(args, 'length'));
var results = new Array(length);
for (var i = 0; i < length; i++) results[i] = _.pluck(args, "" + i);
return results;
};
// If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),
// we need this function. Return the position of the first occurrence of an
// item in an array, or -1 if the item is not included in the array.
// Delegates to **ECMAScript 5**'s native `indexOf` if available.
// If the array is large and already in sort order, pass `true`
// for **isSorted** to use binary search.
_.indexOf = function(array, item, isSorted) {
if (array == null) return -1;
var i, l;
if (isSorted) {
i = _.sortedIndex(array, item);
return array[i] === item ? i : -1;
}
if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item);
for (i = 0, l = array.length; i < l; i++) if (array[i] === item) return i;
return -1;
};
// Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.
_.lastIndexOf = function(array, item) {
if (array == null) return -1;
if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) return array.lastIndexOf(item);
var i = array.length;
while (i--) if (array[i] === item) return i;
return -1;
};
// Generate an integer Array containing an arithmetic progression. A port of
// the native Python `range()` function. See
// [the Python documentation](http://docs.python.org/library/functions.html#range).
_.range = function(start, stop, step) {
if (arguments.length <= 1) {
stop = start || 0;
start = 0;
}
step = arguments[2] || 1;
var len = Math.max(Math.ceil((stop - start) / step), 0);
var idx = 0;
var range = new Array(len);
while(idx < len) {
range[idx++] = start;
start += step;
}
return range;
};
// Function (ahem) Functions
// ------------------
// Create a function bound to a given object (assigning `this`, and arguments,
// optionally). Binding with arguments is also known as `curry`.
// Delegates to **ECMAScript 5**'s native `Function.bind` if available.
// We check for `func.bind` first, to fail fast when `func` is undefined.
_.bind = function(func, obj) {
if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
var args = slice.call(arguments, 2);
return function() {
return func.apply(obj, args.concat(slice.call(arguments)));
};
};
// Bind all of an object's methods to that object. Useful for ensuring that
// all callbacks defined on an object belong to it.
_.bindAll = function(obj) {
var funcs = slice.call(arguments, 1);
if (funcs.length == 0) funcs = _.functions(obj);
each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
return obj;
};
// Memoize an expensive function by storing its results.
_.memoize = function(func, hasher) {
var memo = {};
hasher || (hasher = _.identity);
return function() {
var key = hasher.apply(this, arguments);
return hasOwnProperty.call(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
};
};
// Delays a function for the given number of milliseconds, and then calls
// it with the arguments supplied.
_.delay = function(func, wait) {
var args = slice.call(arguments, 2);
return setTimeout(function(){ return func.apply(func, args); }, wait);
};
// Defers a function, scheduling it to run after the current call stack has
// cleared.
_.defer = function(func) {
return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
};
// Internal function used to implement `_.throttle` and `_.debounce`.
var limit = function(func, wait, debounce) {
var timeout;
return function() {
var context = this, args = arguments;
var throttler = function() {
timeout = null;
func.apply(context, args);
};
if (debounce) clearTimeout(timeout);
if (debounce || !timeout) timeout = setTimeout(throttler, wait);
};
};
// Returns a function, that, when invoked, will only be triggered at most once
// during a given window of time.
_.throttle = function(func, wait) {
return limit(func, wait, false);
};
// Returns a function, that, as long as it continues to be invoked, will not
// be triggered. The function will be called after it stops being called for
// N milliseconds.
_.debounce = function(func, wait) {
return limit(func, wait, true);
};
// Returns a function that will be executed at most one time, no matter how
// often you call it. Useful for lazy initialization.
_.once = function(func) {
var ran = false, memo;
return function() {
if (ran) return memo;
ran = true;
return memo = func.apply(this, arguments);
};
};
// Returns the first function passed as an argument to the second,
// allowing you to adjust arguments, run code before and after, and
// conditionally execute the original function.
_.wrap = function(func, wrapper) {
return function() {
var args = [func].concat(slice.call(arguments));
return wrapper.apply(this, args);
};
};
// Returns a function that is the composition of a list of functions, each
// consuming the return value of the function that follows.
_.compose = function() {
var funcs = slice.call(arguments);
return function() {
var args = slice.call(arguments);
for (var i=funcs.length-1; i >= 0; i--) {
args = [funcs[i].apply(this, args)];
}
return args[0];
};
};
// Returns a function that will only be executed after being called N times.
_.after = function(times, func) {
return function() {
if (--times < 1) { return func.apply(this, arguments); }
};
};
// Object Functions
// ----------------
// Retrieve the names of an object's properties.
// Delegates to **ECMAScript 5**'s native `Object.keys`
_.keys = nativeKeys || function(obj) {
if (obj !== Object(obj)) throw new TypeError('Invalid object');
var keys = [];
for (var key in obj) if (hasOwnProperty.call(obj, key)) keys[keys.length] = key;
return keys;
};
// Retrieve the values of an object's properties.
_.values = function(obj) {
return _.map(obj, _.identity);
};
// Return a sorted list of the function names available on the object.
// Aliased as `methods`
_.functions = _.methods = function(obj) {
return _.filter(_.keys(obj), function(key){ return _.isFunction(obj[key]); }).sort();
};
// Extend a given object with all the properties in passed-in object(s).
_.extend = function(obj) {
each(slice.call(arguments, 1), function(source) {
for (var prop in source) {
if (source[prop] !== void 0) obj[prop] = source[prop];
}
});
return obj;
};
// Fill in a given object with default properties.
_.defaults = function(obj) {
each(slice.call(arguments, 1), function(source) {
for (var prop in source) {
if (obj[prop] == null) obj[prop] = source[prop];
}
});
return obj;
};
// Create a (shallow-cloned) duplicate of an object.
_.clone = function(obj) {
return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
};
// Invokes interceptor with the obj, and then returns obj.
// The primary purpose of this method is to "tap into" a method chain, in
// order to perform operations on intermediate results within the chain.
_.tap = function(obj, interceptor) {
interceptor(obj);
return obj;
};
// Perform a deep comparison to check if two objects are equal.
_.isEqual = function(a, b) {
// Check object identity.
if (a === b) return true;
// Different types?
var atype = typeof(a), btype = typeof(b);
if (atype != btype) return false;
// Basic equality test (watch out for coercions).
if (a == b) return true;
// One is falsy and the other truthy.
if ((!a && b) || (a && !b)) return false;
// Unwrap any wrapped objects.
if (a._chain) a = a._wrapped;
if (b._chain) b = b._wrapped;
// One of them implements an isEqual()?
if (a.isEqual) return a.isEqual(b);
// Check dates' integer values.
if (_.isDate(a) && _.isDate(b)) return a.getTime() === b.getTime();
// Both are NaN?
if (_.isNaN(a) && _.isNaN(b)) return false;
// Compare regular expressions.
if (_.isRegExp(a) && _.isRegExp(b))
return a.source === b.source &&
a.global === b.global &&
a.ignoreCase === b.ignoreCase &&
a.multiline === b.multiline;
// If a is not an object by this point, we can't handle it.
if (atype !== 'object') return false;
// Check for different array lengths before comparing contents.
if (a.length && (a.length !== b.length)) return false;
// Nothing else worked, deep compare the contents.
var aKeys = _.keys(a), bKeys = _.keys(b);
// Different object sizes?
if (aKeys.length != bKeys.length) return false;
// Recursive comparison of contents.
for (var key in a) if (!(key in b) || !_.isEqual(a[key], b[key])) return false;
return true;
};
// Is a given array or object empty?
_.isEmpty = function(obj) {
if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
for (var key in obj) if (hasOwnProperty.call(obj, key)) return false;
return true;
};
// Is a given value a DOM element?
_.isElement = function(obj) {
return !!(obj && obj.nodeType == 1);
};
// Is a given value an array?
// Delegates to ECMA5's native Array.isArray
_.isArray = nativeIsArray || function(obj) {
return toString.call(obj) === '[object Array]';
};
// Is a given variable an arguments object?
_.isArguments = function(obj) {
return !!(obj && hasOwnProperty.call(obj, 'callee'));
};
// Is a given value a function?
_.isFunction = function(obj) {
return !!(obj && obj.constructor && obj.call && obj.apply);
};
// Is a given value a string?
_.isString = function(obj) {
return !!(obj === '' || (obj && obj.charCodeAt && obj.substr));
};
// Is a given value a number?
_.isNumber = function(obj) {
return !!(obj === 0 || (obj && obj.toExponential && obj.toFixed));
};
// Is the given value `NaN`? `NaN` happens to be the only value in JavaScript
// that does not equal itself.
_.isNaN = function(obj) {
return obj !== obj;
};
// Is a given value a boolean?
_.isBoolean = function(obj) {
return obj === true || obj === false;
};
// Is a given value a date?
_.isDate = function(obj) {
return !!(obj && obj.getTimezoneOffset && obj.setUTCFullYear);
};
// Is the given value a regular expression?
_.isRegExp = function(obj) {
return !!(obj && obj.test && obj.exec && (obj.ignoreCase || obj.ignoreCase === false));
};
// Is a given value equal to null?
_.isNull = function(obj) {
return obj === null;
};
// Is a given variable undefined?
_.isUndefined = function(obj) {
return obj === void 0;
};
// Utility Functions
// -----------------
// Run Underscore.js in *noConflict* mode, returning the `_` variable to its
// previous owner. Returns a reference to the Underscore object.
_.noConflict = function() {
root._ = previousUnderscore;
return this;
};
// Keep the identity function around for default iterators.
_.identity = function(value) {
return value;
};
// Run a function **n** times.
_.times = function (n, iterator, context) {
for (var i = 0; i < n; i++) iterator.call(context, i);
};
// Add your own custom functions to the Underscore object, ensuring that
// they're correctly added to the OOP wrapper as well.
_.mixin = function(obj) {
each(_.functions(obj), function(name){
addToWrapper(name, _[name] = obj[name]);
});
};
// Generate a unique integer id (unique within the entire client session).
// Useful for temporary DOM ids.
var idCounter = 0;
_.uniqueId = function(prefix) {
var id = idCounter++;
return prefix ? prefix + id : id;
};
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g
};
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(str, data) {
var c = _.templateSettings;
var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' +
'with(obj||{}){__p.push(\'' +
str.replace(/\\/g, '\\\\')
.replace(/'/g, "\\'")
.replace(c.interpolate, function(match, code) {
return "'," + code.replace(/\\'/g, "'") + ",'";
})
.replace(c.evaluate || null, function(match, code) {
return "');" + code.replace(/\\'/g, "'")
.replace(/[\r\n\t]/g, ' ') + "__p.push('";
})
.replace(/\r/g, '\\r')
.replace(/\n/g, '\\n')
.replace(/\t/g, '\\t')
+ "');}return __p.join('');";
var func = new Function('obj', tmpl);
return data ? func(data) : func;
};
// The OOP Wrapper
// ---------------
// If Underscore is called as a function, it returns a wrapped object that
// can be used OO-style. This wrapper holds altered versions of all the
// underscore functions. Wrapped objects may be chained.
var wrapper = function(obj) { this._wrapped = obj; };
// Expose `wrapper.prototype` as `_.prototype`
_.prototype = wrapper.prototype;
// Helper function to continue chaining intermediate results.
var result = function(obj, chain) {
return chain ? _(obj).chain() : obj;
};
// A method to easily add functions to the OOP wrapper.
var addToWrapper = function(name, func) {
wrapper.prototype[name] = function() {
var args = slice.call(arguments);
unshift.call(args, this._wrapped);
return result(func.apply(_, args), this._chain);
};
};
// Add all of the Underscore functions to the wrapper object.
_.mixin(_);
// Add all mutator Array functions to the wrapper.
each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
var method = ArrayProto[name];
wrapper.prototype[name] = function() {
method.apply(this._wrapped, arguments);
return result(this._wrapped, this._chain);
};
});
// Add all accessor Array functions to the wrapper.
each(['concat', 'join', 'slice'], function(name) {
var method = ArrayProto[name];
wrapper.prototype[name] = function() {
return result(method.apply(this._wrapped, arguments), this._chain);
};
});
// Start chaining a wrapped Underscore object.
wrapper.prototype.chain = function() {
this._chain = true;
return this;
};
// Extracts the result from a wrapped and chained object.
wrapper.prototype.value = function() {
return this._wrapped;
};
})();

85
doc/configuration.html Normal file
View File

@@ -0,0 +1,85 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Configuration &mdash; Ryu 1.5 documentation</title>
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="_static/print.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '1.5',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/theme_extras.js"></script>
<link rel="top" title="Ryu 1.5 documentation" href="index.html" />
<link rel="next" title="Setup TLS Connection" href="tls.html" />
<link rel="prev" title="Packet library" href="library_packet.html" />
</head>
<body>
<div class="header"><h1 class="heading"><a href="index.html">
<span>Ryu 1.5 documentation</span></a></h1>
<h2 class="heading"><span>Configuration</span></h2>
</div>
<div class="topnav">
<p>
«&#160;&#160;<a href="library_packet.html">Packet library</a>
&#160;&#160;::&#160;&#160;
<a class="uplink" href="index.html">Contents</a>
&#160;&#160;::&#160;&#160;
<a href="tls.html">Setup TLS Connection</a>&#160;&#160;»
</p>
</div>
<div class="content">
<div class="section" id="configuration">
<h1>Configuration<a class="headerlink" href="#configuration" title="Permalink to this headline"></a></h1>
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference internal" href="tls.html">Setup TLS Connection</a><ul>
<li class="toctree-l2"><a class="reference internal" href="tls.html#configuring-a-public-key-infrastructure">Configuring a Public Key Infrastructure</a></li>
<li class="toctree-l2"><a class="reference internal" href="tls.html#testing-tls-connection">Testing TLS Connection</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
<div class="bottomnav">
<p>
«&#160;&#160;<a href="library_packet.html">Packet library</a>
&#160;&#160;::&#160;&#160;
<a class="uplink" href="index.html">Contents</a>
&#160;&#160;::&#160;&#160;
<a href="tls.html">Setup TLS Connection</a>&#160;&#160;»
</p>
</div>
<div class="footer">
&copy; Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

View File

@@ -8,7 +8,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Writing Your Ryu Application &mdash; Ryu 1.3 documentation</title>
<title>Writing Your Ryu Application &mdash; Ryu 1.5 documentation</title>
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
@@ -17,7 +17,7 @@
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '1.3',
VERSION: '1.5',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -27,13 +27,13 @@
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/theme_extras.js"></script>
<link rel="top" title="Ryu 1.3 documentation" href="index.html" />
<link rel="top" title="Ryu 1.5 documentation" href="index.html" />
<link rel="next" title="The First Application" href="writing_ryu_app.html" />
<link rel="prev" title="How Ryu L2 segregation works" href="how_l2_segregation_works.html" />
</head>
<body>
<div class="header"><h1 class="heading"><a href="index.html">
<span>Ryu 1.3 documentation</span></a></h1>
<span>Ryu 1.5 documentation</span></a></h1>
<h2 class="heading"><span>Writing Your Ryu Application</span></h2>
</div>
<div class="topnav">
@@ -83,7 +83,7 @@
<div class="footer">
&copy; Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

View File

@@ -10,7 +10,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Index &mdash; Ryu 1.3 documentation</title>
<title>Index &mdash; Ryu 1.5 documentation</title>
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
@@ -19,7 +19,7 @@
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '1.3',
VERSION: '1.5',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -29,11 +29,11 @@
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/theme_extras.js"></script>
<link rel="top" title="Ryu 1.3 documentation" href="index.html" />
<link rel="top" title="Ryu 1.5 documentation" href="index.html" />
</head>
<body>
<div class="header"><h1 class="heading"><a href="index.html">
<span>Ryu 1.3 documentation</span></a></h1>
<span>Ryu 1.5 documentation</span></a></h1>
<h2 class="heading"><span>Index</span></h2>
</div>
<div class="topnav">
@@ -65,7 +65,7 @@
<div class="footer">
&copy; Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

View File

@@ -8,7 +8,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Getting Started &mdash; Ryu 1.3 documentation</title>
<title>Getting Started &mdash; Ryu 1.5 documentation</title>
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
@@ -17,7 +17,7 @@
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '1.3',
VERSION: '1.5',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -27,13 +27,13 @@
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/theme_extras.js"></script>
<link rel="top" title="Ryu 1.3 documentation" href="index.html" />
<link rel="top" title="Ryu 1.5 documentation" href="index.html" />
<link rel="next" title="OpenStack Integration" href="openstack.html" />
<link rel="prev" title="Welcome to RYU the Network Operating System(NOS)" href="index.html" />
</head>
<body>
<div class="header"><h1 class="heading"><a href="index.html">
<span>Ryu 1.3 documentation</span></a></h1>
<span>Ryu 1.5 documentation</span></a></h1>
<h2 class="heading"><span>Getting Started</span></h2>
</div>
<div class="topnav">
@@ -59,7 +59,7 @@
API that make it easy for operators to create new network management
and control applications. Currently, Ryu manages network devices by
using OpenFlow. You can say that Ryu is an OpenFlow Controller, which
support OpenFlow v1.0, v1.2, and Nicira Extensions.</p>
support OpenFlow v1.0, v1.2, v1.3, and Nicira Extensions.</p>
<p>All of the code is freely available under the Apache 2.0 license. Ryu
is fully written in Python.</p>
</div>
@@ -110,7 +110,7 @@ is also available.</p>
<div class="footer">
&copy; Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

View File

@@ -8,7 +8,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>How Ryu L2 segregation works &mdash; Ryu 1.3 documentation</title>
<title>How Ryu L2 segregation works &mdash; Ryu 1.5 documentation</title>
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
@@ -17,7 +17,7 @@
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '1.3',
VERSION: '1.5',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -27,14 +27,14 @@
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/theme_extras.js"></script>
<link rel="top" title="Ryu 1.3 documentation" href="index.html" />
<link rel="top" title="Ryu 1.5 documentation" href="index.html" />
<link rel="up" title="OpenStack Integration" href="openstack.html" />
<link rel="next" title="Writing Your Ryu Application" href="developing.html" />
<link rel="prev" title="Step-by-step example for testing ryu with OpenStack" href="step_by_step.html" />
</head>
<body>
<div class="header"><h1 class="heading"><a href="index.html">
<span>Ryu 1.3 documentation</span></a></h1>
<span>Ryu 1.5 documentation</span></a></h1>
<h2 class="heading"><span>How Ryu L2 segregation works</span></h2>
</div>
<div class="topnav">
@@ -143,7 +143,7 @@ and the all OVS ports that belongs to the network id</li>
<div class="footer">
&copy; Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

View File

@@ -8,7 +8,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Welcome to RYU the Network Operating System(NOS) &mdash; Ryu 1.3 documentation</title>
<title>Welcome to RYU the Network Operating System(NOS) &mdash; Ryu 1.5 documentation</title>
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
@@ -17,7 +17,7 @@
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '1.3',
VERSION: '1.5',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -27,12 +27,12 @@
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/theme_extras.js"></script>
<link rel="top" title="Ryu 1.3 documentation" href="#" />
<link rel="top" title="Ryu 1.5 documentation" href="#" />
<link rel="next" title="Getting Started" href="getting_started.html" />
</head>
<body>
<div class="header"><h1 class="heading"><a href="#">
<span>Ryu 1.3 documentation</span></a></h1>
<span>Ryu 1.5 documentation</span></a></h1>
<h2 class="heading"><span>Welcome to RYU the Network Operating System(NOS)</span></h2>
</div>
<div class="topnav">
@@ -69,6 +69,10 @@
<li class="toctree-l2"><a class="reference internal" href="library.html">Library</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="configuration.html">Configuration</a><ul>
<li class="toctree-l2"><a class="reference internal" href="tls.html">Setup TLS Connection</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="indices-and-tables">
@@ -95,7 +99,7 @@
<div class="footer">
&copy; Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

View File

@@ -8,7 +8,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Library &mdash; Ryu 1.3 documentation</title>
<title>Library &mdash; Ryu 1.5 documentation</title>
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
@@ -17,7 +17,7 @@
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '1.3',
VERSION: '1.5',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -27,14 +27,14 @@
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/theme_extras.js"></script>
<link rel="top" title="Ryu 1.3 documentation" href="index.html" />
<link rel="top" title="Ryu 1.5 documentation" href="index.html" />
<link rel="up" title="Writing Your Ryu Application" href="developing.html" />
<link rel="next" title="Packet library" href="library_packet.html" />
<link rel="prev" title="The First Application" href="writing_ryu_app.html" />
</head>
<body>
<div class="header"><h1 class="heading"><a href="index.html">
<span>Ryu 1.3 documentation</span></a></h1>
<span>Ryu 1.5 documentation</span></a></h1>
<h2 class="heading"><span>Library</span></h2>
</div>
<div class="topnav">
@@ -77,7 +77,7 @@
<div class="footer">
&copy; Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

View File

@@ -8,7 +8,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Packet library &mdash; Ryu 1.3 documentation</title>
<title>Packet library &mdash; Ryu 1.5 documentation</title>
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
@@ -17,7 +17,7 @@
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '1.3',
VERSION: '1.5',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -27,13 +27,14 @@
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/theme_extras.js"></script>
<link rel="top" title="Ryu 1.3 documentation" href="index.html" />
<link rel="top" title="Ryu 1.5 documentation" href="index.html" />
<link rel="up" title="Library" href="library.html" />
<link rel="next" title="Configuration" href="configuration.html" />
<link rel="prev" title="Library" href="library.html" />
</head>
<body>
<div class="header"><h1 class="heading"><a href="index.html">
<span>Ryu 1.3 documentation</span></a></h1>
<span>Ryu 1.5 documentation</span></a></h1>
<h2 class="heading"><span>Packet library</span></h2>
</div>
<div class="topnav">
@@ -42,6 +43,8 @@
«&#160;&#160;<a href="library.html">Library</a>
&#160;&#160;::&#160;&#160;
<a class="uplink" href="index.html">Contents</a>
&#160;&#160;::&#160;&#160;
<a href="configuration.html">Configuration</a>&#160;&#160;»
</p>
</div>
@@ -134,13 +137,15 @@ is building an arp packet.</p>
«&#160;&#160;<a href="library.html">Library</a>
&#160;&#160;::&#160;&#160;
<a class="uplink" href="index.html">Contents</a>
&#160;&#160;::&#160;&#160;
<a href="configuration.html">Configuration</a>&#160;&#160;»
</p>
</div>
<div class="footer">
&copy; Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

View File

@@ -1,6 +1,6 @@
# Sphinx inventory version 2
# Project: Ryu
# Version: 1.3
# Version: 1.5
# The remainder of this file is compressed using zlib.
xÚm<EFBFBD>ÁjÃ0DïúŠ…žhŽý€¦…¶)59 ÕZdY2Òǯ¥<C2AF>ºä¦<C3A4>y3 ²\0x<30>LæÅë_ô ŸÁVu×QïŸà<C5B8>ߢ<C39F>æ:ÌòfTú3šÑc
eÔ©í¶¢Uº)À·¶(ÆìU“£NÅC&Ýž·ÑGD)ZÉŽ¼gO,ÂÏ<ÂÒÓŽ&M¬6s&ì<>¬†fM輯>NÐÆ@)z<>ItqRŽWäí"vü^e´ íÒC¡ÊªÅ•Ždɽ-<2D>¼åcpXMaxZ†'Bóï“uÒ=¦Z[ayƒ冦Üâ

View File

@@ -8,7 +8,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>OpenStack Integration &mdash; Ryu 1.3 documentation</title>
<title>OpenStack Integration &mdash; Ryu 1.5 documentation</title>
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
@@ -17,7 +17,7 @@
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '1.3',
VERSION: '1.5',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -27,13 +27,13 @@
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/theme_extras.js"></script>
<link rel="top" title="Ryu 1.3 documentation" href="index.html" />
<link rel="top" title="Ryu 1.5 documentation" href="index.html" />
<link rel="next" title="Using Ryu Network Operating System with OpenStack as OpenFlow controller" href="using_with_openstack.html" />
<link rel="prev" title="Getting Started" href="getting_started.html" />
</head>
<body>
<div class="header"><h1 class="heading"><a href="index.html">
<span>Ryu 1.3 documentation</span></a></h1>
<span>Ryu 1.5 documentation</span></a></h1>
<h2 class="heading"><span>OpenStack Integration</span></h2>
</div>
<div class="topnav">
@@ -78,7 +78,7 @@
<div class="footer">
&copy; Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

View File

@@ -1,116 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Ryu Network Operating System &mdash; Ryu 1.2 documentation</title>
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="_static/print.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '1.2',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/theme_extras.js"></script>
<link rel="top" title="Ryu 1.2 documentation" href="index.html" />
<link rel="next" title="Writing Ryu Application" href="writing_ryu_app.html" />
<link rel="prev" title="Welcome to RYU the Network Operating System(NOS)" href="index.html" />
</head>
<body>
<div class="header"><h1 class="heading"><a href="index.html">
<span>Ryu 1.2 documentation</span></a></h1>
<h2 class="heading"><span>Ryu Network Operating System</span></h2>
</div>
<div class="topnav">
<p>
«&#160;&#160;<a href="index.html">Welcome to RYU the Network Operating System(NOS)</a>
&#160;&#160;::&#160;&#160;
<a class="uplink" href="index.html">Contents</a>
&#160;&#160;::&#160;&#160;
<a href="writing_ryu_app.html">Writing Ryu Application</a>&#160;&#160;»
</p>
</div>
<div class="content">
<div class="section" id="ryu-network-operating-system">
<h1>Ryu Network Operating System<a class="headerlink" href="#ryu-network-operating-system" title="Permalink to this headline"></a></h1>
<div class="section" id="what-s-ryu">
<h2>What&#8217;s Ryu<a class="headerlink" href="#what-s-ryu" title="Permalink to this headline"></a></h2>
<p>Ryu is an Operating System for Software Defined Networking.</p>
<p>Ryu aims to provide a logically centralized control and well defined
API that make it easy for operators to create new network management
and control applications. Currently, Ryu manages network devices by
using OpenFlow. You can say that Ryu is an OpenFlow Controller, which
support OpenFlow v1.0, v1.2, and Nicira Extensions.</p>
<p>All of the code is freely available under the Apache 2.0 license. Ryu
is fully written in Python.</p>
</div>
<div class="section" id="quick-start">
<h2>Quick Start<a class="headerlink" href="#quick-start" title="Permalink to this headline"></a></h2>
<p>Installing Ryu is quite easy:</p>
<div class="highlight-python"><pre>% pip install ryu</pre>
</div>
<p>If you prefer to install Ryu from the source code:</p>
<div class="highlight-python"><pre>% git clone git://github.com/osrg/ryu.git
% cd ryu; python ./setup.py install</pre>
</div>
<p>If you want to use Ryu with <a class="reference external" href="http://openstack.org/">OpenStack</a>,
please refer <a class="reference external" href="http://www.osrg.net/ryu/overview.html">detailed documents</a>.
You can create tens of thousands of isolated virtual networks without
using VLAN. The Ryu application is included in OpenStack mainline as
of Essex release.</p>
<p>If you want to run your Ryu application, have a look at
<a class="reference external" href="https://github.com/osrg/ryu/blob/master/ryu/app/simple_switch.py">a simple example</a>.
After writing your application, just type:</p>
<div class="highlight-python"><pre>% ryu-manager yourapp.py</pre>
</div>
</div>
<div class="section" id="support">
<h2>Support<a class="headerlink" href="#support" title="Permalink to this headline"></a></h2>
<p>Ryu Official site is <a class="reference external" href="http://osrg.github.com/ryu/">http://osrg.github.com/ryu/</a>.</p>
<p>If you have any
questions, suggestions, and patches, the mailing list is available at
<a class="reference external" href="https://lists.sourceforge.net/lists/listinfo/ryu-devel">ryu-devel ML</a>.
<a class="reference external" href="http://dir.gmane.org/gmane.network.ryu.devel">The ML archive at Gmane</a>
is also available.</p>
</div>
</div>
</div>
<div class="bottomnav">
<p>
«&#160;&#160;<a href="index.html">Welcome to RYU the Network Operating System(NOS)</a>
&#160;&#160;::&#160;&#160;
<a class="uplink" href="index.html">Contents</a>
&#160;&#160;::&#160;&#160;
<a href="writing_ryu_app.html">Writing Ryu Application</a>&#160;&#160;»
</p>
</div>
<div class="footer">
&copy; Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
</div>
</body>
</html>

View File

@@ -8,7 +8,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Getting Started &mdash; Ryu 1.3 documentation</title>
<title>Getting Started &mdash; Ryu 1.5 documentation</title>
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
@@ -17,7 +17,7 @@
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '1.3',
VERSION: '1.5',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -27,11 +27,11 @@
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/theme_extras.js"></script>
<link rel="top" title="Ryu 1.3 documentation" href="index.html" />
<link rel="top" title="Ryu 1.5 documentation" href="index.html" />
</head>
<body>
<div class="header"><h1 class="heading"><a href="index.html">
<span>Ryu 1.3 documentation</span></a></h1>
<span>Ryu 1.5 documentation</span></a></h1>
<h2 class="heading"><span>Getting Started</span></h2>
</div>
<div class="topnav">
@@ -186,7 +186,7 @@ ryu.app.event_dumper: event &lt;ryu.controller.dispatcher.EventDispatcherChange
<div class="footer">
&copy; Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

View File

@@ -8,7 +8,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Search &mdash; Ryu 1.3 documentation</title>
<title>Search &mdash; Ryu 1.5 documentation</title>
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
@@ -17,7 +17,7 @@
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '1.3',
VERSION: '1.5',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -28,7 +28,7 @@
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/searchtools.js"></script>
<script type="text/javascript" src="_static/theme_extras.js"></script>
<link rel="top" title="Ryu 1.3 documentation" href="index.html" />
<link rel="top" title="Ryu 1.5 documentation" href="index.html" />
<script type="text/javascript">
jQuery(function() { Search.loadIndex("searchindex.js"); });
</script>
@@ -37,7 +37,7 @@
</head>
<body>
<div class="header"><h1 class="heading"><a href="index.html">
<span>Ryu 1.3 documentation</span></a></h1>
<span>Ryu 1.5 documentation</span></a></h1>
<h2 class="heading"><span>Search</span></h2>
</div>
<div class="topnav">
@@ -85,7 +85,7 @@
<div class="footer">
&copy; Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

File diff suppressed because one or more lines are too long

View File

@@ -8,7 +8,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Step-by-step example for testing ryu with OpenStack &mdash; Ryu 1.3 documentation</title>
<title>Step-by-step example for testing ryu with OpenStack &mdash; Ryu 1.5 documentation</title>
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
@@ -17,7 +17,7 @@
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '1.3',
VERSION: '1.5',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -27,14 +27,14 @@
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/theme_extras.js"></script>
<link rel="top" title="Ryu 1.3 documentation" href="index.html" />
<link rel="top" title="Ryu 1.5 documentation" href="index.html" />
<link rel="up" title="OpenStack Integration" href="openstack.html" />
<link rel="next" title="How Ryu L2 segregation works" href="how_l2_segregation_works.html" />
<link rel="prev" title="Using Ryu Network Operating System with OpenStack as OpenFlow controller" href="using_with_openstack.html" />
</head>
<body>
<div class="header"><h1 class="heading"><a href="index.html">
<span>Ryu 1.3 documentation</span></a></h1>
<span>Ryu 1.5 documentation</span></a></h1>
<h2 class="heading"><span>Step-by-step example for testing ryu with OpenStack</span></h2>
</div>
<div class="topnav">
@@ -437,7 +437,7 @@ Just leave it blank:</p>
<div class="footer">
&copy; Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

125
doc/tls.html Normal file
View File

@@ -0,0 +1,125 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Setup TLS Connection &mdash; Ryu 1.5 documentation</title>
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="_static/print.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '1.5',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/theme_extras.js"></script>
<link rel="top" title="Ryu 1.5 documentation" href="index.html" />
<link rel="up" title="Configuration" href="configuration.html" />
<link rel="prev" title="Configuration" href="configuration.html" />
</head>
<body>
<div class="header"><h1 class="heading"><a href="index.html">
<span>Ryu 1.5 documentation</span></a></h1>
<h2 class="heading"><span>Setup TLS Connection</span></h2>
</div>
<div class="topnav">
<p>
«&#160;&#160;<a href="configuration.html">Configuration</a>
&#160;&#160;::&#160;&#160;
<a class="uplink" href="index.html">Contents</a>
</p>
</div>
<div class="content">
<div class="section" id="setup-tls-connection">
<h1>Setup TLS Connection<a class="headerlink" href="#setup-tls-connection" title="Permalink to this headline"></a></h1>
<p>If you want to use secure channel to connect OpenFlow switches, you
need to use TLS connection. This document describes how to setup Ryu
to connect to the Open vSwitch over TLS.</p>
<div class="section" id="configuring-a-public-key-infrastructure">
<h2>Configuring a Public Key Infrastructure<a class="headerlink" href="#configuring-a-public-key-infrastructure" title="Permalink to this headline"></a></h2>
<p>If you don&#8217;t have a PKI, the ovs-pki script included with Open vSwitch
can help you. This section is based on the INSTALL.SSL in the Open
vSwitch source code.</p>
<p>NOTE: How to install Open vSwitch isn&#8217;t described in this
document. Please refer to the Open vSwitch documents.</p>
<p>Create a PKI by using ovs-pki script:</p>
<div class="highlight-python"><pre>% ovs-pki init
(Default directory is /usr/local/var/lib/openvswitch/pki)</pre>
</div>
<p>The pki directory consists of controllerca and switchca
subdirectories. Each directory contains CA files.</p>
<p>Create a controller private key and certificate:</p>
<div class="highlight-python"><pre>% ovs-pki req+sign ctl controller</pre>
</div>
<p>ctl-privkey.pem and ctl-cert.pem are generated in the current
directory.</p>
<p>Create a switch private key and certificate:</p>
<div class="highlight-python"><pre>% ovs-pki req+sign sc switch</pre>
</div>
<p>sc-privkey.pem and sc-cert.pem are generated in the current directory.</p>
</div>
<div class="section" id="testing-tls-connection">
<h2>Testing TLS Connection<a class="headerlink" href="#testing-tls-connection" title="Permalink to this headline"></a></h2>
<p>Configuring ovs-vswitchd to use CA files using the ovs-vsctl &#8220;set-ssl&#8221;
command, e.g.:</p>
<div class="highlight-python"><pre>% ovs-vsctl set-ssl sc-privkey.pem sc-cert.pem /usr/local/var/lib/openvswitch/pki/controllerca/cacert.pem
% ovs-vsctl add-br br0
% ovs-vsctl set-controller br0 ssl:127.0.0.1:6633</pre>
</div>
<p>Run Ryu with CA files:</p>
<div class="highlight-python"><pre>% ryu-manager --ctl_privkey ctl-privkey.pem \
--ctl_cert ctl-cert.pem \
--ca_cert /usr/local/var/lib/openvswitch/pki/switchca/cacert.pem \
--verbose</pre>
</div>
<p>You can see something like:</p>
<div class="highlight-python"><pre>loading app ryu.controller.ofp_handler
instantiating app ryu.controller.ofp_handler
connected socket:&lt;SSLSocket fileno=4 sock=127.0.0.1:6633 peer=127.0.0.1:56493&gt; address:('127.0.0.1', 56493)
unhandled event &lt;ryu.controller.dispatcher.EventQueueCreate object at 0x2fdcd90&gt;
hello ev &lt;ryu.controller.ofp_event.EventOFPHello object at 0x2fdce90&gt;
move onto config mode
unhandled event &lt;ryu.controller.dispatcher.EventDispatcherChange object at 0x2fdcfd0&gt;
switch features ev version: 0x1 msg_type 0x6 xid 0xc23353f2 port OFPPhyPort(port_no=65534, hw_addr='\x16\xd8u\xe7[C', name='br0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', config=1, state=1, curr=0, advertised=0, supported=0, peer=0)
move onto main mode
unhandled event &lt;ryu.controller.dispatcher.EventDispatcherChange object at 0x2fdcfd0&gt;</pre>
</div>
</div>
</div>
</div>
<div class="bottomnav">
<p>
«&#160;&#160;<a href="configuration.html">Configuration</a>
&#160;&#160;::&#160;&#160;
<a class="uplink" href="index.html">Contents</a>
</p>
</div>
<div class="footer">
&copy; Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

View File

@@ -8,7 +8,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Using Ryu Network Operating System with OpenStack as OpenFlow controller &mdash; Ryu 1.3 documentation</title>
<title>Using Ryu Network Operating System with OpenStack as OpenFlow controller &mdash; Ryu 1.5 documentation</title>
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
@@ -17,7 +17,7 @@
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '1.3',
VERSION: '1.5',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -27,14 +27,14 @@
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/theme_extras.js"></script>
<link rel="top" title="Ryu 1.3 documentation" href="index.html" />
<link rel="top" title="Ryu 1.5 documentation" href="index.html" />
<link rel="up" title="OpenStack Integration" href="openstack.html" />
<link rel="next" title="Step-by-step example for testing ryu with OpenStack" href="step_by_step.html" />
<link rel="prev" title="OpenStack Integration" href="openstack.html" />
</head>
<body>
<div class="header"><h1 class="heading"><a href="index.html">
<span>Ryu 1.3 documentation</span></a></h1>
<span>Ryu 1.5 documentation</span></a></h1>
<h2 class="heading"><span>Using Ryu Network Operating System with OpenStack as OpenFlow controller</span></h2>
</div>
<div class="topnav">
@@ -386,7 +386,7 @@ setups.</p>
<div class="footer">
&copy; Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

View File

@@ -8,7 +8,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>The First Application &mdash; Ryu 1.3 documentation</title>
<title>The First Application &mdash; Ryu 1.5 documentation</title>
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
@@ -17,7 +17,7 @@
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '1.3',
VERSION: '1.5',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -27,14 +27,14 @@
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/theme_extras.js"></script>
<link rel="top" title="Ryu 1.3 documentation" href="index.html" />
<link rel="top" title="Ryu 1.5 documentation" href="index.html" />
<link rel="up" title="Writing Your Ryu Application" href="developing.html" />
<link rel="next" title="Library" href="library.html" />
<link rel="prev" title="Writing Your Ryu Application" href="developing.html" />
</head>
<body>
<div class="header"><h1 class="heading"><a href="index.html">
<span>Ryu 1.3 documentation</span></a></h1>
<span>Ryu 1.5 documentation</span></a></h1>
<h2 class="heading"><span>The First Application</span></h2>
</div>
<div class="topnav">
@@ -164,7 +164,7 @@ directory.</p>
<div class="footer">
&copy; Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>