FlowForwarding / LINC-Switch

OpenFlow Software Switch written in Erlang
http://flowforwarding.org
Other
213 stars 80 forks source link

Need optimization if there are empty flow tables #214

Open marcsugiyama opened 11 years ago

marcsugiyama commented 11 years ago

If there are no flows configured, each incoming packet checks against every flow table (255 tables) looking for an action. This is a lot of processing for each incoming packet. Some kind of optimization around empty flow tables would be helpful to performance.

sandhyan commented 11 years ago

Can tables be created as needed?

marcsugiyama commented 11 years ago

Examples of overloaded system (snippet of i() output from erl console):

<0.192.0>             linc_us4_port:init/1                  6765 48220871    1
                      gen_server:loop/6                        9              
<0.193.0>             epcap:init/1                          6765  5810189    0
                      gen_server:loop/6                        9              
<0.195.0>             linc_us4_port:init/1              11676964 29871873 3667
                      linc_us4_port:check_port_config/2       16              
<0.217.0>             epcap:init/1                          6765 53658538    0

and

<0.217.0>             linc_us4_port:init/1              93415715 45020075 5383
                      linc_us4_routing:spawn_route/1          11              
<0.227.0>             epcap:init/1                          6765 78780581  644
                      gen_server:handle_common_reply/6         2              
nygge commented 11 years ago

Since 1.3.0 there is no default table-miss entry in the flow tables, instead the controller is supposed to add table-miss entries. If there is no table-miss entry the packet is supposed to be dropped.

From 1.3.2 "If the table-miss flow entry does not exist, by default packets unmatched by flow entries are dropped (discarded). A switch configuration, for example using the OpenFlow Configuration Protocol, may override this default and specify another behavior."

On Mon, Nov 4, 2013 at 6:38 PM, Marc Sugiyama notifications@github.comwrote:

Examples of overloaded system (snippet of i() output from erl console):

              gen_server:loop/6                        9

linc_us4_port:init/1 6765 48220871 1 gen_server:loop/6 9

epcap:init/1 6765 5810189 0 gen_server:loop/6 9

linc_us4_port:init/1 11676964 29871873 3667 linc_us4_port:check_port_config/2 16

epcap:init/1 6765 53658538 0

and

linc_us4_port:init/1 93415715 45020075 5383 linc_us4_routing:spawn_route/1 11

epcap:init/1 6765 78780581 644 gen_server:handle_common_reply/6 2

— Reply to this email directly or view it on GitHubhttps://github.com/FlowForwarding/LINC-Switch/issues/214#issuecomment-27737564 .

legoscia commented 11 years ago

It seems like we are behaving according to the spec - the default configuration for flow tables is drop (see linc_us4_flow:get_table_config), and linc_us4_routing:route only continues to the next flow table if it gets continue.