{"id":1063,"date":"2021-03-16T19:54:39","date_gmt":"2021-03-16T10:54:39","guid":{"rendered":"https:\/\/www.opentone.co.jp\/ot-lab\/?p=1063"},"modified":"2025-05-12T10:06:19","modified_gmt":"2025-05-12T01:06:19","slug":"opendaylight","status":"publish","type":"post","link":"https:\/\/www.opentone.co.jp\/ot-lab\/all\/web-system\/opendaylight","title":{"rendered":"OpenDaylight\u30b5\u30f3\u30d7\u30eb\u30bd\u30fc\u30b9\u306e\u89e3\u8aac"},"content":{"rendered":"\n<p>\u3053\u3093\u306b\u3061\u306f<\/p>\n\n\n\n<p>\u4eca\u56de\u306fSDN\u30b7\u30ea\u30fc\u30ba\u306e\u56db\u56de\u76ee\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p><a href=\"http:\/\/labs.opentone.co.jp\/?p=4969\">\u4e00\u56de\u76ee<\/a>\u306f\u3001SDN\u3068\u306f\u4f55\u306a\u306e\u304b\u3092\u7c21\u5358\u306a\u5fdc\u7528\u4f8b\u3092\u793a\u3057\u3066\u8aac\u660e\u3057\u307e\u3057\u305f\u3002<br><a href=\"http:\/\/labs.opentone.co.jp\/?p=5244\">\u4e8c\u56de\u76ee<\/a>\u306f\u3001OpenDaylight\u3068\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3068\u3001Mininet\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u304a\u3088\u3073OpenDaylight\u3078\u306e\u63a5\u7d9a\u3068\u758e\u901a\u78ba\u8a8d\u307e\u3067\u5b9f\u65bd\u3057\u307e\u3057\u305f\u3002<br>\u307e\u305f\u3001<a href=\"http:\/\/labs.opentone.co.jp\/?p=5570\">\u524d\u56de<\/a>\u306fOpenDaylight\u306e\u30b5\u30f3\u30d7\u30eb\u30a2\u30d7\u30ea\u306e\u30d3\u30eb\u30c9\u3068\u3001\u305d\u306e\u30a2\u30d7\u30ea\u3092\u7528\u3044\u3066Mininet\u4e0a\u306b\u4f5c\u6210\u3057\u305f\u30b9\u30a4\u30c3\u30c1\u306e\u5236\u5fa1\u3092\u5b9f\u884c\u3057\u3066\u307f\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u4eca\u56de\u306f\u524d\u56de\u30d3\u30eb\u30c9\u3057\u305f\u30b5\u30f3\u30d7\u30eb\u30a2\u30d7\u30ea\u306e\u89e3\u8aac\u3092\u3057\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002<br>\uff08\u9577\u304f\u306a\u3063\u305f\u306e\u3067\u3001Mininet\u30b3\u30de\u30f3\u30c9\u306e\u89e3\u8aac\u306f\u6b21\u56de\u306b\u3055\u305b\u3066\u3044\u305f\u3060\u304d\u307e\u3059\u3002\u7533\u3057\u8a33\u3042\u308a\u307e\u305b\u3093\u3002\uff09<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">OpenDaylight\u306e\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3<\/h1>\n\n\n\n<p>\u307e\u305a\u306fOpenDaylight\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3\u306e\u89e3\u8aac\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u4ee5\u4e0b\u306e\u56f3\u306f<a href=\"http:\/\/labs.opentone.co.jp\/?p=5244\">\u4e8c\u56de\u76ee<\/a>\u3067\u7d39\u4ecb\u3057\u305f\u56f3\u3067\u3059\u304c\u3001\u307e\u305a\u3053\u306e\u3046\u3061&#8221;Base Network Service Functions&#8221;\u3001SAL(Service Abstraction Layer)\u3001\u304a\u3088\u3073OpenFlow\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image alignnone size-large\"><img decoding=\"async\" src=\"https:\/\/www.opentone.co.jp\/cd95765c-4746-4485-8316-b02c4b4596c8\" alt=\"\u56f31\" class=\"wp-image-5842\" \/><figcaption>\u56f31\uff08\u51fa\u5178:<a href=\"http:\/\/www.opendaylight.org\/project\/technical-overview\">Technical Overview | OpenDaylight<\/a>\uff09<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Base Network Service Functions<\/h2>\n\n\n\n<p>\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u4e0a\u306e\u30c7\u30d0\u30a4\u30b9\u60c5\u5831\u3092\u53ce\u96c6\u3059\u308b\u305f\u3081\u306e\u30b5\u30fc\u30d3\u30b9\u7fa4\u3067\u3059\u3002<br>\u4ee5\u4e0b\u3001\u5404\u30d0\u30f3\u30c9\u30eb\u306e\u89e3\u8aac\u3067\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>\u30d0\u30f3\u30c9\u30eb<\/td><td>API<\/td><td>\u8aac\u660e<\/td><\/tr><tr><td>ARP Handler<\/td><td>IHostFinder<\/td><td>ARP\u3092\u51e6\u7406\u3057\u3066\u30db\u30b9\u30c8\u306e\u5834\u6240\u3092\u5b66\u7fd2\u3059\u308b<\/td><\/tr><tr><td>Host Tracker<\/td><td>IflptoHost<\/td><td>SDN\u4e0a\u3067\u30db\u30b9\u30c8\u306e\u76f8\u5bfe\u7684\u306a\u5834\u6240\u3092\u8ffd\u8de1\u3059\u308b<\/td><\/tr><tr><td>Switch Manager<\/td><td>ISwitchManager<\/td><td>\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u5185\u306e\u3059\u3079\u3066\u306e\u30b9\u30a4\u30c3\u30c1\u306e\u30ea\u30b9\u30c8\u3092\u4fdd\u6301\u3059\u308b<\/td><\/tr><tr><td>Topology Manager<\/td><td>ITopologyManager<\/td><td>\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u5168\u4f53\u306e\u30c8\u30dd\u30ed\u30b8\u3092\u4fdd\u6301\u3059\u308b<\/td><\/tr><tr><td>Stats Manager<\/td><td>IStatisticsManager<\/td><td>IReadService\u3092\u5229\u7528\u3057\u3066\u7d71\u8a08\u60c5\u5831\u3092\u53ce\u96c6\u3059\u308b<\/td><\/tr><tr><td>FRM<\/td><td>IForwardingRulesManager<\/td><td>\u30d5\u30ed\u30fc\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u203b<\/td><\/tr><tr><td>User Manager<\/td><td>IUserManager<\/td><td>\u30e6\u30fc\u30b6\u7ba1\u7406\u3092\u62c5\u3046<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>\u203b<a href=\"https:\/\/github.com\/lbchen\/ODL\/blob\/master\/opendaylight\/forwardingrulesmanager\/api\/src\/main\/java\/org\/opendaylight\/controller\/forwardingrulesmanager\/IForwardingRulesManager.java\">\u30bd\u30fc\u30b9<\/a>\u4e0a\u306e\u30b3\u30e1\u30f3\u30c8\u3088\u308a\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">SAL(Service Abstraction Layer)<\/h2>\n\n\n\n<p>SDN\u5bfe\u5fdc\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u6a5f\u5668\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u305f\u3081\u306eAPI\u3067\u3059\u3002<br>\u4ee5\u4e0b\u3001\u5404\u30af\u30e9\u30b9\u306e\u89e3\u8aac\u3067\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>Class<\/td><td>\u8aac\u660e<\/td><\/tr><tr><td>Action<\/td><td>OpenFlow\u306e\u30d5\u30ed\u30fc\u30a8\u30f3\u30c8\u30ea\u306b\u8a2d\u5b9a\u3059\u308b\u30a2\u30af\u30b7\u30e7\u30f3<\/td><\/tr><tr><td>Match<\/td><td>OpenFlow\u306e\u30d5\u30ed\u30fc\u30a8\u30f3\u30c8\u30ea\u306b\u8a2d\u5b9a\u3059\u308b\u30de\u30c3\u30c1\u30f3\u30b0\u30eb\u30fc\u30eb<\/td><\/tr><tr><td>IFlowProgrammerService<\/td><td>\u30b9\u30a4\u30c3\u30c1\u306b\u5bfe\u3057\u3066\u30d5\u30ed\u30fc\u30a8\u30f3\u30c8\u30ea\u306e\u8ffd\u52a0\u66f4\u65b0\u524a\u9664\u3092\u884c\u3046<\/td><\/tr><tr><td>IDataPacketService<\/td><td>\u30d1\u30b1\u30c3\u30c8\u64cd\u4f5c\u306e\u305f\u3081\u306e\u30b5\u30fc\u30d3\u30b9<br>OpenFlow\u306eForward\u30a2\u30af\u30b7\u30e7\u30f3\u3092\u767a\u884c\u3059\u308b<\/td><\/tr><tr><td>IReadService<\/td><td>\u30b9\u30a4\u30c3\u30c1\u306e\u30d5\u30ed\u30fc\/\u30dd\u30fc\u30c8\/\u30ad\u30e5\u30fc\u306e\u30d3\u30e5\u30fc\u3092\u53d6\u5f97\u3059\u308b<\/td><\/tr><tr><td>ITopologyService<\/td><td>\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u4e0a\u3067\u65b0\u3057\u3044\u30ce\u30fc\u30c9\u3084\u30ea\u30f3\u30af\u306a\u3069\u3092\u691c\u51fa\u3057\u305f\u5834\u5408\u306b\u3001\u305d\u306e\u60c5\u5831\u3092\u4f1d\u3048\u308b<\/td><\/tr><tr><td>IDataPacketService<\/td><td>\u30d1\u30b1\u30c3\u30c8\u30c7\u30b3\u30fc\u30c9\u7b49\u3001\u30d1\u30b1\u30c3\u30c8\u64cd\u4f5c\u3092\u884c\u3046<\/td><\/tr><tr><td>IListenDataPacket<\/td><td>\u30d1\u30b1\u30c3\u30c8\u51e6\u7406\u306e\u305f\u3081\u306e\u30af\u30e9\u30b9<br>\u3053\u306e\u30af\u30e9\u30b9\u3092\u7d99\u627f\u3057\u3066\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30af\u30e9\u30b9\u3092\u4f5c\u6210\u3059\u308b<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">OpenFlow<\/h2>\n\n\n\n<p><a href=\"http:\/\/labs.opentone.co.jp\/?p=5570\">\u524d\u56de<\/a>\u306fMininet\u4e0a\u306b\u4eee\u60f3\u7684\u306a\u30b9\u30a4\u30c3\u30c1\u3068\u30db\u30b9\u30c8\u3092\u4f5c\u6210\u3057\u3066\u3001OpenDaylight\u4f7f\u3063\u3066\u305d\u306e\u30b9\u30a4\u30c3\u30c1\u3092\u5236\u5fa1\u3059\u308b\u65b9\u6cd5\u3092\u793a\u3057\u307e\u3057\u305f\u3002<br><a href=\"http:\/\/labs.opentone.co.jp\/?p=5244\">\u4e8c\u56de\u76ee<\/a>\u306e\u8a18\u4e8b\u3067\u7d39\u4ecb\u3057\u305f\u3088\u3046\u306b\u3001Mininet\u306fOpenFlow\u5bfe\u5fdc\u306e\u4eee\u60f3\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u30c7\u30d0\u30a4\u30b9\u3092\u751f\u6210\u3059\u308b\u30c4\u30fc\u30eb\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u5f93\u3063\u3066\u3001<a href=\"http:\/\/labs.opentone.co.jp\/?p=5570\">\u524d\u56de<\/a>\u30d3\u30eb\u30c9\u3057\u305fController\u30a2\u30d7\u30ea\u3082OpenFlow\u30a2\u30d7\u30ea\u306b\u306a\u308a\u307e\u3059\u306e\u3067\u3001\u3053\u3053\u3067OpenFlow\u306e\u89e3\u8aac\u3092\u3057\u3066\u304a\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>OpenFlow\u3068OpenDaylight\u306e\u95a2\u4fc2\u306f\u3001\u56f31\u306e\u5de6\u4e0b\u306b\u8a18\u8f09\u3055\u308c\u3066\u3044\u308b\u3088\u3046\u306b\u3001OpenDaylight\u3067\u30b5\u30dd\u30fc\u30c8\u3057\u3066\u3044\u308b\u30d7\u30ed\u30c8\u30b3\u30eb\u306e1\u3064\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>OpenFlow\u306e\u8a73\u7d30\u306b\u3064\u3044\u3066\u306f\u3001\u591a\u304f\u306e\u65e5\u672c\u8a9e\u30b5\u30a4\u30c8\u304c\u3042\u308a\u307e\u3059\u306e\u3067\u3001\u305d\u3061\u3089\u3067\u3054\u78ba\u8a8d\u9858\u3044\u307e\u3059\u3002<br>\u3053\u3053\u3067\u306f\u3001\u30b5\u30f3\u30d7\u30eb\u30a2\u30d7\u30ea\u306e\u8aac\u660e\u306e\u305f\u3081\u3001OpenFlow\u306b\u3064\u3044\u3066\u306f\u4ee5\u4e0b\u306e\u70b9\u306e\u307f\u6291\u3048\u3066\u304a\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\u30d1\u30b1\u30c3\u30c8\u306e\u5236\u5fa1\u306f\u3001\u30d8\u30c3\u30c0\u30d5\u30a3\u30fc\u30eb\u30c9\u306e\u30de\u30c3\u30c1\u30f3\u30b0\u30eb\u30fc\u30eb\u3068\u30a2\u30af\u30b7\u30e7\u30f3\u3067\u5b9f\u65bd\u3059\u308b\u3002<br>\u203b\u3053\u3053\u306e\u30de\u30c3\u30c1\u30f3\u30b0\u30eb\u30fc\u30eb\u3068\u30a2\u30af\u30b7\u30e7\u30f3\u3092\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3059\u308bOpenDaylight\u306e\u30af\u30e9\u30b9\u304c\u3001\u88682\u306eMatch\u3068Action\u3067\u3059\u3002<\/li><li>\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u3068\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u6a5f\u5668\u306e\u9593\u3067\u306f\u3001\u30d1\u30b1\u30c3\u30c8\u306e\u5236\u5fa1\u60c5\u5831\u3092\u30e1\u30c3\u30bb\u30fc\u30b8\uff08OpenFlow\u30e1\u30c3\u30bb\u30fc\u30b8\uff09\u306b\u3088\u3063\u3066\u3084\u308a\u53d6\u308a\u3059\u308b\u3002<\/li><\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">\u30b5\u30f3\u30d7\u30eb\u30a2\u30d7\u30ea(<a href=\"https:\/\/github.com\/sdnhub\/SDNHub_Opendaylight_Tutorial\">tutorial_L2_forwarding<\/a>)<\/h1>\n\n\n\n<p>\u4e0a\u8a18\u306eOpenDaylight\u306e\u30b5\u30fc\u30d3\u30b9\u7fa4\u3084\u30af\u30e9\u30b9\u304a\u3088\u3073OpenFlow\u306b\u5bfe\u3059\u308b\u8aac\u660e\u3092\u8e0f\u307e\u3048\u3066\u3001\u30b5\u30f3\u30d7\u30eb\u30a2\u30d7\u30ea\u306e\u89e3\u8aac\u3092\u3057\u3066\u3044\u304d\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002<br>\u7c21\u5358\u306a\u6d41\u308c\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002\u203b\u3053\u308c\u306f\u3001Learning Switch\u306e\u52d5\u4f5c\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>\u30b9\u30a4\u30c3\u30c1\u304b\u3089\u306ePacket-in\u53d7\u4fe1\u3092\u5951\u6a5f\u3068\u3057\u3066\u51e6\u7406\u958b\u59cb<\/li><li>\u53d7\u4fe1\u30d1\u30b1\u30c3\u30c8\u304b\u3089\u4ee5\u4e0b\u306e\u60c5\u5831\u3092\u53d6\u5f97<ol><li>\u9001\u4fe1\u5143MAC\u30a2\u30c9\u30ec\u30b9<\/li><li>\u9001\u4fe1\u5143\u30dd\u30fc\u30c8\u756a\u53f7<\/li><li>\u5b9b\u5148MAC\u30a2\u30c9\u30ec\u30b9<\/li><\/ol><\/li><li>\u53d6\u5f97\u3057\u305f\u9001\u4fe1\u5143MAC\u30a2\u30c9\u30ec\u30b9\u3068\u9001\u4fe1\u5143\u30dd\u30fc\u30c8\u756a\u53f7\u306e\u5bfe\u3092HashMap\u306b\u683c\u7d0d<\/li><li>\u5b9b\u5148MAC\u30a2\u30c9\u30ec\u30b9\u3092\u5143\u306bHashMap\u304b\u3089\u5b9b\u5148\u30dd\u30fc\u30c8\u756a\u53f7\u3092\u53d6\u5f97<ol><li>\u53d6\u5f97\u3067\u304d\u306a\u304b\u3063\u305f\u5834\u5408<br>\u53d7\u4fe1\u5143\u30dd\u30fc\u30c8\u756a\u53f7\u4ee5\u5916\u306e\u3059\u3079\u3066\u306e\u30dd\u30fc\u30c8\u306b\u30d1\u30b1\u30c3\u30c8\u3092\u9001\u4fe1(floodPacket)<\/li><li>\u53d6\u5f97\u3067\u304d\u305f\u5834\u5408<ol><li>\u9001\u4fe1\u5143\u30dd\u30fc\u30c8\u756a\u53f7\u3068\u5b9b\u5148MAC\u30a2\u30c9\u30ec\u30b9\u3092\u305d\u308c\u305e\u308cMatch\u30ea\u30b9\u30c8\u306b\u8ffd\u52a0<\/li><li>\u53d6\u5f97\u3067\u304d\u305f\u9001\u4fe1\u5148\u30dd\u30fc\u30c8\u756a\u53f7\u304b\u3089\u30d1\u30b1\u30c3\u30c8\u3092\u9001\u51fa\u3059\u308b\u30a2\u30af\u30b7\u30e7\u30f3\u3092Action\u306b\u767b\u9332<\/li><li>\u4e0a\u8a18\u306eMatch\u30ea\u30b9\u30c8\u3068Action\u3092\u30d5\u30ed\u30fc\u30a8\u30f3\u30c8\u30ea\u306b\u8ffd\u52a0<\/li><li>\u53d6\u5f97\u3057\u305f\u30dd\u30fc\u30c8\u756a\u53f7\u306e\u30dd\u30fc\u30c8\u306b\u5bfe\u3057\u3066\u30d1\u30b1\u30c3\u30c8\u3092\u9001\u51fa<\/li><\/ol><\/li><\/ol><\/li><\/ol>\n\n\n\n<p>\u3053\u306e\u30b5\u30f3\u30d7\u30eb\u30a2\u30d7\u30ea\u306f\u3001TutorialL2Forwarding.java\u3001\u304a\u3088\u3073Activator.java\u306e\u4e8c\u3064\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304b\u3089\u6210\u308a\u7acb\u3063\u3066\u3044\u307e\u3059\u3002<br>\u3053\u306e\u3046\u3061\u3001Activator.java\u306fOSGi\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3092\u4f7f\u7528\u3057\u305f\u30d0\u30f3\u30c9\u30eb\u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30bf\u3067\u3001\u672c\u4f53\u306fTutorialL2Forwarding.java\u306b\u8a18\u8ff0\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4ee5\u4e0b\u3001\u30bd\u30fc\u30b9\u306e\u89e3\u8aac\u3067\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">TutorialL2Forwarding.java<\/h2>\n\n\n\n<p>\u306f\u3058\u3081\u306b\u524d\u63d0\u3068\u3057\u3066\u4ee5\u4e0b\u306e\u884c\u3092\u66f8\u304d\u63db\u3048\u307e\u3059\u3002\u203b\u3053\u308c\u3092\u3057\u306a\u3044\u3068\u3001\u30b5\u30f3\u30d7\u30eb\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u306f\u5358\u306a\u308bRepeater Hub\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[java firstline=\"74\"]private String function = \"hub\";[\/java]<\/pre>\n\n\n\n<p>\u2193<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[java firstline=\"74\"]private String function = \"switch\";[\/java]<\/pre>\n\n\n\n<p>\u3053\u306e\u30af\u30e9\u30b9\u306fSouthbound API\u304b\u3089\u30d1\u30b1\u30c3\u30c8\u3092\u53d6\u5f97\u3059\u308b\u305f\u3081\u306b\u5fc5\u8981\u306aOpenDaylight\u306eIListenDataPacket\u30af\u30e9\u30b9\u3092\u7d99\u627f\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\uff08List1\uff09<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[java firstline=\"67\"]\npublic class TutorialL2Forwarding implements IListenDataPacket {\n[\/java]<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">1.Packet-in<\/h3>\n\n\n\n<p>IListenDataPacket\u30af\u30e9\u30b9\u306ereceiveDataPacket\u30e1\u30bd\u30c3\u30c9\u3092\u30aa\u30fc\u30d0\u30fc\u30e9\u30a4\u30c9\u3059\u308b\u3053\u3068\u306b\u3088\u308a\u3001\u30d1\u30b1\u30c3\u30c8\u306e\u30b3\u30d4\u30fc\u3092\u53d6\u5f97\u3057\u307e\u3059\uff08List2 182\u884c\u76ee\uff09\u3002<br>\u3053\u306e\u30e1\u30bd\u30c3\u30c9\u306fOpenFlow\u306ePacket-in\u30a4\u30d9\u30f3\u30c8\u304c\u767a\u751f\u3059\u308b\u3068\u547c\u3073\u51fa\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.\u9001\u4fe1\u5143\u63a5\u7d9a\u30dd\u30fc\u30c8\u62bd\u51fa\u3001\u53d7\u4fe1\u30d1\u30b1\u30c3\u30c8\u5fa9\u53f7<\/h3>\n\n\n\n<p>receiveDataPacket\u30e1\u30bd\u30c3\u30c9\u306e\u5f15\u6570\u3068\u3057\u3066\u6e21\u3055\u308c\u305fRawPacket\u306egetIncomingNodeConnector\u30e1\u30bd\u30c3\u30c9\u3092\u7528\u3044\u3066\u9001\u4fe1\u5143\u63a5\u7d9a\u30dd\u30fc\u30c8\u3092\u62bd\u51fa\u3057\u307e\u3059\u3002\uff08List2 187\u884c\u76ee\uff09<br>\u6b21\u306b\u3001dataPacketService\u3092\u4f7f\u7528\u3057\u3066\u30d1\u30b1\u30c3\u30c8\u3092\u5fa9\u53f7\u3057\u3001\u30d1\u30b1\u30c3\u30c8\u306e\u5404\u30d5\u30a3\u30fc\u30eb\u30c9\u3078\u30a2\u30af\u30bb\u30b9\u3059\u308b\u305f\u3081\u306b\u3001org.opendaylight.controller.sal.packet.IDataPacketService\u30af\u30e9\u30b9\u306edecodeDataPacket\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u3001Packet\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306b\u5909\u63db\u3057\u307e\u3059\u3002\uff08List2 193\u884c\u76ee\uff09<\/p>\n\n\n\n<p>\uff08List2\uff09<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[java firstline=\"181\" highlight=\"182,187,193,198,200,202,204,205,209,212\"]\n@Override\npublic PacketResult receiveDataPacket(RawPacket inPkt) {\n\tif (inPkt == null) {\n\t\treturn PacketResult.IGNORED;\n\t}\n\n\tNodeConnector incoming_connector = inPkt.getIncomingNodeConnector();\n\n\t\/\/ Hub implementation\n\tif (function.equals(\"hub\")) {\n\t\tfloodPacket(inPkt);\n\t} else {\n\t\tPacket formattedPak = this.dataPacketService.decodeDataPacket(inPkt);\n\t\tif (!(formattedPak instanceof Ethernet)) {\n\t\t\treturn PacketResult.IGNORED;\n\t\t}\n\n\t\tlearnSourceMAC(formattedPak, incoming_connector);\n\t\tNodeConnector outgoing_connector =\n\t\t\tknowDestinationMAC(formattedPak);\n\t\tif (outgoing_connector == null) {\n\t\t\tfloodPacket(inPkt);\n\t\t} else {\n\t\t\tif (!programFlow(formattedPak, incoming_connector,\n\t\t\t\t\t\toutgoing_connector)) {\n\t\t\t\treturn PacketResult.IGNORED;\n\t\t\t}\n\t\t\tinPkt.setOutgoingNodeConnector(outgoing_connector);\n\t\t\tthis.dataPacketService.transmitDataPacket(inPkt);\n\t\t}\n\t}\n\treturn PacketResult.CONSUME;\n}\n[\/java]<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3.\u9001\u4fe1\u5143\u60c5\u5831\u306e\u53d6\u5f97<\/h3>\n\n\n\n<p>learnSourceMAC\u30ed\u30fc\u30ab\u30eb\u30e1\u30bd\u30c3\u30c9\u3067MAC\u30a2\u30c9\u30ec\u30b9\u3068\u5165\u529b\u30dd\u30fc\u30c8\u306e\u5bfe\u3092HashMap\u306b\u683c\u7d0d\u3059\u308b\u3002\uff08List2 198\u884c\u76ee\u3001List3 215-218\u884c\u76ee\uff09<br>\u5fa9\u53f7\u3057\u305f\u30d1\u30b1\u30c3\u30c8\u304b\u3089org.opendaylight.controller.sal.packet.Ethernet\u30af\u30e9\u30b9\u306egetSourceMACAddress\u30e1\u30bd\u30c3\u30c9\u3068org.opendaylight.controller.sal.packet.BitBufferHelper\u306etoNumber\u30e1\u30bd\u30c3\u30c9\u3092\u7528\u3044\u3066\u9001\u4fe1\u5143MAC\u30a2\u30c9\u30ec\u30b9\u3092\u53d6\u308a\u51fa\u3059\u3002\uff08216\u3001217\u884c\u76ee\uff09<br>\u9001\u4fe1\u5143MAC\u30a2\u30c9\u30ec\u30b9\u3068\u9001\u4fe1\u5143\u63a5\u7d9a\u30dd\u30fc\u30c8\u306e\u5bfe\u3092HashMap\u306b\u683c\u7d0d\u3002\uff08218\u884c\u76ee\uff09<\/p>\n\n\n\n<p>\uff08List3\uff09<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[java firstline=\"215\"]\nprivate void learnSourceMAC(Packet formattedPak, NodeConnector incoming_connector) {\nbyte[] srcMAC = ((Ethernet)formattedPak).getSourceMACAddress();\n\tlong srcMAC_val = BitBufferHelper.toNumber(srcMAC);\n\tthis.mac_to_port.put(srcMAC_val, incoming_connector);\n}\n[\/java]<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">4.\u5b9b\u5148MAC\u30a2\u30c9\u30ec\u30b9\u53d6\u5f97\u3001\u63a5\u7d9a\u30dd\u30fc\u30c8\u5224\u5b9a<\/h3>\n\n\n\n<p>knowDestinationMAC\u30ed\u30fc\u30ab\u30eb\u30e1\u30bd\u30c3\u30c9\u3067\u5185\u90e8\u306eHashMap\u304b\u3089\u5b9b\u5148MAC\u30a2\u30c9\u30ec\u30b9\u3092\u53d6\u308a\u51fa\u3059\u3002\uff08List2 200\u884c\u76ee\uff09org.opendaylight.controller.sal.packet.Ethernet\u30af\u30e9\u30b9\u306egetDestinationMACAddress\u30e1\u30bd\u30c3\u30c9\u3067\u5b9b\u5148MAC\u30a2\u30c9\u30ec\u30b9\u3092\u53d6\u308a\u51fa\u3059\u3002\uff08222\u3001223\u884c\u76ee\uff09<br>\u53d6\u308a\u51fa\u3057\u305f\u5b9b\u5148MAC\u30a2\u30c9\u30ec\u30b9\u306e\u63a5\u7d9a\u30dd\u30fc\u30c8\u3092\u8fd4\u5374\u3002\uff08224\u884c\u76ee\uff09<\/p>\n\n\n\n<p>\uff08List4\uff09<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[java firstline=\"221\"]\nprivate NodeConnector knowDestinationMAC(Packet formattedPak) {\n\tbyte[] dstMAC = ((Ethernet)formattedPak).getDestinationMACAddress();\n\tlong dstMAC_val = BitBufferHelper.toNumber(dstMAC);\n\treturn this.mac_to_port.get(dstMAC_val) ;\n}\n[\/java]<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">5.foodPacket<\/h3>\n\n\n\n<p>List4&nbsp;knowDestinationMAC\u30ed\u30fc\u30ab\u30eb\u30e1\u30bd\u30c3\u30c9\u306e\u623b\u308a\u5024\u3067\u5b9b\u5148MAC\u30a2\u30c9\u30ec\u30b9\u306e\u63a5\u7d9a\u30dd\u30fc\u30c8\u304c\u53d6\u5f97\u3067\u304d\u306a\u304b\u3063\u305f\u5834\u5408\u3001<br>\uff08\u5b9b\u5148MAC\u30a2\u30c9\u30ec\u30b9\u306e\u63a5\u7d9a\u30dd\u30fc\u30c8\u3092\u5b66\u7fd2\u3057\u3066\u3044\u306a\u304b\u3063\u305f\u5834\u5408\uff09\u306ffloodPacket\u30ed\u30fc\u30ab\u30eb\u30e1\u30bd\u30c3\u30c9\u3067\u9001\u4fe1\u5143\u4ee5\u5916\u306e\u3059\u3079\u3066\u306e\u30dd\u30fc\u30c8\u3078\u30d1\u30b1\u30c3\u30c8\u3092\u9001\u51fa\u3059\u308b\u3002\uff08List2 202\u884c\u76ee\uff09<br>floodPacket\u30ed\u30fc\u30ab\u30eb\u30e1\u30bd\u30c3\u30c9\u3067\u306f\u3001ISwitchManager\u30af\u30e9\u30b9\u306egetUpNodeConnectors\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u30b9\u30a4\u30c3\u30c1\u5185\u306e\u3059\u3079\u3066\u306e\u30dd\u30fc\u30c8\u3092\u62bd\u51fa\uff08List5 163\u3001164\u884c\u76ee\uff09\u3057\u3001\u62bd\u51fa\u3057\u305f\u30dd\u30fc\u30c8\u306e\u6570\u5206\uff08\u9001\u4fe1\u5143\u30dd\u30fc\u30c8\u3092\u9664\u304f\uff09IDataPacketService\u30af\u30e9\u30b9\u306etransmitDataPacket\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u30d1\u30b1\u30c3\u30c8\u3092\u9001\u51fa\u3059\u308b\u3002\uff08List5 171\u884c\u76ee\uff09<\/p>\n\n\n\n<p>\uff08List5\uff09<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[java firstline=\"159\" highlight=\"163,164,171\"]\nprivate void floodPacket(RawPacket inPkt) {\n\tNodeConnector incoming_connector = inPkt.getIncomingNodeConnector();\n\tNode incoming_node = incoming_connector.getNode();\n\n\tSet&lt;NodeConnector&gt; nodeConnectors =\n\t\t\t\tthis.switchManager.getUpNodeConnectors(incoming_node);\n\n\tfor (NodeConnector p : nodeConnectors) {\n\t\tif (!p.equals(incoming_connector)) {\n\t\t\ttry {\n\t\t\t\tRawPacket destPkt = new RawPacket(inPkt);\n\t\t\t\tdestPkt.setOutgoingNodeConnector(p);\n\t\t\t\tthis.dataPacketService.transmitDataPacket(destPkt);\n\t\t\t} catch (ConstructionException e2) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t}\n}\n[\/java]<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">6.\u30d5\u30ed\u30fc\u30a8\u30f3\u30c8\u30ea\u7d44\u307f\u7acb\u3066\u3001\u30d5\u30ed\u30fc\u30c6\u30fc\u30d6\u30eb\u66f8\u8fbc<\/h3>\n\n\n\n<p>\u5b9b\u5148MAC\u30a2\u30c9\u30ec\u30b9\u306e\u63a5\u7d9a\u30dd\u30fc\u30c8\u304c\u53d6\u5f97\u3067\u304d\u305f\u5834\u5408\u3001programFlow\u30ed\u30fc\u30ab\u30eb\u30e1\u30bd\u30c3\u30c9\u3092\u547c\u3073\u51fa\u3057\u3001\u30d5\u30ed\u30fc\u30a8\u30f3\u30c8\u30ea\u306e\u7d44\u307f\u7acb\u3066\u3068\u30b9\u30a4\u30c3\u30c1\u3078\u306e\u767b\u9332\u3092\u884c\u3046\u3002\uff08List2 204\u3001205\u884c\u76ee\uff09<br>programFlow\u30ed\u30fc\u30ab\u30eb\u30e1\u30bd\u30c3\u30c9\u3067\u306f\u3001Match\u30af\u30e9\u30b9\u3092\u4f7f\u7528\u3057\u3066\u3001\u30de\u30c3\u30c1\u30f3\u30b0\u30eb\u30fc\u30eb\u3092\u4f5c\u6210\u3002\uff08List6 232-234\u884c\u76ee\uff09<br>\u3053\u3053\u3067\u306f\u3001\u5165\u529b\u30dd\u30fc\u30c8\u304c\u4eca\u56de\u306e\u9001\u4fe1\u5143\u30dd\u30fc\u30c8\u3067\u3042\u308b\u3053\u3068\uff08List6 233\u884c\u76ee\uff09\u3068\u3001\u5b9b\u5148MAC\u30a2\u30c9\u30ec\u30b9\u304c\u4eca\u56de\u306e\u5b9b\u5148MAC\u30a2\u30c9\u30ec\u30b9\u3067\u3042\u308b\u3053\u3068\uff08List6 234\u884c\u76ee\uff09\u3068\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\uff08List6\uff09<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[java firstline=\"227\" highlight=\"232-234,237,239,244\"]\nprivate boolean programFlow(Packet formattedPak,\n\t\t\tNodeConnector incoming_connector,\n\t\t\tNodeConnector outgoing_connector) {\n\tbyte[] dstMAC = ((Ethernet)formattedPak).getDestinationMACAddress();\n\n\tMatch match = new Match();\n\tmatch.setField( new MatchField(MatchType.IN_PORT, incoming_connector) );\n\tmatch.setField( new MatchField(MatchType.DL_DST, dstMAC.clone()) );\n\n\tList&lt;Action&gt; actions = new ArrayList&lt;Action&gt;();\n\tactions.add(new Output(outgoing_connector));\n\n\tFlow f = new Flow(match, actions);\n\tf.setIdleTimeout((short)5);\n\n\t\/\/ Modify the flow on the network node\n\tNode incoming_node = incoming_connector.getNode();\n\tStatus status = programmer.addFlow(incoming_node, f);\n\n\tif (!status.isSuccess()) {\n\t\tlogger.warn(\"SDN Plugin failed to program the flow: {}. The failure is: {}\",\n\t\t\t\t\tf, status.getDescription());\n\t\treturn false;\n\t} else {\n\t\treturn true;\n\t}\n}\n[\/java]<\/pre>\n\n\n\n<p>\u6b21\u306b\u3001\u30a2\u30af\u30b7\u30e7\u30f3\u306e\u4f5c\u6210\u3092\u3057\u307e\u3059\u3002<br>\u3053\u3053\u3067\u306f\u4eca\u56de\u306e\u5b9b\u5148\u30dd\u30fc\u30c8\u304b\u3089\u30d1\u30b1\u30c3\u30c8\u3092\u9001\u51fa\u3059\u308b\u30eb\u30fc\u30eb\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002\uff08List6 237\u884c\u76ee\uff09<br>\u3053\u308c\u3089\u30de\u30c3\u30c1\u30f3\u30b0\u30eb\u30fc\u30eb\u3068\u30a2\u30af\u30b7\u30e7\u30f3\u3092Flow\u30af\u30e9\u30b9\u306b\u683c\u7d0d\uff08List6 239\u884c\u76ee\uff09\u3057\u3001IFlowProgrammerService\u30af\u30e9\u30b9\u306eaddFlow\u30e1\u30bd\u30c3\u30c9\u306b\u6e21\u3057\u3066\u5b9f\u969b\u306b\u30b9\u30a4\u30c3\u30c1\u306b\u30d5\u30ed\u30fc\u30a8\u30f3\u30c8\u30ea\u3092\u633f\u5165\u3057\u3066\u3044\u307e\u3059\u3002\uff08List6 244\u884c\u76ee\uff09<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">7.\u30d1\u30b1\u30c3\u30c8\u9001\u51fa<\/h3>\n\n\n\n<p>\u30d5\u30ed\u30fc\u30a8\u30f3\u30c8\u30ea\u306e\u633f\u5165\u306b\u6210\u529f\u3057\u305f\u3089\u3001\u5165\u529b\u30d1\u30b1\u30c3\u30c8\u3092\u51fa\u529b\u30dd\u30fc\u30c8\u304b\u3089\u9001\u51fa\u3057\u307e\u3059\u3002\uff08List2 209\u884c\u76ee\uff09<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">8.\u51e6\u7406\u7d42\u4e86<\/h3>\n\n\n\n<p>\u6700\u5f8c\u306b\u30d1\u30b1\u30c3\u30c8\u304c\u6b63\u5e38\u306b\u51e6\u7406\u3055\u308c\u305f\u3053\u3068\u3092\u793a\u3059PacketResult.CONSUME\u3092\u8fd4\u3057\u3066\u51e6\u7406\u3092\u7d42\u4e86\u3057\u307e\u3059\u3002\uff08List2 212\u884c\u76ee\uff09<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u7d42\u308f\u308a\u306b<\/h1>\n\n\n\n<p>\u4eca\u56de\u306f\u30b5\u30f3\u30d7\u30eb\u30bd\u30fc\u30b9\u306e\u89e3\u8aac\u3060\u3051\u3067\u5927\u304d\u304f\u306a\u3063\u3066\u3057\u307e\u3063\u305f\u306e\u3067\u3001\u4e88\u5b9a\u3057\u3066\u3044\u305fMininet\u30b3\u30de\u30f3\u30c9\u306e\u89e3\u8aac\u306f\u6b21\u56de\u306b\u3057\u307e\u3059\u3002<br>\u4ee5\u4e0a\u3067\u3059\u3002<\/p>\n<div class=\"opent-_2\" style=\"margin-top: 10px;margin-right: 10px;margin-bottom: 10px;margin-left: 10px;\" id=\"opent-387443507\"><a href=\"https:\/\/www.opentone.co.jp\/backlog\/\" aria-label=\"twitter_backlogskt_new\"><img src=\"https:\/\/www.opentone.co.jp\/ot-lab\/wp-content\/uploads\/sites\/11\/2023\/02\/twitter_backlogskt_new.jpg\" alt=\"\"  srcset=\"https:\/\/www.opentone.co.jp\/ot-lab\/wp-content\/uploads\/sites\/11\/2023\/02\/twitter_backlogskt_new.jpg 1024w, https:\/\/www.opentone.co.jp\/ot-lab\/wp-content\/uploads\/sites\/11\/2023\/02\/twitter_backlogskt_new-300x157.jpg 300w, https:\/\/www.opentone.co.jp\/ot-lab\/wp-content\/uploads\/sites\/11\/2023\/02\/twitter_backlogskt_new-768x401.jpg 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" width=\"384\" height=\"200\"   \/><\/a><\/div>","protected":false},"excerpt":{"rendered":"<p>\u3053\u3093\u306b\u3061\u306f \u4eca\u56de\u306fSDN\u30b7\u30ea\u30fc\u30ba\u306e\u56db\u56de\u76ee\u306b\u306a\u308a\u307e\u3059\u3002 \u4e00\u56de\u76ee\u306f\u3001SDN\u3068\u306f\u4f55\u306a\u306e\u304b\u3092\u7c21\u5358\u306a\u5fdc\u7528\u4f8b\u3092\u793a<\/p>\n","protected":false},"author":1,"featured_media":5842,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_uag_custom_page_level_css":"","_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[28],"tags":[13],"class_list":["post-1063","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-web-system","tag-infrastructure",""],"acf":[],"aioseo_notices":[],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"engage-mag-carousel-img":false,"engage-mag-carousel-img-landscape":false,"engage-mag-carousel-large-img":false,"engage-mag-carousel-large-img-landscape":false,"engage-mag-large-thumb":false,"engage-mag-small-thumb":false},"uagb_author_info":{"display_name":"ah106rx4o4","author_link":"https:\/\/www.opentone.co.jp\/ot-lab\/author\/ah106rx4o4"},"uagb_comment_info":0,"uagb_excerpt":"\u3053\u3093\u306b\u3061\u306f \u4eca\u56de\u306fSDN\u30b7\u30ea\u30fc\u30ba\u306e\u56db\u56de\u76ee\u306b\u306a\u308a\u307e\u3059\u3002 \u4e00\u56de\u76ee\u306f\u3001SDN\u3068\u306f\u4f55\u306a\u306e\u304b\u3092\u7c21\u5358\u306a\u5fdc\u7528\u4f8b\u3092\u793a","_links":{"self":[{"href":"https:\/\/www.opentone.co.jp\/ot-lab\/wp-json\/wp\/v2\/posts\/1063","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.opentone.co.jp\/ot-lab\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.opentone.co.jp\/ot-lab\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.opentone.co.jp\/ot-lab\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.opentone.co.jp\/ot-lab\/wp-json\/wp\/v2\/comments?post=1063"}],"version-history":[{"count":3,"href":"https:\/\/www.opentone.co.jp\/ot-lab\/wp-json\/wp\/v2\/posts\/1063\/revisions"}],"predecessor-version":[{"id":1069,"href":"https:\/\/www.opentone.co.jp\/ot-lab\/wp-json\/wp\/v2\/posts\/1063\/revisions\/1069"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.opentone.co.jp\/ot-lab\/wp-json\/"}],"wp:attachment":[{"href":"https:\/\/www.opentone.co.jp\/ot-lab\/wp-json\/wp\/v2\/media?parent=1063"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.opentone.co.jp\/ot-lab\/wp-json\/wp\/v2\/categories?post=1063"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.opentone.co.jp\/ot-lab\/wp-json\/wp\/v2\/tags?post=1063"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}