-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathopenflow-controller.pl
executable file
·97 lines (71 loc) · 2.13 KB
/
openflow-controller.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#!/usr/bin/perl
use strict;
use warnings;
use OpenFlowFactory;
use Getopt::Mixed;
use IO::Socket::INET;
use IO::Socket::SSL;
use Convert::Binary::C;
use Data::Dumper;
use Data::Hexdumper;
use IO::Select;
Getopt::Mixed::init( 'm=s module>m');
my $of_module;
while (my($option, $value, $pretty) = Getopt::Mixed::nextOption()) {
OPTION: {
$option eq 'm' and do {
$of_module = $value;
last OPTION;
};
}
}
Getopt::Mixed::cleanup();
die "No module loaded speficied by -m\n" unless $of_module;
my $location = "modules/$of_module.pm";
my $of_class = "OpenFlow::Modules::$of_module";
if (-e $location) {
require $location;
} else {
die "$of_module is not a valid module\n";
}
$of_class->new();
my $c = Convert::Binary::C->new( ByteOrder => 'BigEndian',
LongSize => 4,
ShortSize => 2,);
$c->parse_file('openflow.h');
my $serversocket = new IO::Socket::INET (
#$socket = new IO::Socket::SSL (
LocalHost => '127.0.0.1',
LocalPort => '6633',
Proto => 'tcp',
Listen => 5,
Reuse => 1,
Blocking => 1,
SSL_cert_file => '/etc/ssl/certs/ssl-cert-snakeoil.pem',
SSL_key_file => 'ssl-cert-snakeoil.key',
) or die "ERROR in Socket Creation : $!\n";
print "SERVER Waiting for client connection on port 6633\n";
my $sockselect = IO::Select->new();
$sockselect->add($serversocket);
while(1)
{
my ($header, $data);
my ($ready) = IO::Select->select($sockselect, undef, undef);
foreach my $sock (@$ready) {
if ($sock == $serversocket) {
my $a = $serversocket->accept();
$sockselect->add($a);
} else {
$sock->recv($header,8);
my $ofp_header = $c->unpack('ofp_header', $header);
if (!defined $ofp_header->{version}) {
$sockselect->remove($sock);
next;
}
if ($ofp_header->{length} > 8) {
$sock->recv($data,$ofp_header->{length}-8);
}
$of_class->process_packet($sock, $ofp_header, $data);
}
}
}