-
Notifications
You must be signed in to change notification settings - Fork 11
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
パケットからMatchを生成するメソッド #245
Comments
@rumb ありがとうございます。議論のために、いくつか例をもらえますか?
よろしくおねがいします。 |
@yasuhito class Arp
class Request
...
def match (user_options)
options = {
in_port: user_options[ :in_port ] || <指定しない>,
ether_source_address: user_options[ :ether_source_address ] || source_mac || <指定しない>,
ether_destination_address: user_options[ :ether_destination_address ] || destination_mac || <指定しない>,
vlan_vid: user_options[ :vlan_vid ] || vlan_vid || <指定しない>,
...
ether_type: <Arp Request のether type>
}
Match.new( options )
end
...
end
end 書き方が分からない部分は<>内の日本語で表記しております。 Arp::Request.match ( :destination_mac "11:11:11:11:11:11" )
message.match ( :destionation_mac <指定しない> ) 上のような場合は、Arp Requestたる最小限のoptionのみ(ethertype)を指定します。 サンプルの書き換えた例は少し考えますので、しばしお待ちください。 p.s. |
@yasuhito Arp::Request.match ( :destination_mac "11:11:11:11:11:11" ) このような書き方は、1こ2このフローを入れるプログラムをつくる場合に、私のような初学者は分かりやすく簡単でよいと思います(逆にそれ以上のメリットが考えられませんでした)。しかし、 message.match ( :destionation_mac <指定しない> ) こっちの書き方の場合の使い道が思いつかなかったです。 (以下、蛇足です。) def flow_mod(message, port_no)
send_flow_mod_add(
message.datapath_id,
match: ExactMatch.new(message),
actions: SendOutPort.new(port_no)
)
end これを、役割に応じて下記のように任意のレイヤー以下の情報でMatchできると同じいいのではないでしょうか? LaylerMatch.new(message, 2) |
ありがとうございます。たとえば ぼくの理解している限りでは、ポイントは
の 2 つだと思っています。 で、懸念しているのは あと |
@yasuhito 以下が具体的にタプルを列挙した形になります。 Arp::Request.match( destination_mac: '11:11:11:11:11:11')
=> {
ether_destination_address: MAC.new("11:11:11:11:11:11"),
ether_type: EthernetHeader::EtherType::ARP
}
Udp.match( ip_destination: "192.168.0.0/24")
=> {
ether_type: EthernetHeader::EtherType::IPV4,
ip_protocol: ProtocolNumber::UDP,
ip_destination_address: Ipv4Address.new("192.168.0.1/24"),
} packet_in.data
=> {
ether_type: 2048,
ether_source_address: "11:11:11:11:11:11"
ether_destination_address: "22:22:22:22:22:22"
ip_protocol: 17,
ip_source_address: "192.168.1.100",
ip_destination_address "10.0.0.100"
# 一部省略、またアドレス等も実際にはstringではないです。
}
packet_in.match( ip_destination_address: packet_in.data.target_protocol_address.mask(24) )
=> {
ether_type: 2048,
ip_destination_address: "192.168.1.0"
}
packet_in.match( ether_source_address: packet_in.source_mac )
=> {
ether_type: 2048,
ether_source_address: "11:11:11:11:11:11"
} 以下、サンプルの一部を書き換えた例です。 learning_switch / lib / learning_switch.rb def flow_mod(message, port_no)
send_flow_mod_add(
message.datapath_id,
match: message.match( ether_destination_address: packet_in.destination_mac ),
actions: SendOutPort.new(port_no)
)
end 至らぬところがあるとは思いますが、よろしくお願いいたします。 |
だいぶイメージがつかめてきました。良さげですが、この例 ( たとえば、もしここでやっていることを日本語で説明するとすれば、
という 2 段階の処理になります。だから、API としては 1 と 2 のメソッドチェインになるのが自然だと思います。 def flow_mod(packet_in, port_no)
send_flow_mod_add(
packet_in.datapath_id,
match: packet_in.match(ether_destination_address: packet_in.destination_mac),
actions: SendOutPort.new(port_no)
)
end |
こんな感じで、"カジュアル"にMatchのオブジェクト(インスタンス)を作れるありがたいです!!
The text was updated successfully, but these errors were encountered: