)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"7836d2f38a485b2ddcd09a8ad8428e8044568ce7","unresolved":false,"context_lines":[{"line_number":1,"context_line":"Parent:     6efe473c (Move share SG as read only spec to Victoria)"},{"line_number":2,"context_line":"Author:     Slawek Kaplonski \u003cskaplons@redhat.com\u003e"},{"line_number":3,"context_line":"AuthorDate: 2020-05-15 09:56:55 +0200"},{"line_number":4,"context_line":"Commit:     XiaoYu Zhu \u003cz503755743@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2020-05-21 19:14:24 -0700"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":22,"id":"ff570b3c_f3284498","line":2,"range":{"start_line":2,"start_character":0,"end_line":2,"end_character":50},"updated":"2020-05-27 14:54:53.000000000","message":"Why the author is you? @Slawek","commit_id":"a1cff195bc26e97736846561c090a899a5dfae8a"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"b99a15c988e9d6936736b01b183a9164cdc25488","unresolved":false,"context_lines":[{"line_number":1,"context_line":"Parent:     6efe473c (Move share SG as read only spec to Victoria)"},{"line_number":2,"context_line":"Author:     Slawek Kaplonski \u003cskaplons@redhat.com\u003e"},{"line_number":3,"context_line":"AuthorDate: 2020-05-15 09:56:55 +0200"},{"line_number":4,"context_line":"Commit:     XiaoYu Zhu \u003cz503755743@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2020-05-21 19:14:24 -0700"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":22,"id":"ff570b3c_0ea5349f","line":2,"range":{"start_line":2,"start_character":0,"end_line":2,"end_character":50},"in_reply_to":"ff570b3c_f3284498","updated":"2020-06-05 10:02:47.000000000","message":"I have no idea :)","commit_id":"a1cff195bc26e97736846561c090a899a5dfae8a"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"d41d9368e95fcdd4dcb75bc0da561177d6a19e55","unresolved":false,"context_lines":[{"line_number":1,"context_line":"Parent:     6efe473c (Move share SG as read only spec to Victoria)"},{"line_number":2,"context_line":"Author:     Slawek Kaplonski \u003cskaplons@redhat.com\u003e"},{"line_number":3,"context_line":"AuthorDate: 2020-05-15 09:56:55 +0200"},{"line_number":4,"context_line":"Commit:     XiaoYu Zhu \u003cz503755743@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2020-06-02 01:10:54 -0700"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":24,"id":"bf51134e_d20a6b88","line":2,"range":{"start_line":2,"start_character":12,"end_line":2,"end_character":50},"updated":"2020-06-17 16:55:33.000000000","message":"You can try this command to change this:\n\ngit commit --amend --author \"your name \u003cyour email\u003e\"\n\n\nIMPORTANT: do not change the Change-Id below.","commit_id":"f8ae79119c063b2cf8061b7e4bd052923279a1f8"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4b56b82b01995c1864080a3cddfde8e2d2e8c0b6","unresolved":false,"context_lines":[{"line_number":7,"context_line":"l3 router support ecmp"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This spec outlines the Implementation plan of ecmp in neutron"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: I67ebf642fbb130a7701792d66629dbab2d76181b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":24,"id":"ff570b3c_4ee1eccf","line":10,"updated":"2020-06-05 10:18:10.000000000","message":"Please link to the related RFE here","commit_id":"f8ae79119c063b2cf8061b7e4bd052923279a1f8"}],"specs/ussuri/l3-router-support-ecmp.rst":[{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b99823daeaa8bbe90463842bb244630bc4464d76","unresolved":false,"context_lines":[{"line_number":15,"context_line":"reach the same destination. Neutron does not need to calculate the equivalent"},{"line_number":16,"context_line":"route path,but leave that part of the work to which application want to use"},{"line_number":17,"context_line":"ECMP API. Neutron just receives those parameters and configures routers."},{"line_number":18,"context_line":"Thanks to ECMP has supported by linux kernel, neutron can simply address"},{"line_number":19,"context_line":"ECMP by using linux command line and adding route entry into qrouter"},{"line_number":20,"context_line":"namespace."},{"line_number":21,"context_line":""}],"source_content_type":"text/x-rst","patch_set":22,"id":"ff570b3c_13bfb8fb","line":18,"range":{"start_line":18,"start_character":31,"end_line":18,"end_character":44},"updated":"2020-05-27 14:53:11.000000000","message":"The kernel version should be mentioned. More useful acknowledge can be the system config option if something is related.","commit_id":"a1cff195bc26e97736846561c090a899a5dfae8a"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b99823daeaa8bbe90463842bb244630bc4464d76","unresolved":false,"context_lines":[{"line_number":25,"context_line":"Problem Description"},{"line_number":26,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Octavia has proposed an active-active load balancing design on"},{"line_number":29,"context_line":"https://review.opendev.org/#/c/723864/"},{"line_number":30,"context_line":"This program proposed such a scheme:"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"* Multiple load balancing servers in a subnet, each load balancing server has"}],"source_content_type":"text/x-rst","patch_set":22,"id":"ff570b3c_130218b5","line":29,"range":{"start_line":28,"start_character":0,"end_line":29,"end_character":38},"updated":"2020-05-27 14:53:11.000000000","message":"It is still in-progress. : )","commit_id":"a1cff195bc26e97736846561c090a899a5dfae8a"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"6256b494c758b0df1faba5d7c1407fb611afb4bc","unresolved":false,"context_lines":[{"line_number":25,"context_line":"Problem Description"},{"line_number":26,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Octavia has proposed an active-active load balancing design on"},{"line_number":29,"context_line":"https://review.opendev.org/#/c/723864/"},{"line_number":30,"context_line":"This program proposed such a scheme:"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"* Multiple load balancing servers in a subnet, each load balancing server has"}],"source_content_type":"text/x-rst","patch_set":22,"id":"ff570b3c_e8eb180f","line":29,"range":{"start_line":28,"start_character":0,"end_line":29,"end_character":38},"in_reply_to":"ff570b3c_130218b5","updated":"2020-06-03 14:39:53.000000000","message":"yes,they need ecmp support in neutron, so their code cannot be merged unless we commit ecmp first","commit_id":"a1cff195bc26e97736846561c090a899a5dfae8a"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b99823daeaa8bbe90463842bb244630bc4464d76","unresolved":false,"context_lines":[{"line_number":29,"context_line":"https://review.opendev.org/#/c/723864/"},{"line_number":30,"context_line":"This program proposed such a scheme:"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"* Multiple load balancing servers in a subnet, each load balancing server has"},{"line_number":33,"context_line":"  several back ends to response clients\u0027 request, and each load balancing"},{"line_number":34,"context_line":"  server has their own ip address."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"* Several load balancing servers can share one virtual ip (VIP) address."}],"source_content_type":"text/x-rst","patch_set":22,"id":"ff570b3c_134858ca","line":33,"range":{"start_line":32,"start_character":47,"end_line":33,"end_character":19},"updated":"2020-05-27 14:53:11.000000000","message":"Why not directly add the LB \"real server\" to the octavia load balancer backends?","commit_id":"a1cff195bc26e97736846561c090a899a5dfae8a"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"d41d9368e95fcdd4dcb75bc0da561177d6a19e55","unresolved":false,"context_lines":[{"line_number":29,"context_line":"https://review.opendev.org/#/c/723864/"},{"line_number":30,"context_line":"This program proposed such a scheme:"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"* Multiple load balancing servers in a subnet, each load balancing server has"},{"line_number":33,"context_line":"  several back ends to response clients\u0027 request, and each load balancing"},{"line_number":34,"context_line":"  server has their own ip address."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"* Several load balancing servers can share one virtual ip (VIP) address."}],"source_content_type":"text/x-rst","patch_set":22,"id":"bf51134e_525c9b4a","line":33,"range":{"start_line":32,"start_character":47,"end_line":33,"end_character":19},"in_reply_to":"ff570b3c_05063587","updated":"2020-06-17 16:55:33.000000000","message":"The normal topology should be:\n[Client] -- [Router] -- [LB (frontend)] -- [Backends1 (real server), a1, a2, a3]\n\nYour request is:\n[Client] -- [Router] -- [LB1] -- [Backends2 a1, a2, a3]\n                    |\n                    -- [LB2] -- [Backends3 b1, b2, b3]\n                    |\n                    -- [LB3] -- [Backends4 c1, c2, c3]\n\nMy question is why not directly add more hosts to Backends1 ?  It can not improve the performance? Sorry for the lack of acknowledge of loadbalancing or octiavia.","commit_id":"a1cff195bc26e97736846561c090a899a5dfae8a"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"6256b494c758b0df1faba5d7c1407fb611afb4bc","unresolved":false,"context_lines":[{"line_number":29,"context_line":"https://review.opendev.org/#/c/723864/"},{"line_number":30,"context_line":"This program proposed such a scheme:"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"* Multiple load balancing servers in a subnet, each load balancing server has"},{"line_number":33,"context_line":"  several back ends to response clients\u0027 request, and each load balancing"},{"line_number":34,"context_line":"  server has their own ip address."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"* Several load balancing servers can share one virtual ip (VIP) address."}],"source_content_type":"text/x-rst","patch_set":22,"id":"ff570b3c_05063587","line":33,"range":{"start_line":32,"start_character":47,"end_line":33,"end_character":19},"in_reply_to":"ff570b3c_134858ca","updated":"2020-06-03 14:39:53.000000000","message":"Maybe I am not actually understand what you mean...the \"back ends\" refered in here is exactly octavia backends pool.","commit_id":"a1cff195bc26e97736846561c090a899a5dfae8a"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b99823daeaa8bbe90463842bb244630bc4464d76","unresolved":false,"context_lines":[{"line_number":33,"context_line":"  several back ends to response clients\u0027 request, and each load balancing"},{"line_number":34,"context_line":"  server has their own ip address."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"* Several load balancing servers can share one virtual ip (VIP) address."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"* Clients send requests to VIP."},{"line_number":39,"context_line":""}],"source_content_type":"text/x-rst","patch_set":22,"id":"ff570b3c_93b588f1","line":36,"range":{"start_line":36,"start_character":0,"end_line":36,"end_character":72},"updated":"2020-05-27 14:53:11.000000000","message":"This looks like something that running loadbanlancer upon a set of loadbanlancers.","commit_id":"a1cff195bc26e97736846561c090a899a5dfae8a"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"6256b494c758b0df1faba5d7c1407fb611afb4bc","unresolved":false,"context_lines":[{"line_number":33,"context_line":"  several back ends to response clients\u0027 request, and each load balancing"},{"line_number":34,"context_line":"  server has their own ip address."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"* Several load balancing servers can share one virtual ip (VIP) address."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"* Clients send requests to VIP."},{"line_number":39,"context_line":""}],"source_content_type":"text/x-rst","patch_set":22,"id":"ff570b3c_0514759f","line":36,"range":{"start_line":36,"start_character":0,"end_line":36,"end_character":72},"in_reply_to":"ff570b3c_93b588f1","updated":"2020-06-03 14:39:53.000000000","message":"Yes you are right. The ECMP is another layer of loadbalancer, which provide more flexity.","commit_id":"a1cff195bc26e97736846561c090a899a5dfae8a"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b99823daeaa8bbe90463842bb244630bc4464d76","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"* Finally load balancing server distribute the request to a back end."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"In such a situation, Octavia need router to support  ECMP for distributing"},{"line_number":46,"context_line":"requests Octavia requires the router to support the ECMP function so that"},{"line_number":47,"context_line":"requests whose destinations are VIP can be distributed to each load balancing"},{"line_number":48,"context_line":"node."}],"source_content_type":"text/x-rst","patch_set":22,"id":"ff570b3c_53893024","line":45,"range":{"start_line":45,"start_character":34,"end_line":45,"end_character":40},"updated":"2020-05-27 14:53:11.000000000","message":"How about the DVR scenario? How could it work? What if the client IP have binding floating IP, the ECMP routes will still work?","commit_id":"a1cff195bc26e97736846561c090a899a5dfae8a"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"6256b494c758b0df1faba5d7c1407fb611afb4bc","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"* Finally load balancing server distribute the request to a back end."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"In such a situation, Octavia need router to support  ECMP for distributing"},{"line_number":46,"context_line":"requests Octavia requires the router to support the ECMP function so that"},{"line_number":47,"context_line":"requests whose destinations are VIP can be distributed to each load balancing"},{"line_number":48,"context_line":"node."}],"source_content_type":"text/x-rst","patch_set":22,"id":"ff570b3c_08c76c14","line":45,"range":{"start_line":45,"start_character":34,"end_line":45,"end_character":40},"in_reply_to":"ff570b3c_53893024","updated":"2020-06-03 14:39:53.000000000","message":"It can works in DVR scenario with no problem,just add ecmp entry into every qrouter namespace.","commit_id":"a1cff195bc26e97736846561c090a899a5dfae8a"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b99823daeaa8bbe90463842bb244630bc4464d76","unresolved":false,"context_lines":[{"line_number":43,"context_line":"* Finally load balancing server distribute the request to a back end."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"In such a situation, Octavia need router to support  ECMP for distributing"},{"line_number":46,"context_line":"requests Octavia requires the router to support the ECMP function so that"},{"line_number":47,"context_line":"requests whose destinations are VIP can be distributed to each load balancing"},{"line_number":48,"context_line":"node."},{"line_number":49,"context_line":""}],"source_content_type":"text/x-rst","patch_set":22,"id":"ff570b3c_b377ec3b","line":46,"range":{"start_line":46,"start_character":30,"end_line":46,"end_character":56},"updated":"2020-05-27 14:53:11.000000000","message":"Why not add the routes directly to the client guest VM?","commit_id":"a1cff195bc26e97736846561c090a899a5dfae8a"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"6256b494c758b0df1faba5d7c1407fb611afb4bc","unresolved":false,"context_lines":[{"line_number":43,"context_line":"* Finally load balancing server distribute the request to a back end."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"In such a situation, Octavia need router to support  ECMP for distributing"},{"line_number":46,"context_line":"requests Octavia requires the router to support the ECMP function so that"},{"line_number":47,"context_line":"requests whose destinations are VIP can be distributed to each load balancing"},{"line_number":48,"context_line":"node."},{"line_number":49,"context_line":""}],"source_content_type":"text/x-rst","patch_set":22,"id":"ff570b3c_259c195c","line":46,"range":{"start_line":46,"start_character":30,"end_line":46,"end_character":56},"in_reply_to":"ff570b3c_b377ec3b","updated":"2020-06-03 14:39:53.000000000","message":"It is because the simple ECMP approach can not proivde features about L7 loadbalaning. The complex loadbalancing should be done by haproxy, lvs or other loadbalancer. The two level of loadbalancing(ECMP+Loadbalancer) can be easily managed by octavia...","commit_id":"a1cff195bc26e97736846561c090a899a5dfae8a"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b99823daeaa8bbe90463842bb244630bc4464d76","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"In such a situation, Octavia need router to support  ECMP for distributing"},{"line_number":46,"context_line":"requests Octavia requires the router to support the ECMP function so that"},{"line_number":47,"context_line":"requests whose destinations are VIP can be distributed to each load balancing"},{"line_number":48,"context_line":"node."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""}],"source_content_type":"text/x-rst","patch_set":22,"id":"ff570b3c_936c6809","line":47,"range":{"start_line":47,"start_character":32,"end_line":47,"end_character":35},"updated":"2020-05-27 14:53:11.000000000","message":"How the VIP arp works cross the DVR subnets, this should be a the problem of the bug:\nhttps://bugs.launchpad.net/neutron/+bug/1774459","commit_id":"a1cff195bc26e97736846561c090a899a5dfae8a"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"6256b494c758b0df1faba5d7c1407fb611afb4bc","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"In such a situation, Octavia need router to support  ECMP for distributing"},{"line_number":46,"context_line":"requests Octavia requires the router to support the ECMP function so that"},{"line_number":47,"context_line":"requests whose destinations are VIP can be distributed to each load balancing"},{"line_number":48,"context_line":"node."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""}],"source_content_type":"text/x-rst","patch_set":22,"id":"ff570b3c_480e848d","line":47,"range":{"start_line":47,"start_character":32,"end_line":47,"end_character":35},"in_reply_to":"ff570b3c_936c6809","updated":"2020-06-03 14:39:53.000000000","message":"Yes,I have clearly knew this bug,but in this scenario, router will not need the mac address of VIP, because those packets will go to \u003cnexthop_ip\u003e, so there is no arp request for asking \"who has VIP\".","commit_id":"a1cff195bc26e97736846561c090a899a5dfae8a"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b99823daeaa8bbe90463842bb244630bc4464d76","unresolved":false,"context_lines":[{"line_number":48,"context_line":"node."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Proposed Change"},{"line_number":52,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"Overview"}],"source_content_type":"text/x-rst","patch_set":22,"id":"ff570b3c_d393805b","line":51,"range":{"start_line":51,"start_character":0,"end_line":51,"end_character":15},"updated":"2020-05-27 14:53:11.000000000","message":"Before this section, IMO, you missed some important section \"the detail of the new approach\" which should tell us why it works? and how it works?","commit_id":"a1cff195bc26e97736846561c090a899a5dfae8a"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b99823daeaa8bbe90463842bb244630bc4464d76","unresolved":false,"context_lines":[{"line_number":65,"context_line":"  ``ecmp_route`` resource. The extension should be support by"},{"line_number":66,"context_line":"  ``service_plugins``."},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"In Agent SIde"},{"line_number":69,"context_line":"~~~~~~~~~~~~~"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"Implement a extension of ``neutron-l3-agent`` to set relational rules ecmp."}],"source_content_type":"text/x-rst","patch_set":22,"id":"ff570b3c_139e9862","line":68,"range":{"start_line":68,"start_character":9,"end_line":68,"end_character":13},"updated":"2020-05-27 14:53:11.000000000","message":"Side","commit_id":"a1cff195bc26e97736846561c090a899a5dfae8a"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b99823daeaa8bbe90463842bb244630bc4464d76","unresolved":false,"context_lines":[{"line_number":68,"context_line":"In Agent SIde"},{"line_number":69,"context_line":"~~~~~~~~~~~~~"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"Implement a extension of ``neutron-l3-agent`` to set relational rules ecmp."},{"line_number":72,"context_line":"The extension behavior like below:"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"* For each ecmp_router object, the extension should set a ip route entry"}],"source_content_type":"text/x-rst","patch_set":22,"id":"ff570b3c_935bc885","line":71,"range":{"start_line":71,"start_character":10,"end_line":71,"end_character":11},"updated":"2020-05-27 14:53:11.000000000","message":"an","commit_id":"a1cff195bc26e97736846561c090a899a5dfae8a"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b99823daeaa8bbe90463842bb244630bc4464d76","unresolved":false,"context_lines":[{"line_number":143,"context_line":"      \"ecmp_route \":{"},{"line_number":144,"context_line":"        \"router_id\": \"c61291df-e94a-4955-92cc-5d6ebf3d5e48\","},{"line_number":145,"context_line":"        “next_hops\": [\"192.168.1.10\",\"192.168.1.11\"],"},{"line_number":146,"context_line":"        \"dst_ip\": \"10.10.1.10\","},{"line_number":147,"context_line":"      }"},{"line_number":148,"context_line":"    }"},{"line_number":149,"context_line":"  response:"}],"source_content_type":"text/x-rst","patch_set":22,"id":"ff570b3c_d3ca604d","line":146,"range":{"start_line":146,"start_character":18,"end_line":146,"end_character":31},"updated":"2020-05-27 14:53:11.000000000","message":"So this should be the VIP that the real octivia loadbalancers sharing?\n\nBut what if the client VM and the VIP are in the same subnet, the traffic will not go to router (gateway), the ECMP route will not hit anymore.","commit_id":"a1cff195bc26e97736846561c090a899a5dfae8a"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b99823daeaa8bbe90463842bb244630bc4464d76","unresolved":false,"context_lines":[{"line_number":143,"context_line":"      \"ecmp_route \":{"},{"line_number":144,"context_line":"        \"router_id\": \"c61291df-e94a-4955-92cc-5d6ebf3d5e48\","},{"line_number":145,"context_line":"        “next_hops\": [\"192.168.1.10\",\"192.168.1.11\"],"},{"line_number":146,"context_line":"        \"dst_ip\": \"10.10.1.10\","},{"line_number":147,"context_line":"      }"},{"line_number":148,"context_line":"    }"},{"line_number":149,"context_line":"  response:"}],"source_content_type":"text/x-rst","patch_set":22,"id":"ff570b3c_539490e8","line":146,"range":{"start_line":146,"start_character":18,"end_line":146,"end_character":31},"updated":"2020-05-27 14:53:11.000000000","message":"What if the dst_ip is changed to \"192.168.1.12\"? VM (192.168.1.13)  in this subnet is trying to visit \"192.168.1.12\", how to hit the ECMP routes in router namespace? If the answer is to add \"/32\" routes in the guests VMs, again why not add ECMP routes directly in them?","commit_id":"a1cff195bc26e97736846561c090a899a5dfae8a"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"6256b494c758b0df1faba5d7c1407fb611afb4bc","unresolved":false,"context_lines":[{"line_number":143,"context_line":"      \"ecmp_route \":{"},{"line_number":144,"context_line":"        \"router_id\": \"c61291df-e94a-4955-92cc-5d6ebf3d5e48\","},{"line_number":145,"context_line":"        “next_hops\": [\"192.168.1.10\",\"192.168.1.11\"],"},{"line_number":146,"context_line":"        \"dst_ip\": \"10.10.1.10\","},{"line_number":147,"context_line":"      }"},{"line_number":148,"context_line":"    }"},{"line_number":149,"context_line":"  response:"}],"source_content_type":"text/x-rst","patch_set":22,"id":"ff570b3c_2849908a","line":146,"range":{"start_line":146,"start_character":18,"end_line":146,"end_character":31},"in_reply_to":"ff570b3c_539490e8","updated":"2020-06-03 14:39:53.000000000","message":"I\u0027m amazed at your meticulous thinking, in fact I also added the ARP surrogate setting to the router, but forgot to write it here,I\u0027ll make up that part in due course","commit_id":"a1cff195bc26e97736846561c090a899a5dfae8a"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"6256b494c758b0df1faba5d7c1407fb611afb4bc","unresolved":false,"context_lines":[{"line_number":143,"context_line":"      \"ecmp_route \":{"},{"line_number":144,"context_line":"        \"router_id\": \"c61291df-e94a-4955-92cc-5d6ebf3d5e48\","},{"line_number":145,"context_line":"        “next_hops\": [\"192.168.1.10\",\"192.168.1.11\"],"},{"line_number":146,"context_line":"        \"dst_ip\": \"10.10.1.10\","},{"line_number":147,"context_line":"      }"},{"line_number":148,"context_line":"    }"},{"line_number":149,"context_line":"  response:"}],"source_content_type":"text/x-rst","patch_set":22,"id":"ff570b3c_1b38583b","line":146,"range":{"start_line":146,"start_character":18,"end_line":146,"end_character":31},"in_reply_to":"ff570b3c_d3ca604d","updated":"2020-06-03 14:39:53.000000000","message":"Turn off loadbalancers\u0027s arp ability,then let router response its own mac address,then problem solved.","commit_id":"a1cff195bc26e97736846561c090a899a5dfae8a"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4b56b82b01995c1864080a3cddfde8e2d2e8c0b6","unresolved":false,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"ECMP is a kind of routing technology which allows multiple different links"},{"line_number":15,"context_line":"reach the same destination. Neutron does not need to calculate the equivalent"},{"line_number":16,"context_line":"route path,but leave that part of the work to those applications using"},{"line_number":17,"context_line":"ECMP API. Neutron just receives those parameters and configures routers."},{"line_number":18,"context_line":"Thanks to ECMP has been supported by linux kernel, neutron can simply"},{"line_number":19,"context_line":"address ECMP by using linux command line and adding route entry into qrouter"}],"source_content_type":"text/x-rst","patch_set":24,"id":"ff570b3c_eed1e0fc","line":16,"range":{"start_line":16,"start_character":10,"end_line":16,"end_character":11},"updated":"2020-06-05 10:18:10.000000000","message":"nitty nit: missing space after comma","commit_id":"f8ae79119c063b2cf8061b7e4bd052923279a1f8"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"d41d9368e95fcdd4dcb75bc0da561177d6a19e55","unresolved":false,"context_lines":[{"line_number":15,"context_line":"reach the same destination. Neutron does not need to calculate the equivalent"},{"line_number":16,"context_line":"route path,but leave that part of the work to those applications using"},{"line_number":17,"context_line":"ECMP API. Neutron just receives those parameters and configures routers."},{"line_number":18,"context_line":"Thanks to ECMP has been supported by linux kernel, neutron can simply"},{"line_number":19,"context_line":"address ECMP by using linux command line and adding route entry into qrouter"},{"line_number":20,"context_line":"namespace."},{"line_number":21,"context_line":""}],"source_content_type":"text/x-rst","patch_set":24,"id":"bf51134e_5252db68","line":18,"range":{"start_line":18,"start_character":43,"end_line":18,"end_character":49},"updated":"2020-06-17 16:55:33.000000000","message":"One more time from [1], please add some references to the kernel support version or release note.\n\n[1] https://review.opendev.org/#/c/729532/22/specs/ussuri/l3-router-support-ecmp.rst@18","commit_id":"f8ae79119c063b2cf8061b7e4bd052923279a1f8"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4b56b82b01995c1864080a3cddfde8e2d2e8c0b6","unresolved":false,"context_lines":[{"line_number":15,"context_line":"reach the same destination. Neutron does not need to calculate the equivalent"},{"line_number":16,"context_line":"route path,but leave that part of the work to those applications using"},{"line_number":17,"context_line":"ECMP API. Neutron just receives those parameters and configures routers."},{"line_number":18,"context_line":"Thanks to ECMP has been supported by linux kernel, neutron can simply"},{"line_number":19,"context_line":"address ECMP by using linux command line and adding route entry into qrouter"},{"line_number":20,"context_line":"namespace."},{"line_number":21,"context_line":""}],"source_content_type":"text/x-rst","patch_set":24,"id":"ff570b3c_8e002468","line":18,"range":{"start_line":18,"start_character":37,"end_line":18,"end_character":42},"updated":"2020-06-05 10:18:10.000000000","message":"nit: I think it should be \"Linux\" with uppercase","commit_id":"f8ae79119c063b2cf8061b7e4bd052923279a1f8"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"a68d939560c8c654bceb862ef63aabca8139acde","unresolved":false,"context_lines":[{"line_number":15,"context_line":"reach the same destination. Neutron does not need to calculate the equivalent"},{"line_number":16,"context_line":"route path,but leave that part of the work to those applications using"},{"line_number":17,"context_line":"ECMP API. Neutron just receives those parameters and configures routers."},{"line_number":18,"context_line":"Thanks to ECMP has been supported by linux kernel, neutron can simply"},{"line_number":19,"context_line":"address ECMP by using linux command line and adding route entry into qrouter"},{"line_number":20,"context_line":"namespace."},{"line_number":21,"context_line":""}],"source_content_type":"text/x-rst","patch_set":24,"id":"bf51134e_b717bbed","line":18,"range":{"start_line":18,"start_character":43,"end_line":18,"end_character":49},"in_reply_to":"bf51134e_5252db68","updated":"2020-06-19 08:44:05.000000000","message":"Setting multiple next-hop addresses is supported by the iproute2 library that comes with linux. And iproute2 has been around since linux 2.2.x. I\u0027m sorry, but I can\u0027t find exactly what version of the linux kernel supports this.","commit_id":"f8ae79119c063b2cf8061b7e4bd052923279a1f8"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4b56b82b01995c1864080a3cddfde8e2d2e8c0b6","unresolved":false,"context_lines":[{"line_number":16,"context_line":"route path,but leave that part of the work to those applications using"},{"line_number":17,"context_line":"ECMP API. Neutron just receives those parameters and configures routers."},{"line_number":18,"context_line":"Thanks to ECMP has been supported by linux kernel, neutron can simply"},{"line_number":19,"context_line":"address ECMP by using linux command line and adding route entry into qrouter"},{"line_number":20,"context_line":"namespace."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Then this spec describes how to implement ECMP in neutron ."}],"source_content_type":"text/x-rst","patch_set":24,"id":"ff570b3c_0eec14b9","line":19,"range":{"start_line":19,"start_character":22,"end_line":19,"end_character":40},"updated":"2020-06-05 10:18:10.000000000","message":"do it really need to be CLI? Can\u0027t we use e.g. pyroute2 library for that?","commit_id":"f8ae79119c063b2cf8061b7e4bd052923279a1f8"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"8f00603a53af910aa7a9f7ce62ceab0adf450efb","unresolved":false,"context_lines":[{"line_number":16,"context_line":"route path,but leave that part of the work to those applications using"},{"line_number":17,"context_line":"ECMP API. Neutron just receives those parameters and configures routers."},{"line_number":18,"context_line":"Thanks to ECMP has been supported by linux kernel, neutron can simply"},{"line_number":19,"context_line":"address ECMP by using linux command line and adding route entry into qrouter"},{"line_number":20,"context_line":"namespace."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Then this spec describes how to implement ECMP in neutron ."}],"source_content_type":"text/x-rst","patch_set":24,"id":"ff570b3c_5ec32c39","line":19,"range":{"start_line":19,"start_character":22,"end_line":19,"end_character":40},"in_reply_to":"ff570b3c_0eec14b9","updated":"2020-06-09 11:11:19.000000000","message":"you are right, I\u0027ll use pyroute2 to do this","commit_id":"f8ae79119c063b2cf8061b7e4bd052923279a1f8"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4b56b82b01995c1864080a3cddfde8e2d2e8c0b6","unresolved":false,"context_lines":[{"line_number":19,"context_line":"address ECMP by using linux command line and adding route entry into qrouter"},{"line_number":20,"context_line":"namespace."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Then this spec describes how to implement ECMP in neutron ."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Problem Description"}],"source_content_type":"text/x-rst","patch_set":24,"id":"ff570b3c_4e2f2cf5","line":22,"range":{"start_line":22,"start_character":57,"end_line":22,"end_character":58},"updated":"2020-06-05 10:18:10.000000000","message":"nit: not needed space","commit_id":"f8ae79119c063b2cf8061b7e4bd052923279a1f8"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"d41d9368e95fcdd4dcb75bc0da561177d6a19e55","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Octavia has proposed an active-active load balancing design on"},{"line_number":29,"context_line":"https://review.opendev.org/#/c/723864/"},{"line_number":30,"context_line":"This program proposed such a scheme:"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"* Multiple load balancing servers in a subnet, each load balancing server has"},{"line_number":33,"context_line":"  several back ends to response clients\u0027 request, and each load balancing"}],"source_content_type":"text/x-rst","patch_set":24,"id":"bf51134e_006aceb1","line":30,"range":{"start_line":30,"start_character":0,"end_line":30,"end_character":36},"updated":"2020-06-17 16:55:33.000000000","message":"Try this web site to add some figure for the topology \nhttp://asciiflow.com/\n\n\nThis should be a good example:\nhttps://review.opendev.org/#/c/531074/4/specs/rocky/vpn-services-support-qos.rst@40","commit_id":"f8ae79119c063b2cf8061b7e4bd052923279a1f8"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4b56b82b01995c1864080a3cddfde8e2d2e8c0b6","unresolved":false,"context_lines":[{"line_number":43,"context_line":"* Finally load balancing server distribute the request to a back end."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"In such a situation, Octavia need router to support ECMP for distributing"},{"line_number":46,"context_line":"requests. So Octavia can send request to Neutorn to create a ECMP instance,"},{"line_number":47,"context_line":"then Neutron L3 agent excute command in qrouter namespace to create an ECMP"},{"line_number":48,"context_line":"entry in qrouter namespace, using VIP as the destination ip of the route\u0027s"},{"line_number":49,"context_line":"entry, and several load balancers\u0027 ip as nexthop ip.So those requests having"}],"source_content_type":"text/x-rst","patch_set":24,"id":"ff570b3c_ee6d6032","line":46,"range":{"start_line":46,"start_character":41,"end_line":46,"end_character":48},"updated":"2020-06-05 10:18:10.000000000","message":"nit: Neutron","commit_id":"f8ae79119c063b2cf8061b7e4bd052923279a1f8"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4b56b82b01995c1864080a3cddfde8e2d2e8c0b6","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"In such a situation, Octavia need router to support ECMP for distributing"},{"line_number":46,"context_line":"requests. So Octavia can send request to Neutorn to create a ECMP instance,"},{"line_number":47,"context_line":"then Neutron L3 agent excute command in qrouter namespace to create an ECMP"},{"line_number":48,"context_line":"entry in qrouter namespace, using VIP as the destination ip of the route\u0027s"},{"line_number":49,"context_line":"entry, and several load balancers\u0027 ip as nexthop ip.So those requests having"},{"line_number":50,"context_line":"VIP as their destinations can be distributed to each load balancer."}],"source_content_type":"text/x-rst","patch_set":24,"id":"ff570b3c_8e5ca47d","line":47,"range":{"start_line":47,"start_character":22,"end_line":47,"end_character":28},"updated":"2020-06-05 10:18:10.000000000","message":"nit: execute","commit_id":"f8ae79119c063b2cf8061b7e4bd052923279a1f8"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4b56b82b01995c1864080a3cddfde8e2d2e8c0b6","unresolved":false,"context_lines":[{"line_number":46,"context_line":"requests. So Octavia can send request to Neutorn to create a ECMP instance,"},{"line_number":47,"context_line":"then Neutron L3 agent excute command in qrouter namespace to create an ECMP"},{"line_number":48,"context_line":"entry in qrouter namespace, using VIP as the destination ip of the route\u0027s"},{"line_number":49,"context_line":"entry, and several load balancers\u0027 ip as nexthop ip.So those requests having"},{"line_number":50,"context_line":"VIP as their destinations can be distributed to each load balancer."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""}],"source_content_type":"text/x-rst","patch_set":24,"id":"ff570b3c_ce517c64","line":49,"range":{"start_line":49,"start_character":51,"end_line":49,"end_character":52},"updated":"2020-06-05 10:18:10.000000000","message":"nit: missing space after dot","commit_id":"f8ae79119c063b2cf8061b7e4bd052923279a1f8"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4b56b82b01995c1864080a3cddfde8e2d2e8c0b6","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"* Implement an API extension, In the extenstion we should defined a named"},{"line_number":67,"context_line":"  ``ecmp_route`` resource. The extension should be support by"},{"line_number":68,"context_line":"  ``service_plugins``."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"In Agent Side"},{"line_number":71,"context_line":"~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":24,"id":"ff570b3c_0e4894b0","line":68,"updated":"2020-06-05 10:18:10.000000000","message":"IIRC we were discussing about that in the drivers meeting recently and we though that this can possibly be achieved with current extraroutes API. Then You would need only some changes to the L3 agent. Did You test that?","commit_id":"f8ae79119c063b2cf8061b7e4bd052923279a1f8"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"8f00603a53af910aa7a9f7ce62ceab0adf450efb","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"* Implement an API extension, In the extenstion we should defined a named"},{"line_number":67,"context_line":"  ``ecmp_route`` resource. The extension should be support by"},{"line_number":68,"context_line":"  ``service_plugins``."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"In Agent Side"},{"line_number":71,"context_line":"~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":24,"id":"ff570b3c_5ea96c22","line":68,"in_reply_to":"ff570b3c_0e4894b0","updated":"2020-06-09 11:11:19.000000000","message":"No,I didn\u0027t,but I will, because it sounds a lot more reasonable than my original proposal.","commit_id":"f8ae79119c063b2cf8061b7e4bd052923279a1f8"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"d41d9368e95fcdd4dcb75bc0da561177d6a19e55","unresolved":false,"context_lines":[{"line_number":70,"context_line":"In Agent Side"},{"line_number":71,"context_line":"~~~~~~~~~~~~~"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"Implement a extension of ``neutron-l3-agent`` to set relational rules ecmp."},{"line_number":74,"context_line":"The extension behavior like below:"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"* For each ecmp_router object, the extension should excute an ip route"}],"source_content_type":"text/x-rst","patch_set":24,"id":"bf51134e_80d37e38","line":73,"range":{"start_line":73,"start_character":10,"end_line":73,"end_character":11},"updated":"2020-06-17 16:55:33.000000000","message":"s/an","commit_id":"f8ae79119c063b2cf8061b7e4bd052923279a1f8"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4b56b82b01995c1864080a3cddfde8e2d2e8c0b6","unresolved":false,"context_lines":[{"line_number":73,"context_line":"Implement a extension of ``neutron-l3-agent`` to set relational rules ecmp."},{"line_number":74,"context_line":"The extension behavior like below:"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"* For each ecmp_router object, the extension should excute an ip route"},{"line_number":77,"context_line":"  command in the router\u0027s namespace, which looks like"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"::"}],"source_content_type":"text/x-rst","patch_set":24,"id":"ff570b3c_4ecbac1c","line":76,"range":{"start_line":76,"start_character":52,"end_line":76,"end_character":58},"updated":"2020-06-05 10:18:10.000000000","message":"nit: execute","commit_id":"f8ae79119c063b2cf8061b7e4bd052923279a1f8"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4b56b82b01995c1864080a3cddfde8e2d2e8c0b6","unresolved":false,"context_lines":[{"line_number":73,"context_line":"Implement a extension of ``neutron-l3-agent`` to set relational rules ecmp."},{"line_number":74,"context_line":"The extension behavior like below:"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"* For each ecmp_router object, the extension should excute an ip route"},{"line_number":77,"context_line":"  command in the router\u0027s namespace, which looks like"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"::"}],"source_content_type":"text/x-rst","patch_set":24,"id":"ff570b3c_aecec829","line":76,"range":{"start_line":76,"start_character":62,"end_line":76,"end_character":70},"updated":"2020-06-05 10:18:10.000000000","message":"we are mostly using pyroute2 now","commit_id":"f8ae79119c063b2cf8061b7e4bd052923279a1f8"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"8f00603a53af910aa7a9f7ce62ceab0adf450efb","unresolved":false,"context_lines":[{"line_number":73,"context_line":"Implement a extension of ``neutron-l3-agent`` to set relational rules ecmp."},{"line_number":74,"context_line":"The extension behavior like below:"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"* For each ecmp_router object, the extension should excute an ip route"},{"line_number":77,"context_line":"  command in the router\u0027s namespace, which looks like"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"::"}],"source_content_type":"text/x-rst","patch_set":24,"id":"ff570b3c_7e64304a","line":76,"range":{"start_line":76,"start_character":62,"end_line":76,"end_character":70},"in_reply_to":"ff570b3c_aecec829","updated":"2020-06-09 11:11:19.000000000","message":"ok, I\u0027ll change this command to ip.route(\u0027replace\u0027,dst\u003d\u0027a.b.c.d/32\u0027,multipath\u003d[{\"gateway\":\"\u003cnexthop1\u003e\"},{\"gateway\":\"\u003cnexthop2\u003e\"}])","commit_id":"f8ae79119c063b2cf8061b7e4bd052923279a1f8"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"d41d9368e95fcdd4dcb75bc0da561177d6a19e55","unresolved":false,"context_lines":[{"line_number":95,"context_line":"In order to let those traffic from the same network to pass through the"},{"line_number":96,"context_line":"router, L3 agent will also let router to use Proxy ARP by setting command::"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"  sysctl -w net.ipv4.conf.all.proxy_arp\u003d1"},{"line_number":99,"context_line":"  sysctl -w net.ipv4.conf.all.proxy_arp_pvlan\u003d1"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"Data Model Impact"}],"source_content_type":"text/x-rst","patch_set":24,"id":"bf51134e_a0b962ea","line":98,"range":{"start_line":98,"start_character":26,"end_line":98,"end_character":29},"updated":"2020-06-17 16:55:33.000000000","message":"I\u0027m not sure if it is OK when proxy_arp is enabled for all devices of router namespace. You have tested this?\n\nI have some cases should be considered: legacy router, DVR, DVR+HA, network node with mixed compute resources.","commit_id":"f8ae79119c063b2cf8061b7e4bd052923279a1f8"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"a68d939560c8c654bceb862ef63aabca8139acde","unresolved":false,"context_lines":[{"line_number":95,"context_line":"In order to let those traffic from the same network to pass through the"},{"line_number":96,"context_line":"router, L3 agent will also let router to use Proxy ARP by setting command::"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"  sysctl -w net.ipv4.conf.all.proxy_arp\u003d1"},{"line_number":99,"context_line":"  sysctl -w net.ipv4.conf.all.proxy_arp_pvlan\u003d1"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"Data Model Impact"}],"source_content_type":"text/x-rst","patch_set":24,"id":"bf51134e_174dc799","line":98,"range":{"start_line":98,"start_character":26,"end_line":98,"end_character":29},"in_reply_to":"bf51134e_a0b962ea","updated":"2020-06-19 08:44:05.000000000","message":"Sorry I made a mistake here. The \u0027all\u0027 in this command is replaced with the NIC to which the destination subnet is connected","commit_id":"f8ae79119c063b2cf8061b7e4bd052923279a1f8"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4b56b82b01995c1864080a3cddfde8e2d2e8c0b6","unresolved":false,"context_lines":[{"line_number":153,"context_line":"Sample REST calls::"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"  Create a ecmp_route:"},{"line_number":156,"context_line":"  POST /v2.0/ecmp_routes"},{"line_number":157,"context_line":"  request:"},{"line_number":158,"context_line":"    {"},{"line_number":159,"context_line":"      \"ecmp_route \":{"}],"source_content_type":"text/x-rst","patch_set":24,"id":"ff570b3c_ceffbc31","line":156,"updated":"2020-06-05 10:18:10.000000000","message":"why not /v2.0/{router_id}/ecmp_routes ?","commit_id":"f8ae79119c063b2cf8061b7e4bd052923279a1f8"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"8f00603a53af910aa7a9f7ce62ceab0adf450efb","unresolved":false,"context_lines":[{"line_number":153,"context_line":"Sample REST calls::"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"  Create a ecmp_route:"},{"line_number":156,"context_line":"  POST /v2.0/ecmp_routes"},{"line_number":157,"context_line":"  request:"},{"line_number":158,"context_line":"    {"},{"line_number":159,"context_line":"      \"ecmp_route \":{"}],"source_content_type":"text/x-rst","patch_set":24,"id":"ff570b3c_7ef27071","line":156,"in_reply_to":"ff570b3c_ceffbc31","updated":"2020-06-09 11:11:19.000000000","message":"I guess you mean /v2.0/routers/{router_id}/ecmp_routes, I\u0027ll try it","commit_id":"f8ae79119c063b2cf8061b7e4bd052923279a1f8"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"d41d9368e95fcdd4dcb75bc0da561177d6a19e55","unresolved":false,"context_lines":[{"line_number":159,"context_line":"      \"ecmp_route \":{"},{"line_number":160,"context_line":"        \"router_id\": \"c61291df-e94a-4955-92cc-5d6ebf3d5e48\","},{"line_number":161,"context_line":"        “next_hops\": [\"192.168.1.10\",\"192.168.1.11\"],"},{"line_number":162,"context_line":"        \"dst_ip\": \"10.10.1.10\","},{"line_number":163,"context_line":"      }"},{"line_number":164,"context_line":"    }"},{"line_number":165,"context_line":"  response:"}],"source_content_type":"text/x-rst","patch_set":24,"id":"bf51134e_40ade686","line":162,"range":{"start_line":162,"start_character":8,"end_line":162,"end_character":31},"updated":"2020-06-17 16:55:33.000000000","message":"Where is this IP coming from? A neutron port? So who will create this port?","commit_id":"f8ae79119c063b2cf8061b7e4bd052923279a1f8"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"a68d939560c8c654bceb862ef63aabca8139acde","unresolved":false,"context_lines":[{"line_number":159,"context_line":"      \"ecmp_route \":{"},{"line_number":160,"context_line":"        \"router_id\": \"c61291df-e94a-4955-92cc-5d6ebf3d5e48\","},{"line_number":161,"context_line":"        “next_hops\": [\"192.168.1.10\",\"192.168.1.11\"],"},{"line_number":162,"context_line":"        \"dst_ip\": \"10.10.1.10\","},{"line_number":163,"context_line":"      }"},{"line_number":164,"context_line":"    }"},{"line_number":165,"context_line":"  response:"}],"source_content_type":"text/x-rst","patch_set":24,"id":"bf51134e_976d5734","line":162,"range":{"start_line":162,"start_character":8,"end_line":162,"end_character":31},"in_reply_to":"bf51134e_40ade686","updated":"2020-06-19 08:44:05.000000000","message":"Yes, it a ip of a neutron port, and it will not be bound.\nIn a multi-activity load balancing scenario, Octivia will create it.","commit_id":"f8ae79119c063b2cf8061b7e4bd052923279a1f8"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4b56b82b01995c1864080a3cddfde8e2d2e8c0b6","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        \"next_hops\": [\"192.168.1.10\",\"192.168.1.11\"],"},{"line_number":171,"context_line":"        \"dst_ip\": \"10.10.1.10\","},{"line_number":172,"context_line":"        \"project_id\": \"c43aab35ec9e41bdbce9d4a4c9e7c5d6\","},{"line_number":173,"context_line":"        \"id\": \"e814fa88-bc0f-4fd8-b200-a3366ff62e2f\""},{"line_number":174,"context_line":"      }"},{"line_number":175,"context_line":"    }"},{"line_number":176,"context_line":""}],"source_content_type":"text/x-rst","patch_set":24,"id":"ff570b3c_4e99ec1c","line":173,"updated":"2020-06-05 10:18:10.000000000","message":"we have extraroutes concept already in the router and it don\u0027t have own id. If we really need new API for that one, I think that we should be as consistent with existing API as possible. See https://specs.openstack.org/openstack/neutron-specs/specs/train/improve-extraroute-api.html for some details.","commit_id":"f8ae79119c063b2cf8061b7e4bd052923279a1f8"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"8f00603a53af910aa7a9f7ce62ceab0adf450efb","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        \"next_hops\": [\"192.168.1.10\",\"192.168.1.11\"],"},{"line_number":171,"context_line":"        \"dst_ip\": \"10.10.1.10\","},{"line_number":172,"context_line":"        \"project_id\": \"c43aab35ec9e41bdbce9d4a4c9e7c5d6\","},{"line_number":173,"context_line":"        \"id\": \"e814fa88-bc0f-4fd8-b200-a3366ff62e2f\""},{"line_number":174,"context_line":"      }"},{"line_number":175,"context_line":"    }"},{"line_number":176,"context_line":""}],"source_content_type":"text/x-rst","patch_set":24,"id":"ff570b3c_f9917a9c","line":173,"in_reply_to":"ff570b3c_4e99ec1c","updated":"2020-06-09 11:11:19.000000000","message":"The new plan is: add new methods like create_ecmp() in extratoute_db.py to handle requset for /v2.0/routers/{router_id}/ecmp_routes. So should I use database table:[routerroutes] for ecmp or create a new one?","commit_id":"f8ae79119c063b2cf8061b7e4bd052923279a1f8"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"d74b10e14fdc69a7c7f30afd2f649ad293c5e565","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        \"next_hops\": [\"192.168.1.10\",\"192.168.1.11\"],"},{"line_number":171,"context_line":"        \"dst_ip\": \"10.10.1.10\","},{"line_number":172,"context_line":"        \"project_id\": \"c43aab35ec9e41bdbce9d4a4c9e7c5d6\","},{"line_number":173,"context_line":"        \"id\": \"e814fa88-bc0f-4fd8-b200-a3366ff62e2f\""},{"line_number":174,"context_line":"      }"},{"line_number":175,"context_line":"    }"},{"line_number":176,"context_line":""}],"source_content_type":"text/x-rst","patch_set":24,"id":"ff570b3c_59aa2671","line":173,"in_reply_to":"ff570b3c_f9917a9c","updated":"2020-06-09 11:23:32.000000000","message":"\u003e The new plan is: add new methods like create_ecmp() in\n \u003e extraroute_db.py to handle requset for /v2.0/routers/{router_id}/ecmp_routes.\n \u003e So should I use database table:[routerroutes] for ecmp or create a\n \u003e new one?","commit_id":"f8ae79119c063b2cf8061b7e4bd052923279a1f8"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4b56b82b01995c1864080a3cddfde8e2d2e8c0b6","unresolved":false,"context_lines":[{"line_number":175,"context_line":"    }"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"  Update a ecmp_route"},{"line_number":178,"context_line":"  PUT /v2.0/ecmp_routes/\u003cid\u003e"},{"line_number":179,"context_line":"  request:"},{"line_number":180,"context_line":"    {"},{"line_number":181,"context_line":"      \" ecmp_route \": {"}],"source_content_type":"text/x-rst","patch_set":24,"id":"ff570b3c_2efbd846","line":178,"updated":"2020-06-05 10:18:10.000000000","message":"same question here","commit_id":"f8ae79119c063b2cf8061b7e4bd052923279a1f8"}],"specs/victoria/l3-router-support-ecmp.rst":[{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"4fb1409f7b336e317329abad4ce39024394df36e","unresolved":false,"context_lines":[{"line_number":102,"context_line":"VIP as their destinations can be distributed to each loadbalancer."},{"line_number":103,"context_line":""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"Proposed Change"},{"line_number":106,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"Overview"}],"source_content_type":"text/x-rst","patch_set":25,"id":"bf51134e_683edd29","line":105,"range":{"start_line":105,"start_character":0,"end_line":105,"end_character":15},"updated":"2020-07-08 09:16:20.000000000","message":"Sorry, I could not find any detail about how this can work for DVR? Could you please elaborate the detail? Again, the POC for this RFE could be useful for the L3 team to understand the detail implementation of this proposal. You could directly upload the POC to the gerrit, and add some link to the root \"References\" section of this spec.","commit_id":"9588b38187b06ddcc4812e3946e71efbd6c4598c"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"7e04e9f6278691f4a8789bd8c639c4c7d6a4e709","unresolved":false,"context_lines":[{"line_number":102,"context_line":"VIP as their destinations can be distributed to each loadbalancer."},{"line_number":103,"context_line":""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"Proposed Change"},{"line_number":106,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"Overview"}],"source_content_type":"text/x-rst","patch_set":25,"id":"bf51134e_e9ecac90","line":105,"range":{"start_line":105,"start_character":0,"end_line":105,"end_character":15},"in_reply_to":"bf51134e_683edd29","updated":"2020-07-08 14:02:07.000000000","message":"Our ECMP and multi-active load balancing projects are based on DVR mode and the same logic code is also being used. You don’t have to worry about it having problems in DVR mode. I will improve this document on the workflow.\n\nI\u0027ve uploaded the ECMP code which implemented as an extra plugin, to this URL:\nhttps://github.com/z503755743/NEUTRON-ECMP\n\nBut our latest plan is to modify the implementation of ECMP for maintaining session persistence between\nthe client and the amphora，Therefore, the implementation described in this document will change. We have been busy with the development of the Optivia side recently. The latest ECMP code will be available after a period of time.","commit_id":"9588b38187b06ddcc4812e3946e71efbd6c4598c"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d5c30657493880def674c32b4c34b024ebe05ccf","unresolved":false,"context_lines":[{"line_number":125,"context_line":"Add function to handle ecmp_route for router_update event in L3 agent"},{"line_number":126,"context_line":"The function behavior like below:"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"* For each ecmp_router object, L3 agent should execute an pyroute2"},{"line_number":129,"context_line":"  code, which looks like"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"::"}],"source_content_type":"text/x-rst","patch_set":25,"id":"bf51134e_955e2843","line":128,"range":{"start_line":128,"start_character":11,"end_line":128,"end_character":22},"updated":"2020-07-02 20:49:53.000000000","message":"I don\u0027t understand why we need new attribute \"ecmp_router\" instead of reusing (maybe with some changes in the logic) existing \"extra_routes\".\nWhat if e.g. my ecmp_route will overlaps with extra_route in the router?","commit_id":"9588b38187b06ddcc4812e3946e71efbd6c4598c"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"5b50c15e910fbe8e56159fef7112f1b10d10c9ed","unresolved":false,"context_lines":[{"line_number":125,"context_line":"Add function to handle ecmp_route for router_update event in L3 agent"},{"line_number":126,"context_line":"The function behavior like below:"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"* For each ecmp_router object, L3 agent should execute an pyroute2"},{"line_number":129,"context_line":"  code, which looks like"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"::"}],"source_content_type":"text/x-rst","patch_set":25,"id":"bf51134e_3c38bd3b","line":128,"range":{"start_line":128,"start_character":11,"end_line":128,"end_character":22},"in_reply_to":"bf51134e_955e2843","updated":"2020-07-07 08:05:13.000000000","message":"The current extra_route processing logic is to execute a lunix command to add a route directly after receiving an update message, and if you want it to support ECMP, neutron need to query the database after receiving the request to see if there are extra_route entries with the same destination address on the same router, and if so, merge them into one ECMP route, which firstly increases the time complexity, and also breaks the original \"replace the route with the same destination address\" logic.\nAnd modifying the original routing table database format... I feel like it would break too much of the original code logic.\nAs for the case of overlaps extra routes, the original route will be replaced by the new route which has a same destination , I think it\u0027s logically correct.","commit_id":"9588b38187b06ddcc4812e3946e71efbd6c4598c"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"35cf4283aa51d1f2cd7198e2cfef69107e73cd23","unresolved":false,"context_lines":[{"line_number":211,"context_line":"  response:"},{"line_number":212,"context_line":"    none"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"Documentation Impact"},{"line_number":216,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":217,"context_line":""}],"source_content_type":"text/x-rst","patch_set":25,"id":"bf51134e_85b6a53d","line":214,"updated":"2020-06-24 14:54:09.000000000","message":"Please add a new section to elaborate the workflow of this function for the real end user.","commit_id":"9588b38187b06ddcc4812e3946e71efbd6c4598c"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"4fb1409f7b336e317329abad4ce39024394df36e","unresolved":false,"context_lines":[{"line_number":211,"context_line":"  response:"},{"line_number":212,"context_line":"    none"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"Documentation Impact"},{"line_number":216,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":217,"context_line":""}],"source_content_type":"text/x-rst","patch_set":25,"id":"bf51134e_48cb1949","line":214,"in_reply_to":"bf51134e_85b6a53d","updated":"2020-07-08 09:16:20.000000000","message":"How about \"User workflow\"?","commit_id":"9588b38187b06ddcc4812e3946e71efbd6c4598c"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"7afb40cfea860f4bc48a2dc339f15bfd22120f8d","unresolved":false,"context_lines":[{"line_number":211,"context_line":"  response:"},{"line_number":212,"context_line":"    none"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"Documentation Impact"},{"line_number":216,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":217,"context_line":""}],"source_content_type":"text/x-rst","patch_set":25,"id":"bf51134e_d1739fb0","line":214,"in_reply_to":"bf51134e_85b6a53d","updated":"2020-07-02 09:50:24.000000000","message":"Okay,but what section name should I use?","commit_id":"9588b38187b06ddcc4812e3946e71efbd6c4598c"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"35cf4283aa51d1f2cd7198e2cfef69107e73cd23","unresolved":false,"context_lines":[{"line_number":270,"context_line":"References"},{"line_number":271,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"[1] https://review.opendev.org/723735"},{"line_number":274,"context_line":"[2] https://bugs.launchpad.net/neutron/+bug/1880532"}],"source_content_type":"text/x-rst","patch_set":25,"id":"bf51134e_856185d6","line":274,"range":{"start_line":273,"start_character":0,"end_line":274,"end_character":51},"updated":"2020-06-24 14:54:09.000000000","message":"Where is the real quote of these link?","commit_id":"9588b38187b06ddcc4812e3946e71efbd6c4598c"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"7afb40cfea860f4bc48a2dc339f15bfd22120f8d","unresolved":false,"context_lines":[{"line_number":270,"context_line":"References"},{"line_number":271,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"[1] https://review.opendev.org/723735"},{"line_number":274,"context_line":"[2] https://bugs.launchpad.net/neutron/+bug/1880532"}],"source_content_type":"text/x-rst","patch_set":25,"id":"bf51134e_d1a8bfdc","line":274,"range":{"start_line":273,"start_character":0,"end_line":274,"end_character":51},"in_reply_to":"bf51134e_856185d6","updated":"2020-07-02 09:50:24.000000000","message":"It\u0027s a url mistake, I\u0027ll fix this.","commit_id":"9588b38187b06ddcc4812e3946e71efbd6c4598c"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":21,"context_line":"neutron can simply address ECMP by using pyroute2 and adding route entry"},{"line_number":22,"context_line":"into qrouter namespace."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"This feature is currently designed to support Octivia\u0027s multi-active scheme,"},{"line_number":25,"context_line":"allowing LoadBalancer in Octivia to have multiple amphora at the same time."},{"line_number":26,"context_line":"By configuring the ECMP route in the router, multiple amphoras can have a"},{"line_number":27,"context_line":"virtual IP at the same time to serve a set of functions that require high"}],"source_content_type":"text/x-rst","patch_set":26,"id":"bf51134e_7e102501","line":24,"range":{"start_line":24,"start_character":46,"end_line":24,"end_character":53},"updated":"2020-07-23 22:31:15.000000000","message":"Octavia","commit_id":"e1a752a81dca6e5c322bd94e2f53d18271a9210f"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":22,"context_line":"into qrouter namespace."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"This feature is currently designed to support Octivia\u0027s multi-active scheme,"},{"line_number":25,"context_line":"allowing LoadBalancer in Octivia to have multiple amphora at the same time."},{"line_number":26,"context_line":"By configuring the ECMP route in the router, multiple amphoras can have a"},{"line_number":27,"context_line":"virtual IP at the same time to serve a set of functions that require high"},{"line_number":28,"context_line":"concurrency support."}],"source_content_type":"text/x-rst","patch_set":26,"id":"bf51134e_def851c5","line":25,"range":{"start_line":25,"start_character":25,"end_line":25,"end_character":32},"updated":"2020-07-23 22:31:15.000000000","message":"Octavia","commit_id":"e1a752a81dca6e5c322bd94e2f53d18271a9210f"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":36,"context_line":"we have one \u003cnext_hop\u003e unreachable and remove it from ECMP route, all"},{"line_number":37,"context_line":"connections get redistributed.To avoid this, we intend to use a persistent"},{"line_number":38,"context_line":"hash instead of the original scheme. This scheme is based on hmark which added"},{"line_number":39,"context_line":"in iptables-1.4.15 or later.The histroy file of iptables:"},{"line_number":40,"context_line":"http://netfilter.org/projects/iptables/files/changes-iptables-1.4.15.txt"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"Then this spec describes how to implement ECMP in neutron."}],"source_content_type":"text/x-rst","patch_set":26,"id":"bf51134e_9eb25905","line":39,"range":{"start_line":39,"start_character":32,"end_line":39,"end_character":39},"updated":"2020-07-23 22:31:15.000000000","message":"history","commit_id":"e1a752a81dca6e5c322bd94e2f53d18271a9210f"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            |                                          |           |         +----------+"},{"line_number":76,"context_line":"            |                                          |           |         |  Tenant  |"},{"line_number":77,"context_line":"            |                                          |  ICMP     \u003c---------+Service(2)|"},{"line_number":78,"context_line":"            |                                          | DECTECT   |         |          |"},{"line_number":79,"context_line":"            |                                          |           |         +----------+"},{"line_number":80,"context_line":"            |                                          |           |"},{"line_number":81,"context_line":"            |               +-----------------------+  v           |         +----------+"}],"source_content_type":"text/x-rst","patch_set":26,"id":"bf51134e_fea555a0","line":78,"range":{"start_line":78,"start_character":57,"end_line":78,"end_character":64},"updated":"2020-07-23 22:31:15.000000000","message":"Is this the correct term here?","commit_id":"e1a752a81dca6e5c322bd94e2f53d18271a9210f"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            |         +-------------+                  |           |           ● ● ●"},{"line_number":89,"context_line":"            |         |Octavia Lbaas|                  |           |"},{"line_number":90,"context_line":"            \u003c---------+ Controller  |   ● ● ●          |  ICMP     |"},{"line_number":91,"context_line":"            |         +-------------+                  | DECTECT   |         +----------+"},{"line_number":92,"context_line":"            |                                          |           |         |  Tenant  |"},{"line_number":93,"context_line":"            |                                          |           \u003c---------+Service(M)|"},{"line_number":94,"context_line":"            |                                          |           |         |          |"}],"source_content_type":"text/x-rst","patch_set":26,"id":"bf51134e_3ebd0db7","line":91,"range":{"start_line":91,"start_character":57,"end_line":91,"end_character":64},"updated":"2020-07-23 22:31:15.000000000","message":"Ditto","commit_id":"e1a752a81dca6e5c322bd94e2f53d18271a9210f"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"7537260bc1c6b5c22637eacb5fbe9aa98fbf7231","unresolved":false,"context_lines":[{"line_number":219,"context_line":"In Server Side"},{"line_number":220,"context_line":"~~~~~~~~~~~~~~"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"* Implement an API extension named ``extraroute_ecmp``, In the extenstion"},{"line_number":223,"context_line":"  we should defined a resource named ``ecmp_route``. Then add processing"},{"line_number":224,"context_line":"  methods to make sure the L3RouterPlugin will handle it."},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"* Adding ecmp route to the router\u0027s subattributes, publish a router_update"},{"line_number":227,"context_line":"  event when receive a ecmp route request."}],"source_content_type":"text/x-rst","patch_set":26,"id":"bf51134e_f01efd6d","line":224,"range":{"start_line":222,"start_character":2,"end_line":224,"end_character":57},"updated":"2020-07-14 11:06:53.000000000","message":"After discussing in community, we decide not adding any new API, but change the existing logic of `update routes`","commit_id":"e1a752a81dca6e5c322bd94e2f53d18271a9210f"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"7537260bc1c6b5c22637eacb5fbe9aa98fbf7231","unresolved":false,"context_lines":[{"line_number":223,"context_line":"  we should defined a resource named ``ecmp_route``. Then add processing"},{"line_number":224,"context_line":"  methods to make sure the L3RouterPlugin will handle it."},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"* Adding ecmp route to the router\u0027s subattributes, publish a router_update"},{"line_number":227,"context_line":"  event when receive a ecmp route request."},{"line_number":228,"context_line":""},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"In Agent Side"}],"source_content_type":"text/x-rst","patch_set":26,"id":"bf51134e_eb33b2f4","line":227,"range":{"start_line":226,"start_character":0,"end_line":227,"end_character":42},"updated":"2020-07-14 11:06:53.000000000","message":"And no more extra resources","commit_id":"e1a752a81dca6e5c322bd94e2f53d18271a9210f"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"7537260bc1c6b5c22637eacb5fbe9aa98fbf7231","unresolved":false,"context_lines":[{"line_number":230,"context_line":"In Agent Side"},{"line_number":231,"context_line":"~~~~~~~~~~~~~"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"Add function to handle ecmp_route for router_update event in L3 agent"},{"line_number":234,"context_line":"The function behavior like below:"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"* For each ecmp_router object, L3 agent should execute an pyroute2"},{"line_number":237,"context_line":"  code, which looks like"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"::"},{"line_number":240,"context_line":""}],"source_content_type":"text/x-rst","patch_set":26,"id":"bf51134e_cb434e3e","line":237,"range":{"start_line":233,"start_character":0,"end_line":237,"end_character":24},"updated":"2020-07-14 11:06:53.000000000","message":"Instead, there will be some change in RouterInfo","commit_id":"e1a752a81dca6e5c322bd94e2f53d18271a9210f"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":21,"context_line":"neutron can simply address ECMP by using pyroute2 and adding route entry"},{"line_number":22,"context_line":"into qrouter namespace."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"This feature is currently designed to support Octivia\u0027s multi-active scheme,"},{"line_number":25,"context_line":"allowing LoadBalancer in Octivia to have multiple amphora at the same time."},{"line_number":26,"context_line":"By configuring the ECMP route in the router, multiple amphoras can have a"},{"line_number":27,"context_line":"virtual IP at the same time to serve a set of functions that require high"}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_22d084c9","line":24,"range":{"start_line":24,"start_character":46,"end_line":24,"end_character":53},"updated":"2020-07-23 22:31:15.000000000","message":"Octavia","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":22,"context_line":"into qrouter namespace."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"This feature is currently designed to support Octivia\u0027s multi-active scheme,"},{"line_number":25,"context_line":"allowing LoadBalancer in Octivia to have multiple amphora at the same time."},{"line_number":26,"context_line":"By configuring the ECMP route in the router, multiple amphoras can have a"},{"line_number":27,"context_line":"virtual IP at the same time to serve a set of functions that require high"},{"line_number":28,"context_line":"concurrency support."}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_02d3c0d6","line":25,"range":{"start_line":25,"start_character":25,"end_line":25,"end_character":32},"updated":"2020-07-23 22:31:15.000000000","message":"Octavia","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":36,"context_line":"we have one \u003cnexthop\u003e unreachable and remove it from ECMP route, all"},{"line_number":37,"context_line":"connections get redistributed. To avoid this, we intend to use a persistent"},{"line_number":38,"context_line":"hash instead of the original scheme. This scheme is based on hmark which added"},{"line_number":39,"context_line":"in iptables-1.4.15 or later. The histroy file of iptables:"},{"line_number":40,"context_line":"http://netfilter.org/projects/iptables/files/changes-iptables-1.4.15.txt"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"Then this spec describes how to implement ECMP in neutron."}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_62d9dcf2","line":39,"range":{"start_line":39,"start_character":33,"end_line":39,"end_character":40},"updated":"2020-07-23 22:31:15.000000000","message":"history","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":39,"context_line":"in iptables-1.4.15 or later. The histroy file of iptables:"},{"line_number":40,"context_line":"http://netfilter.org/projects/iptables/files/changes-iptables-1.4.15.txt"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"Then this spec describes how to implement ECMP in neutron."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"Problem Description"}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_82a5104a","line":42,"range":{"start_line":42,"start_character":50,"end_line":42,"end_character":57},"updated":"2020-07-23 22:31:15.000000000","message":"Neutron","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            |                                          |           |         +----------+"},{"line_number":76,"context_line":"            |                                          |           |         |  Tenant  |"},{"line_number":77,"context_line":"            |                                          |  ICMP     \u003c---------+Service(2)|"},{"line_number":78,"context_line":"            |                                          | DECTECT   |         |          |"},{"line_number":79,"context_line":"            |                                          |           |         +----------+"},{"line_number":80,"context_line":"            |                                          |           |"},{"line_number":81,"context_line":"            |               +-----------------------+  v           |         +----------+"}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_e2ee8c89","line":78,"range":{"start_line":78,"start_character":57,"end_line":78,"end_character":64},"updated":"2020-07-23 22:31:15.000000000","message":"Should it be DETECT?","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            |         +-------------+                  |           |           ● ● ●"},{"line_number":89,"context_line":"            |         |Octavia Lbaas|                  |           |"},{"line_number":90,"context_line":"            \u003c---------+ Controller  |   ● ● ●          |  ICMP     |"},{"line_number":91,"context_line":"            |         +-------------+                  | DECTECT   |         +----------+"},{"line_number":92,"context_line":"            |                                          |           |         |  Tenant  |"},{"line_number":93,"context_line":"            |                                          |           \u003c---------+Service(M)|"},{"line_number":94,"context_line":"            |                                          |           |         |          |"}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_c2f1c86c","line":91,"range":{"start_line":91,"start_character":57,"end_line":91,"end_character":64},"updated":"2020-07-23 22:31:15.000000000","message":"ditto","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"733ea921e536364c3f9af891bccc0d139420a763","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"* Multiple load balancing servers in a vip-subnet, sharing one virtual IP"},{"line_number":105,"context_line":"  and one or more back end pools to response clients\u0027 request, and each"},{"line_number":106,"context_line":"  loadbalancer has its own ip address."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"* Clients send requests to VIP.then qrouter distribute every single request"},{"line_number":109,"context_line":"  to a load balancing server which has the correct VIP configured on it."}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_68cedd83","line":106,"range":{"start_line":106,"start_character":27,"end_line":106,"end_character":29},"updated":"2020-07-24 01:35:22.000000000","message":"s/IP","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"733ea921e536364c3f9af891bccc0d139420a763","unresolved":false,"context_lines":[{"line_number":105,"context_line":"  and one or more back end pools to response clients\u0027 request, and each"},{"line_number":106,"context_line":"  loadbalancer has its own ip address."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"* Clients send requests to VIP.then qrouter distribute every single request"},{"line_number":109,"context_line":"  to a load balancing server which has the correct VIP configured on it."},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"* Finally load balancing server distribute the request to a back end. The"}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_a8c8f573","line":108,"range":{"start_line":108,"start_character":30,"end_line":108,"end_character":54},"updated":"2020-07-24 01:35:22.000000000","message":"s/, then the router distrubutes","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"733ea921e536364c3f9af891bccc0d139420a763","unresolved":false,"context_lines":[{"line_number":108,"context_line":"* Clients send requests to VIP.then qrouter distribute every single request"},{"line_number":109,"context_line":"  to a load balancing server which has the correct VIP configured on it."},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"* Finally load balancing server distribute the request to a back end. The"},{"line_number":112,"context_line":"  loadbalancers and tenant service vm can be in a same subnet or different"},{"line_number":113,"context_line":"  networks."},{"line_number":114,"context_line":""}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_88c37157","line":111,"range":{"start_line":111,"start_character":9,"end_line":111,"end_character":14},"updated":"2020-07-24 01:35:22.000000000","message":"s/, the load","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"733ea921e536364c3f9af891bccc0d139420a763","unresolved":false,"context_lines":[{"line_number":108,"context_line":"* Clients send requests to VIP.then qrouter distribute every single request"},{"line_number":109,"context_line":"  to a load balancing server which has the correct VIP configured on it."},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"* Finally load balancing server distribute the request to a back end. The"},{"line_number":112,"context_line":"  loadbalancers and tenant service vm can be in a same subnet or different"},{"line_number":113,"context_line":"  networks."},{"line_number":114,"context_line":""}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_e89f8d62","line":111,"range":{"start_line":111,"start_character":32,"end_line":111,"end_character":42},"updated":"2020-07-24 01:35:22.000000000","message":"s/distributes","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"733ea921e536364c3f9af891bccc0d139420a763","unresolved":false,"context_lines":[{"line_number":109,"context_line":"  to a load balancing server which has the correct VIP configured on it."},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"* Finally load balancing server distribute the request to a back end. The"},{"line_number":112,"context_line":"  loadbalancers and tenant service vm can be in a same subnet or different"},{"line_number":113,"context_line":"  networks."},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"In such a situation, Octavia need router to support ECMP for distributing"}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_c8a289ad","line":112,"range":{"start_line":112,"start_character":48,"end_line":112,"end_character":49},"updated":"2020-07-24 01:35:22.000000000","message":"s/the","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"733ea921e536364c3f9af891bccc0d139420a763","unresolved":false,"context_lines":[{"line_number":112,"context_line":"  loadbalancers and tenant service vm can be in a same subnet or different"},{"line_number":113,"context_line":"  networks."},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"In such a situation, Octavia need router to support ECMP for distributing"},{"line_number":116,"context_line":"requests. So Octavia can send request to Neutron for creating a ECMP route,"},{"line_number":117,"context_line":"then Neutron L3 agent execute command in qrouter namespace to create an ECMP"},{"line_number":118,"context_line":"entry in qrouter namespace, using VIP as the destination ip of the route\u0027s"}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_488e7932","line":115,"range":{"start_line":115,"start_character":29,"end_line":115,"end_character":33},"updated":"2020-07-24 01:35:22.000000000","message":"s/needs the","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"733ea921e536364c3f9af891bccc0d139420a763","unresolved":false,"context_lines":[{"line_number":113,"context_line":"  networks."},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"In such a situation, Octavia need router to support ECMP for distributing"},{"line_number":116,"context_line":"requests. So Octavia can send request to Neutron for creating a ECMP route,"},{"line_number":117,"context_line":"then Neutron L3 agent execute command in qrouter namespace to create an ECMP"},{"line_number":118,"context_line":"entry in qrouter namespace, using VIP as the destination ip of the route\u0027s"},{"line_number":119,"context_line":"entry, and several load balancers\u0027 ip as nexthop ip. So those requests having"}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_a89d9567","line":116,"range":{"start_line":116,"start_character":30,"end_line":116,"end_character":37},"updated":"2020-07-24 01:35:22.000000000","message":"s/a request","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"733ea921e536364c3f9af891bccc0d139420a763","unresolved":false,"context_lines":[{"line_number":116,"context_line":"requests. So Octavia can send request to Neutron for creating a ECMP route,"},{"line_number":117,"context_line":"then Neutron L3 agent execute command in qrouter namespace to create an ECMP"},{"line_number":118,"context_line":"entry in qrouter namespace, using VIP as the destination ip of the route\u0027s"},{"line_number":119,"context_line":"entry, and several load balancers\u0027 ip as nexthop ip. So those requests having"},{"line_number":120,"context_line":"VIP as their destinations can be distributed to each loadbalancer."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"The whole process implements two levels load balancing, i.e. load balancing"}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_08ada19a","line":119,"range":{"start_line":119,"start_character":35,"end_line":119,"end_character":37},"updated":"2020-07-24 01:35:22.000000000","message":"s/IP","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"733ea921e536364c3f9af891bccc0d139420a763","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"The whole process implements two levels load balancing, i.e. load balancing"},{"line_number":123,"context_line":"between multiple loadbalancers and load balancing between the backend"},{"line_number":124,"context_line":"real servers"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"Based on current public cloud operator implementations in production"},{"line_number":127,"context_line":"environments, tenants usually only see IPs in the same network, so"}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_c890c945","line":124,"updated":"2020-07-24 01:35:22.000000000","message":"Ok, so this paragraph finally made it clear for me.  A packet arrives at the neutron router, which NATs and forwards it to the backend network.  Instead of using ECMP to decide between which network (or maybe you want to do that to?), it\u0027s being used to decide the next-hop destination, which is one of the load-balancers.  Hopefully I\u0027m correct there.\n\nSo Octavia is still doing health monitoring and liveness detection, but has to do an additional step of updating the ECMP configuration in Neutron on a failure.  How quickly does this ECMP update need to be to have minimal packet loss?  For example, on a loaded system a router update could take many seconds or longer, is that sufficient?","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"1267c0bdba18cfc81390ee36c8513947db98153c","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"The whole process implements two levels load balancing, i.e. load balancing"},{"line_number":123,"context_line":"between multiple loadbalancers and load balancing between the backend"},{"line_number":124,"context_line":"real servers"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"Based on current public cloud operator implementations in production"},{"line_number":127,"context_line":"environments, tenants usually only see IPs in the same network, so"}],"source_content_type":"text/x-rst","patch_set":27,"id":"9f560f44_459216a0","line":124,"in_reply_to":"bf51134e_c890c945","updated":"2020-07-29 12:11:49.000000000","message":"Yes, it decides the next-hop destination.\nIt does take serveral seconds from the time a failure occurs to the time the ECMP route is finally updated. Of course we want this time to be as short as possible, but for a typical large physical network, the convergence time for a single point of failure is between 5 and 7 seconds, and I think it\u0027s OK as long as the ECMP convergence time is around 5 seconds.","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"733ea921e536364c3f9af891bccc0d139420a763","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"Based on current public cloud operator implementations in production"},{"line_number":127,"context_line":"environments, tenants usually only see IPs in the same network, so"},{"line_number":128,"context_line":"considering the same broadcast domain, the router needs to enable ARP"},{"line_number":129,"context_line":"answering on the corresponding interface.(User need to disable the"},{"line_number":130,"context_line":"ARP answering capability of vms in nexthops by themselves)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"User Workflow"}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_68a1bd95","line":129,"range":{"start_line":128,"start_character":66,"end_line":129,"end_character":9},"updated":"2020-07-24 01:35:22.000000000","message":"s/proxy ARP","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":137,"context_line":"::"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"  +------+      +--------+     +-------+   +--------+ +-------+ +------------+"},{"line_number":140,"context_line":"  |client|      |Octivia |     |Neutron|   |LB Node | |qrouter| |service pool|"},{"line_number":141,"context_line":"  +------+      +---+----+     +---+---+   +---+----+ +---+---+ +------+-----+"},{"line_number":142,"context_line":"    |create LB      |              |           |          |            |"},{"line_number":143,"context_line":"    +-------------\u003e | create ecmp  |           |          |            |"}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_a27f74a9","line":140,"range":{"start_line":140,"start_character":17,"end_line":140,"end_character":24},"updated":"2020-07-23 22:31:15.000000000","message":"Octavia","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"733ea921e536364c3f9af891bccc0d139420a763","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    |               | ecmp done    +-----------+---------\u003e+            |"},{"line_number":149,"context_line":"    |               +\u003c-------------|           |          |            |"},{"line_number":150,"context_line":"    |               | LB server boot done      |          |            |"},{"line_number":151,"context_line":"    |LB ser^ice done+\u003c-------------+-----------+          |            |"},{"line_number":152,"context_line":"    +\u003c--------------+              |           |          |            |"},{"line_number":153,"context_line":"    |               |              |           |          |            |"},{"line_number":154,"context_line":"    |               |              |           |          |            |"}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_2827c566","line":151,"range":{"start_line":151,"start_character":11,"end_line":151,"end_character":12},"updated":"2020-07-24 01:35:22.000000000","message":"s/v","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"733ea921e536364c3f9af891bccc0d139420a763","unresolved":false,"context_lines":[{"line_number":156,"context_line":"    +----------------------------------------------------\u003e|            |"},{"line_number":157,"context_line":"    |               |              |           |  pick a LB node       |"},{"line_number":158,"context_line":"    |               |              |           +\u003c---------|            |"},{"line_number":159,"context_line":"    |               |              |           | pick a ser^ice node   |"},{"line_number":160,"context_line":"    |               |              |           +----------------------\u003e+"},{"line_number":161,"context_line":"    |               |              |           |          |response    |"},{"line_number":162,"context_line":"    |               |              |           +\u003c----------------------+"}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_082ac12a","line":159,"range":{"start_line":159,"start_character":59,"end_line":159,"end_character":60},"updated":"2020-07-24 01:35:22.000000000","message":"s/v","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"733ea921e536364c3f9af891bccc0d139420a763","unresolved":false,"context_lines":[{"line_number":168,"context_line":""},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"Suppose a user has a set of services that require a multi-active"},{"line_number":171,"context_line":"load-balancing scheme, so the user send a request to Octivia to create a"},{"line_number":172,"context_line":"loadbalancer, specifying topology as multi-active. And post a vip-subnet"},{"line_number":173,"context_line":"to Octivia to assign an IP or directly post a virtual port (which is"},{"line_number":174,"context_line":"defined by Octivia, and then it requires user to submit parameters such"}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_e8baedde","line":171,"range":{"start_line":171,"start_character":53,"end_line":171,"end_character":60},"updated":"2020-07-24 01:35:22.000000000","message":"s/Octavia","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":170,"context_line":"Suppose a user has a set of services that require a multi-active"},{"line_number":171,"context_line":"load-balancing scheme, so the user send a request to Octivia to create a"},{"line_number":172,"context_line":"loadbalancer, specifying topology as multi-active. And post a vip-subnet"},{"line_number":173,"context_line":"to Octivia to assign an IP or directly post a virtual port (which is"},{"line_number":174,"context_line":"defined by Octivia, and then it requires user to submit parameters such"},{"line_number":175,"context_line":"as pool, member, listener, etc., but the latter are irrelevant to neutron,"},{"line_number":176,"context_line":"you can find them in Octivia document)"}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_827a30b7","line":173,"range":{"start_line":173,"start_character":3,"end_line":173,"end_character":11},"updated":"2020-07-23 22:31:15.000000000","message":"Octavia","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":171,"context_line":"load-balancing scheme, so the user send a request to Octivia to create a"},{"line_number":172,"context_line":"loadbalancer, specifying topology as multi-active. And post a vip-subnet"},{"line_number":173,"context_line":"to Octivia to assign an IP or directly post a virtual port (which is"},{"line_number":174,"context_line":"defined by Octivia, and then it requires user to submit parameters such"},{"line_number":175,"context_line":"as pool, member, listener, etc., but the latter are irrelevant to neutron,"},{"line_number":176,"context_line":"you can find them in Octivia document)"},{"line_number":177,"context_line":""}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_e24a0c81","line":174,"range":{"start_line":174,"start_character":11,"end_line":174,"end_character":18},"updated":"2020-07-23 22:31:15.000000000","message":"Octavia","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":172,"context_line":"loadbalancer, specifying topology as multi-active. And post a vip-subnet"},{"line_number":173,"context_line":"to Octivia to assign an IP or directly post a virtual port (which is"},{"line_number":174,"context_line":"defined by Octivia, and then it requires user to submit parameters such"},{"line_number":175,"context_line":"as pool, member, listener, etc., but the latter are irrelevant to neutron,"},{"line_number":176,"context_line":"you can find them in Octivia document)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"While Octivia creating loadbalancers, it will also send a `update_router`"}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_625efc45","line":175,"range":{"start_line":175,"start_character":66,"end_line":175,"end_character":73},"updated":"2020-07-23 22:31:15.000000000","message":"Neutron","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"733ea921e536364c3f9af891bccc0d139420a763","unresolved":false,"context_lines":[{"line_number":173,"context_line":"to Octivia to assign an IP or directly post a virtual port (which is"},{"line_number":174,"context_line":"defined by Octivia, and then it requires user to submit parameters such"},{"line_number":175,"context_line":"as pool, member, listener, etc., but the latter are irrelevant to neutron,"},{"line_number":176,"context_line":"you can find them in Octivia document)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"While Octivia creating loadbalancers, it will also send a `update_router`"},{"line_number":179,"context_line":"request or a `add_extraroutes` request to neutron, post severval `routes`"}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_a81ab513","line":176,"range":{"start_line":176,"start_character":21,"end_line":176,"end_character":28},"updated":"2020-07-24 01:35:22.000000000","message":"s/Octavia","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":175,"context_line":"as pool, member, listener, etc., but the latter are irrelevant to neutron,"},{"line_number":176,"context_line":"you can find them in Octivia document)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"While Octivia creating loadbalancers, it will also send a `update_router`"},{"line_number":179,"context_line":"request or a `add_extraroutes` request to neutron, post severval `routes`"},{"line_number":180,"context_line":"entries with same `destination` param, and load balancers\u0027 IPs as"},{"line_number":181,"context_line":"`nexthop` param."}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_82535039","line":178,"range":{"start_line":178,"start_character":56,"end_line":178,"end_character":57},"updated":"2020-07-23 22:31:15.000000000","message":"an","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":175,"context_line":"as pool, member, listener, etc., but the latter are irrelevant to neutron,"},{"line_number":176,"context_line":"you can find them in Octivia document)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"While Octivia creating loadbalancers, it will also send a `update_router`"},{"line_number":179,"context_line":"request or a `add_extraroutes` request to neutron, post severval `routes`"},{"line_number":180,"context_line":"entries with same `destination` param, and load balancers\u0027 IPs as"},{"line_number":181,"context_line":"`nexthop` param."}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_42593859","line":178,"range":{"start_line":178,"start_character":14,"end_line":178,"end_character":22},"updated":"2020-07-23 22:31:15.000000000","message":"is creating","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"733ea921e536364c3f9af891bccc0d139420a763","unresolved":false,"context_lines":[{"line_number":175,"context_line":"as pool, member, listener, etc., but the latter are irrelevant to neutron,"},{"line_number":176,"context_line":"you can find them in Octivia document)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"While Octivia creating loadbalancers, it will also send a `update_router`"},{"line_number":179,"context_line":"request or a `add_extraroutes` request to neutron, post severval `routes`"},{"line_number":180,"context_line":"entries with same `destination` param, and load balancers\u0027 IPs as"},{"line_number":181,"context_line":"`nexthop` param."}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_e8d14d31","line":178,"range":{"start_line":178,"start_character":6,"end_line":178,"end_character":13},"updated":"2020-07-24 01:35:22.000000000","message":"s/Octavia","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":176,"context_line":"you can find them in Octivia document)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"While Octivia creating loadbalancers, it will also send a `update_router`"},{"line_number":179,"context_line":"request or a `add_extraroutes` request to neutron, post severval `routes`"},{"line_number":180,"context_line":"entries with same `destination` param, and load balancers\u0027 IPs as"},{"line_number":181,"context_line":"`nexthop` param."},{"line_number":182,"context_line":""}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_223a44e6","line":179,"range":{"start_line":179,"start_character":42,"end_line":179,"end_character":49},"updated":"2020-07-23 22:31:15.000000000","message":"Neutron","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":180,"context_line":"entries with same `destination` param, and load balancers\u0027 IPs as"},{"line_number":181,"context_line":"`nexthop` param."},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"Neutron receive the request from Octivia, Determines whether to add an ECMP"},{"line_number":184,"context_line":"route by calculating whether there are multiple routes with the same"},{"line_number":185,"context_line":"destination address, make sure the qouter will distribute those packets"},{"line_number":186,"context_line":"with vip as their destination."}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_421e5874","line":183,"range":{"start_line":183,"start_character":33,"end_line":183,"end_character":40},"updated":"2020-07-23 22:31:15.000000000","message":"Octavia","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":180,"context_line":"entries with same `destination` param, and load balancers\u0027 IPs as"},{"line_number":181,"context_line":"`nexthop` param."},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"Neutron receive the request from Octivia, Determines whether to add an ECMP"},{"line_number":184,"context_line":"route by calculating whether there are multiple routes with the same"},{"line_number":185,"context_line":"destination address, make sure the qouter will distribute those packets"},{"line_number":186,"context_line":"with vip as their destination."}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_82287097","line":183,"range":{"start_line":183,"start_character":42,"end_line":183,"end_character":52},"updated":"2020-07-23 22:31:15.000000000","message":"determines","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":180,"context_line":"entries with same `destination` param, and load balancers\u0027 IPs as"},{"line_number":181,"context_line":"`nexthop` param."},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"Neutron receive the request from Octivia, Determines whether to add an ECMP"},{"line_number":184,"context_line":"route by calculating whether there are multiple routes with the same"},{"line_number":185,"context_line":"destination address, make sure the qouter will distribute those packets"},{"line_number":186,"context_line":"with vip as their destination."}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_c21b887d","line":183,"range":{"start_line":183,"start_character":8,"end_line":183,"end_character":15},"updated":"2020-07-23 22:31:15.000000000","message":"receives","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"Neutron receive the request from Octivia, Determines whether to add an ECMP"},{"line_number":184,"context_line":"route by calculating whether there are multiple routes with the same"},{"line_number":185,"context_line":"destination address, make sure the qouter will distribute those packets"},{"line_number":186,"context_line":"with vip as their destination."},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"Those ECMP routes will be removed when user drop the multi-active"}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_22136468","line":185,"range":{"start_line":185,"start_character":21,"end_line":185,"end_character":25},"updated":"2020-07-23 22:31:15.000000000","message":"making","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"733ea921e536364c3f9af891bccc0d139420a763","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"Neutron receive the request from Octivia, Determines whether to add an ECMP"},{"line_number":184,"context_line":"route by calculating whether there are multiple routes with the same"},{"line_number":185,"context_line":"destination address, make sure the qouter will distribute those packets"},{"line_number":186,"context_line":"with vip as their destination."},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"Those ECMP routes will be removed when user drop the multi-active"}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_68e53d0a","line":185,"range":{"start_line":185,"start_character":35,"end_line":185,"end_character":41},"updated":"2020-07-24 01:35:22.000000000","message":"s/neutron router or just router\n\nShould probably do this throughout instead of qrouter","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":185,"context_line":"destination address, make sure the qouter will distribute those packets"},{"line_number":186,"context_line":"with vip as their destination."},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"Those ECMP routes will be removed when user drop the multi-active"},{"line_number":189,"context_line":"loadbalancer, and it could be modified when add or remove a loadbalance"},{"line_number":190,"context_line":"node."},{"line_number":191,"context_line":""}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_4207781e","line":188,"range":{"start_line":188,"start_character":44,"end_line":188,"end_character":48},"updated":"2020-07-23 22:31:15.000000000","message":"drops","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":186,"context_line":"with vip as their destination."},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"Those ECMP routes will be removed when user drop the multi-active"},{"line_number":189,"context_line":"loadbalancer, and it could be modified when add or remove a loadbalance"},{"line_number":190,"context_line":"node."},{"line_number":191,"context_line":""},{"line_number":192,"context_line":""}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_a206541f","line":189,"range":{"start_line":189,"start_character":44,"end_line":189,"end_character":47},"updated":"2020-07-23 22:31:15.000000000","message":"adding","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":186,"context_line":"with vip as their destination."},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"Those ECMP routes will be removed when user drop the multi-active"},{"line_number":189,"context_line":"loadbalancer, and it could be modified when add or remove a loadbalance"},{"line_number":190,"context_line":"node."},{"line_number":191,"context_line":""},{"line_number":192,"context_line":""}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_ddfd2909","line":189,"range":{"start_line":189,"start_character":51,"end_line":189,"end_character":57},"updated":"2020-07-23 22:31:15.000000000","message":"removing","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":196,"context_line":"* The intranet client requests mac address of the VIP and accesses the"},{"line_number":197,"context_line":"  service based on this mac address."},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"* [`p2`_] The extranet client accesses thetenant service via floating IP."},{"line_number":200,"context_line":"  This need to improve existing neutron `floatingips` API."},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"* When the intranet client requests mac address of the VIP, the qrouter"}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_bd003502","line":199,"range":{"start_line":199,"start_character":39,"end_line":199,"end_character":48},"updated":"2020-07-23 22:31:15.000000000","message":"the tenant","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"733ea921e536364c3f9af891bccc0d139420a763","unresolved":false,"context_lines":[{"line_number":203,"context_line":"  will use gateway MAC address to respond, the client\u0027s datagram will"},{"line_number":204,"context_line":"  be transmitted to the qrouter first."},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"* The qrouter gateway queries ECMP routing entries then forwards the"},{"line_number":207,"context_line":"  client\u0027s packets to the load balancers()"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"* Load balancer accepts connections from clients, receives traffic, then"}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_e8b66ddc","line":206,"range":{"start_line":206,"start_character":22,"end_line":206,"end_character":34},"updated":"2020-07-24 01:35:22.000000000","message":"It\u0027s just forwarding, right?  There\u0027s no additional query?","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"1267c0bdba18cfc81390ee36c8513947db98153c","unresolved":false,"context_lines":[{"line_number":203,"context_line":"  will use gateway MAC address to respond, the client\u0027s datagram will"},{"line_number":204,"context_line":"  be transmitted to the qrouter first."},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"* The qrouter gateway queries ECMP routing entries then forwards the"},{"line_number":207,"context_line":"  client\u0027s packets to the load balancers()"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"* Load balancer accepts connections from clients, receives traffic, then"}],"source_content_type":"text/x-rst","patch_set":27,"id":"9f560f44_c29f3c01","line":206,"range":{"start_line":206,"start_character":22,"end_line":206,"end_character":34},"in_reply_to":"bf51134e_e8b66ddc","updated":"2020-07-29 12:11:49.000000000","message":"Yes, just forwarding.","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":204,"context_line":"  be transmitted to the qrouter first."},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"* The qrouter gateway queries ECMP routing entries then forwards the"},{"line_number":207,"context_line":"  client\u0027s packets to the load balancers()"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"* Load balancer accepts connections from clients, receives traffic, then"},{"line_number":210,"context_line":"  distributes it to the back-end server pool."}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_fd0aad1d","line":207,"range":{"start_line":207,"start_character":40,"end_line":207,"end_character":42},"updated":"2020-07-23 22:31:15.000000000","message":"is this needed?","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":238,"context_line":"  ip.route(\u0027replace\u0027, dst\u003d\u0027\u003cdestination_ip\u003e\u0027,multipath\u003d[{\"gateway\":"},{"line_number":239,"context_line":"  \"\u003cnexthop1\u003e\"},{\"gateway\":\"\u003cnexthop2\u003e\"}])"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"* Then there will an ip route entry in the namespace, it looks like"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"::"},{"line_number":244,"context_line":""}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_1d2161a0","line":241,"range":{"start_line":241,"start_character":54,"end_line":241,"end_character":56},"updated":"2020-07-23 22:31:15.000000000","message":"which","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":238,"context_line":"  ip.route(\u0027replace\u0027, dst\u003d\u0027\u003cdestination_ip\u003e\u0027,multipath\u003d[{\"gateway\":"},{"line_number":239,"context_line":"  \"\u003cnexthop1\u003e\"},{\"gateway\":\"\u003cnexthop2\u003e\"}])"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"* Then there will an ip route entry in the namespace, it looks like"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"::"},{"line_number":244,"context_line":""}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_bd29558a","line":241,"range":{"start_line":241,"start_character":13,"end_line":241,"end_character":17},"updated":"2020-07-23 22:31:15.000000000","message":"will be","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":249,"context_line":"Then router will randomlly pick a \u003cnexthop_ip\u003e and fill its mac address into"},{"line_number":250,"context_line":"the package\u0027s dst_mac address when it wants to get to the \u003cdestination_ip\u003e."},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"[`p2`_]For keeping connection while remove a loadbalance node, use iptables"},{"line_number":253,"context_line":"instead of simply a ip route entry."},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"  -  Use `HMARK` in mangle table, marking flows with a number:"}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_1d568107","line":252,"range":{"start_line":252,"start_character":45,"end_line":252,"end_character":56},"updated":"2020-07-23 22:31:15.000000000","message":"loadbalancer","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":249,"context_line":"Then router will randomlly pick a \u003cnexthop_ip\u003e and fill its mac address into"},{"line_number":250,"context_line":"the package\u0027s dst_mac address when it wants to get to the \u003cdestination_ip\u003e."},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"[`p2`_]For keeping connection while remove a loadbalance node, use iptables"},{"line_number":253,"context_line":"instead of simply a ip route entry."},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"  -  Use `HMARK` in mangle table, marking flows with a number:"}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_7d2fbd87","line":252,"range":{"start_line":252,"start_character":36,"end_line":252,"end_character":42},"updated":"2020-07-23 22:31:15.000000000","message":"removing","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":286,"context_line":"    ip route del fwmark \u003cX + 0\u003e"},{"line_number":287,"context_line":"    ip route add fwmark \u003cX + 0\u003e table \u003cX + 1\u003e pref 100"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"In order to let those traffic from the same network to pass through the"},{"line_number":290,"context_line":"router, L3 agent will also let router to use Proxy ARP by setting command::"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"  sysctl -w net.ipv4.conf.\u003cNIC_1\u003e.proxy_arp\u003d1"}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_9d49f161","line":289,"range":{"start_line":289,"start_character":16,"end_line":289,"end_character":21},"updated":"2020-07-23 22:31:15.000000000","message":"not needed","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"260e1b3a618065c429efaf8c00f2ce4a7ae283cc","unresolved":false,"context_lines":[{"line_number":297,"context_line":""},{"line_number":298,"context_line":"Data Model Impact"},{"line_number":299,"context_line":"-----------------"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"REST API Impact"},{"line_number":303,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":27,"id":"bf51134e_bd77959f","line":300,"updated":"2020-07-23 22:31:15.000000000","message":"None","commit_id":"267de087bdc8725ddd64837b93795ce2349ea028"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"c42ad35a80465b64a3539189432aa962647e4e4c","unresolved":false,"context_lines":[{"line_number":176,"context_line":"pool, member, listener, etc., but the latter are irrelevant to Neutron,"},{"line_number":177,"context_line":"you can find them in Octavia document."},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"While Octavia is creating a loadbalancer, it will also send an `update_router`"},{"line_number":180,"context_line":"request or an `add_extraroutes` request to Neutron, post severval `routes`"},{"line_number":181,"context_line":"entries with same `destination` param, and load balancers\u0027 IPs as"},{"line_number":182,"context_line":"`nexthop` param."},{"line_number":183,"context_line":""}],"source_content_type":"text/x-rst","patch_set":28,"id":"9f560f44_9a9f5702","line":180,"range":{"start_line":179,"start_character":55,"end_line":180,"end_character":50},"updated":"2020-07-30 08:49:50.000000000","message":"I think that the only way we should do it is with add_extraroutes as update_router to modify extraroutes is racy and should be deprecated really.","commit_id":"11260b62c9d7b2bb868d41e28a872c5e063d818f"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"ac9d27bde0b93da6a8c1f6bbf38a4517b702c0e9","unresolved":false,"context_lines":[{"line_number":176,"context_line":"pool, member, listener, etc., but the latter are irrelevant to Neutron,"},{"line_number":177,"context_line":"you can find them in Octavia document."},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"While Octavia is creating a loadbalancer, it will also send an `update_router`"},{"line_number":180,"context_line":"request or an `add_extraroutes` request to Neutron, post severval `routes`"},{"line_number":181,"context_line":"entries with same `destination` param, and load balancers\u0027 IPs as"},{"line_number":182,"context_line":"`nexthop` param."},{"line_number":183,"context_line":""}],"source_content_type":"text/x-rst","patch_set":28,"id":"9f560f44_20a41eb9","line":180,"range":{"start_line":179,"start_character":55,"end_line":180,"end_character":50},"in_reply_to":"9f560f44_9a9f5702","updated":"2020-07-30 10:43:19.000000000","message":"Yes, I myself prefer \"add_extratoutes\", but for Octatia, the neutronclient it uses to call the Neutron\u0027s API didn\u0027t support the use of \"add_extratoutes API\" until version 6.14.0. For pre-Train versions of openstack, using an \"update router\" would be more compatible.","commit_id":"11260b62c9d7b2bb868d41e28a872c5e063d818f"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"32c26253908b09dce631a05e9c4fce5f7e70baf8","unresolved":false,"context_lines":[{"line_number":236,"context_line":""},{"line_number":237,"context_line":"::"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"  ip.route(\u0027replace\u0027, dst\u003d\u0027\u003cdestination_ip\u003e\u0027,multipath\u003d[{\"gateway\":"},{"line_number":240,"context_line":"  \"\u003cnexthop1\u003e\"},{\"gateway\":\"\u003cnexthop2\u003e\"}])"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"* Then there will be an ip route entry in the namespace, which looks like"},{"line_number":243,"context_line":""}],"source_content_type":"text/x-rst","patch_set":28,"id":"9f560f44_19c5238f","line":240,"range":{"start_line":239,"start_character":0,"end_line":240,"end_character":42},"updated":"2020-08-17 13:27:19.000000000","message":"In the POC, this is not applied.","commit_id":"11260b62c9d7b2bb868d41e28a872c5e063d818f"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"da1dd07e314b90c5d2b3b3ba80e83ab70081c541","unresolved":false,"context_lines":[{"line_number":236,"context_line":""},{"line_number":237,"context_line":"::"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"  ip.route(\u0027replace\u0027, dst\u003d\u0027\u003cdestination_ip\u003e\u0027,multipath\u003d[{\"gateway\":"},{"line_number":240,"context_line":"  \"\u003cnexthop1\u003e\"},{\"gateway\":\"\u003cnexthop2\u003e\"}])"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"* Then there will be an ip route entry in the namespace, which looks like"},{"line_number":243,"context_line":""}],"source_content_type":"text/x-rst","patch_set":28,"id":"9f560f44_403672b6","line":240,"range":{"start_line":239,"start_character":0,"end_line":240,"end_character":42},"in_reply_to":"9f560f44_19c5238f","updated":"2020-08-18 08:07:11.000000000","message":"I will change the POC side","commit_id":"11260b62c9d7b2bb868d41e28a872c5e063d818f"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"6cae5d0cd634b75032a7be503dc9cb0ca66aa093","unresolved":false,"context_lines":[{"line_number":260,"context_line":"    iptables -t mangle -A PREROUTING -p tcp -d \u003cvip\u003e -j HMARK \\"},{"line_number":261,"context_line":"    --hmark-tuple src --hmark-mod \u003cN\u003e --hmark-rnd 0xcafeface --hmark-offset X"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"  -  N \u003d the number of the loadbalancers"},{"line_number":264,"context_line":"     X \u003d the number of the offset where the ecmp table start"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"  -  Distribute flows to different tables by `fwmark` value:"},{"line_number":267,"context_line":""}],"source_content_type":"text/x-rst","patch_set":28,"id":"9f560f44_c2040a1b","line":264,"range":{"start_line":263,"start_character":0,"end_line":264,"end_character":60},"updated":"2020-08-21 06:53:14.000000000","message":"These two explanations are in the same line in the real rendered doc.\n\nhttps://storage.gra.cloud.ovh.net/v1/AUTH_dcaab5e32b234d56b626f72581e3644c/zuul_opendev_logs_0a3/729532/28/check/openstack-tox-docs/0a315e2/docs/specs/victoria/l3-router-support-ecmp.html#p2","commit_id":"11260b62c9d7b2bb868d41e28a872c5e063d818f"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"b4bcf92a10929de8e54557d7f4a46dadb2938451","unresolved":false,"context_lines":[{"line_number":260,"context_line":"    iptables -t mangle -A PREROUTING -p tcp -d \u003cvip\u003e -j HMARK \\"},{"line_number":261,"context_line":"    --hmark-tuple src --hmark-mod \u003cN\u003e --hmark-rnd 0xcafeface --hmark-offset X"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"  -  N \u003d the number of the loadbalancers"},{"line_number":264,"context_line":"     X \u003d the number of the offset where the ecmp table start"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"  -  Distribute flows to different tables by `fwmark` value:"},{"line_number":267,"context_line":""}],"source_content_type":"text/x-rst","patch_set":28,"id":"9f560f44_708d3f29","line":264,"range":{"start_line":263,"start_character":0,"end_line":264,"end_character":60},"in_reply_to":"9f560f44_c2040a1b","updated":"2020-09-03 03:09:54.000000000","message":"Done, Is there any way I can detect this error?","commit_id":"11260b62c9d7b2bb868d41e28a872c5e063d818f"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"6cae5d0cd634b75032a7be503dc9cb0ca66aa093","unresolved":false,"context_lines":[{"line_number":252,"context_line":""},{"line_number":253,"context_line":"[`p2`_]For keeping connection while removing a load balancing node, use"},{"line_number":254,"context_line":"iptables instead of simply a ip route entry."},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"  -  Use `HMARK` in mangle table, marking flows with a number:"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"  ::"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    iptables -t mangle -A PREROUTING -p tcp -d \u003cvip\u003e -j HMARK \\"},{"line_number":261,"context_line":"    --hmark-tuple src --hmark-mod \u003cN\u003e --hmark-rnd 0xcafeface --hmark-offset X"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"  -  N \u003d the number of the loadbalancers"},{"line_number":264,"context_line":"     X \u003d the number of the offset where the ecmp table start"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"  -  Distribute flows to different tables by `fwmark` value:"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"  ::"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"    ip route add fwmark \u003cX + 0\u003e table \u003cX + 0\u003e pref 100"},{"line_number":271,"context_line":"    ip route add fwmark \u003cX + 1\u003e table \u003cX + 1\u003e pref 100"},{"line_number":272,"context_line":"    ..."},{"line_number":273,"context_line":"    ip route add fwmark \u003cX + N - 1\u003e table \u003cX + N - 1\u003e pref 100"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"  - For each table, give it a default \u003cnexthop_ip\u003e"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"  ::"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"    ip route add default via \u003cnexthop_ip1\u003e table \u003cX+0\u003e"},{"line_number":281,"context_line":"    ip route add default via \u003cnexthop_ip2\u003e table \u003cX+1\u003e"},{"line_number":282,"context_line":"    ..."},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"  - If \u003cnexthop_ip1\u003e is not reachable for the time:"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"  ::"},{"line_number":287,"context_line":"    ip route del fwmark \u003cX + 0\u003e"},{"line_number":288,"context_line":"    ip route add fwmark \u003cX + 0\u003e table \u003cX + 1\u003e pref 100"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"In order to let traffic from the same network to pass through the router,"},{"line_number":291,"context_line":"L3 agent will also let router to use Proxy ARP by setting command::"}],"source_content_type":"text/x-rst","patch_set":28,"id":"9f560f44_6d3c0fc8","line":288,"range":{"start_line":255,"start_character":0,"end_line":288,"end_character":54},"updated":"2020-08-21 06:53:14.000000000","message":"Are you intend to make all these lines in a same section?","commit_id":"11260b62c9d7b2bb868d41e28a872c5e063d818f"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"b4bcf92a10929de8e54557d7f4a46dadb2938451","unresolved":false,"context_lines":[{"line_number":252,"context_line":""},{"line_number":253,"context_line":"[`p2`_]For keeping connection while removing a load balancing node, use"},{"line_number":254,"context_line":"iptables instead of simply a ip route entry."},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"  -  Use `HMARK` in mangle table, marking flows with a number:"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"  ::"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    iptables -t mangle -A PREROUTING -p tcp -d \u003cvip\u003e -j HMARK \\"},{"line_number":261,"context_line":"    --hmark-tuple src --hmark-mod \u003cN\u003e --hmark-rnd 0xcafeface --hmark-offset X"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"  -  N \u003d the number of the loadbalancers"},{"line_number":264,"context_line":"     X \u003d the number of the offset where the ecmp table start"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"  -  Distribute flows to different tables by `fwmark` value:"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"  ::"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"    ip route add fwmark \u003cX + 0\u003e table \u003cX + 0\u003e pref 100"},{"line_number":271,"context_line":"    ip route add fwmark \u003cX + 1\u003e table \u003cX + 1\u003e pref 100"},{"line_number":272,"context_line":"    ..."},{"line_number":273,"context_line":"    ip route add fwmark \u003cX + N - 1\u003e table \u003cX + N - 1\u003e pref 100"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"  - For each table, give it a default \u003cnexthop_ip\u003e"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"  ::"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"    ip route add default via \u003cnexthop_ip1\u003e table \u003cX+0\u003e"},{"line_number":281,"context_line":"    ip route add default via \u003cnexthop_ip2\u003e table \u003cX+1\u003e"},{"line_number":282,"context_line":"    ..."},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"  - If \u003cnexthop_ip1\u003e is not reachable for the time:"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"  ::"},{"line_number":287,"context_line":"    ip route del fwmark \u003cX + 0\u003e"},{"line_number":288,"context_line":"    ip route add fwmark \u003cX + 0\u003e table \u003cX + 1\u003e pref 100"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"In order to let traffic from the same network to pass through the router,"},{"line_number":291,"context_line":"L3 agent will also let router to use Proxy ARP by setting command::"}],"source_content_type":"text/x-rst","patch_set":28,"id":"9f560f44_f0e4af10","line":288,"range":{"start_line":255,"start_character":0,"end_line":288,"end_character":54},"in_reply_to":"9f560f44_6d3c0fc8","updated":"2020-09-03 03:09:54.000000000","message":"yes","commit_id":"11260b62c9d7b2bb868d41e28a872c5e063d818f"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"c42ad35a80465b64a3539189432aa962647e4e4c","unresolved":false,"context_lines":[{"line_number":316,"context_line":"Before the changes in this file, when L3 agent receive a route having"},{"line_number":317,"context_line":"an existing destination and a different hexthop, it will replace the"},{"line_number":318,"context_line":"old route with the new one. But now after these changes, there will be"},{"line_number":319,"context_line":"a ECMP route in the router."},{"line_number":320,"context_line":""},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"Documentation Impact"}],"source_content_type":"text/x-rst","patch_set":28,"id":"9f560f44_dab1cf91","line":319,"updated":"2020-07-30 08:49:50.000000000","message":"just a note: so we will need new API extension to make this change discoverable.","commit_id":"11260b62c9d7b2bb868d41e28a872c5e063d818f"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"30f4b595359d69382dfbdb891af847a60afd945b","unresolved":false,"context_lines":[{"line_number":377,"context_line":"References"},{"line_number":378,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"[1] https://review.opendev.org/723864"},{"line_number":381,"context_line":"[2] https://bugs.launchpad.net/neutron/+bug/1880532"},{"line_number":382,"context_line":"[3] https://github.com/z503755743/NEUTRON-ECMP"},{"line_number":383,"context_line":"[4] http://netfilter.org/projects/iptables/files/changes-iptables-1.4.15.txt"},{"line_number":384,"context_line":""}],"source_content_type":"text/x-rst","patch_set":28,"id":"9f560f44_ae102faa","line":383,"range":{"start_line":380,"start_character":0,"end_line":383,"end_character":76},"updated":"2020-08-17 12:56:47.000000000","message":"where is the real quote of these refs?","commit_id":"11260b62c9d7b2bb868d41e28a872c5e063d818f"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"b4bcf92a10929de8e54557d7f4a46dadb2938451","unresolved":false,"context_lines":[{"line_number":377,"context_line":"References"},{"line_number":378,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"[1] https://review.opendev.org/723864"},{"line_number":381,"context_line":"[2] https://bugs.launchpad.net/neutron/+bug/1880532"},{"line_number":382,"context_line":"[3] https://github.com/z503755743/NEUTRON-ECMP"},{"line_number":383,"context_line":"[4] http://netfilter.org/projects/iptables/files/changes-iptables-1.4.15.txt"},{"line_number":384,"context_line":""}],"source_content_type":"text/x-rst","patch_set":28,"id":"9f560f44_70b6dfde","line":383,"range":{"start_line":380,"start_character":0,"end_line":383,"end_character":76},"in_reply_to":"9f560f44_42e75aad","updated":"2020-09-03 03:09:54.000000000","message":"Done, thanks for your guidance.","commit_id":"11260b62c9d7b2bb868d41e28a872c5e063d818f"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"6cae5d0cd634b75032a7be503dc9cb0ca66aa093","unresolved":false,"context_lines":[{"line_number":377,"context_line":"References"},{"line_number":378,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"[1] https://review.opendev.org/723864"},{"line_number":381,"context_line":"[2] https://bugs.launchpad.net/neutron/+bug/1880532"},{"line_number":382,"context_line":"[3] https://github.com/z503755743/NEUTRON-ECMP"},{"line_number":383,"context_line":"[4] http://netfilter.org/projects/iptables/files/changes-iptables-1.4.15.txt"},{"line_number":384,"context_line":""}],"source_content_type":"text/x-rst","patch_set":28,"id":"9f560f44_42e75aad","line":383,"range":{"start_line":380,"start_character":0,"end_line":383,"end_character":76},"in_reply_to":"9f560f44_a0bf8efa","updated":"2020-08-21 06:53:14.000000000","message":"For these refs, you could use \".. [1]\", \".. [2]\" as the perfix of the number. And then you could use the quote mark \"[1]_\" \"[2]_\" ... after the word or line. In the real rendered doc, these will be a quick link. Please see an example here:\nhttps://review.opendev.org/#/c/658414/19/specs/ussuri/ml2ovs-ovn-convergence.rst@273\nhttps://specs.openstack.org/openstack//neutron-specs/specs/ussuri/ml2ovs-ovn-convergence.html#id19\n\nBesides, in the rendered doc, these 4 refs are in same line.\nhttps://storage.gra.cloud.ovh.net/v1/AUTH_dcaab5e32b234d56b626f72581e3644c/zuul_opendev_logs_0a3/729532/28/check/openstack-tox-docs/0a315e2/docs/specs/victoria/l3-router-support-ecmp.html#p2","commit_id":"11260b62c9d7b2bb868d41e28a872c5e063d818f"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"da1dd07e314b90c5d2b3b3ba80e83ab70081c541","unresolved":false,"context_lines":[{"line_number":377,"context_line":"References"},{"line_number":378,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"[1] https://review.opendev.org/723864"},{"line_number":381,"context_line":"[2] https://bugs.launchpad.net/neutron/+bug/1880532"},{"line_number":382,"context_line":"[3] https://github.com/z503755743/NEUTRON-ECMP"},{"line_number":383,"context_line":"[4] http://netfilter.org/projects/iptables/files/changes-iptables-1.4.15.txt"},{"line_number":384,"context_line":""}],"source_content_type":"text/x-rst","patch_set":28,"id":"9f560f44_a0bf8efa","line":383,"range":{"start_line":380,"start_character":0,"end_line":383,"end_character":76},"in_reply_to":"9f560f44_ae102faa","updated":"2020-08-18 08:07:11.000000000","message":"Line #12 #14 #40 #49","commit_id":"11260b62c9d7b2bb868d41e28a872c5e063d818f"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"03fd391e09ce50ce350fc4b40c47c1748fd45c01","unresolved":false,"context_lines":[{"line_number":8,"context_line":"L3 router support ECMP"},{"line_number":9,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Blueprint:"},{"line_number":12,"context_line":"https://blueprints.launchpad.net/neutron/+spec/support-for-ecmp"},{"line_number":13,"context_line":"Launchpad Bug:"},{"line_number":14,"context_line":"https://bugs.launchpad.net/neutron/+bug/1880532"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"ECMP is a kind of routing technology which allows multiple different links"},{"line_number":17,"context_line":"reach the same destination. Neutron does not need to calculate the equivalent"}],"source_content_type":"text/x-rst","patch_set":29,"id":"9f560f44_f3d14231","line":14,"range":{"start_line":11,"start_character":0,"end_line":14,"end_character":47},"updated":"2020-09-04 06:50:16.000000000","message":"These sentences are in same line\n\nhttps://4e0fce9ec7904c1e25f0-95a2136c445cc9f6f88a9d6c838f9ef5.ssl.cf1.rackcdn.com/729532/29/check/openstack-tox-docs/fcb179a/docs/specs/victoria/l3-router-support-ecmp.html","commit_id":"33164e24e3487056622130dc24a9556049740eb7"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"03fd391e09ce50ce350fc4b40c47c1748fd45c01","unresolved":false,"context_lines":[{"line_number":279,"context_line":"    ip route add default via \u003cnexthop_ip2\u003e table \u003cX+1\u003e"},{"line_number":280,"context_line":"    ..."},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"  - If \u003cnexthop_ip1\u003e is not reachable for the time:"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"  ::"},{"line_number":285,"context_line":"    ip route del fwmark \u003cX + 0\u003e"},{"line_number":286,"context_line":"    ip route add fwmark \u003cX + 0\u003e table \u003cX + 1\u003e pref 100"},{"line_number":287,"context_line":""}],"source_content_type":"text/x-rst","patch_set":29,"id":"9f560f44_33dc5a45","line":284,"range":{"start_line":282,"start_character":0,"end_line":284,"end_character":4},"updated":"2020-09-04 06:50:16.000000000","message":"In the rendered doc, this place looks a bit strange.","commit_id":"33164e24e3487056622130dc24a9556049740eb7"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"03fd391e09ce50ce350fc4b40c47c1748fd45c01","unresolved":false,"context_lines":[{"line_number":291,"context_line":"  sysctl -w net.ipv4.conf.\u003cNIC_1\u003e.proxy_arp\u003d1"},{"line_number":292,"context_line":"  sysctl -w net.ipv4.conf.\u003cNIC_1\u003e.proxy_arp_pvlan\u003d1"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"* \u003cNIC_1\u003e is the name of the NIC to which the destination subnet is"},{"line_number":295,"context_line":"  connected."},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"Data Model Impact"}],"source_content_type":"text/x-rst","patch_set":29,"id":"9f560f44_53774e3c","line":294,"range":{"start_line":294,"start_character":29,"end_line":294,"end_character":32},"updated":"2020-09-04 06:50:16.000000000","message":"IMO, this is the key to the new route, so it should be describted in detail. It is the router internal gateway, aka the qr-device in the router related namespace.","commit_id":"33164e24e3487056622130dc24a9556049740eb7"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"03fd391e09ce50ce350fc4b40c47c1748fd45c01","unresolved":false,"context_lines":[{"line_number":303,"context_line":"---------------"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"Following REST APIs wil be affected::"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"  PUT /v2.0/routers/\u003crouter_id\u003e/add_extraroutes"},{"line_number":309,"context_line":""}],"source_content_type":"text/x-rst","patch_set":29,"id":"9f560f44_f3182285","line":306,"range":{"start_line":306,"start_character":0,"end_line":306,"end_character":37},"updated":"2020-09-04 06:50:16.000000000","message":"I guess a shim extension should be added to aviod some regression on this new route functions.","commit_id":"33164e24e3487056622130dc24a9556049740eb7"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"03fd391e09ce50ce350fc4b40c47c1748fd45c01","unresolved":false,"context_lines":[{"line_number":311,"context_line":""},{"line_number":312,"context_line":"  PUT /v2.0/routers/\u003crouter_id\u003e"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"Before the changes in this file, when L3 agent receive a route having"},{"line_number":315,"context_line":"an existing destination and a different hexthop, it will replace the"},{"line_number":316,"context_line":"old route with the new one. But now after these changes, there will be"},{"line_number":317,"context_line":"a ECMP route in the router."}],"source_content_type":"text/x-rst","patch_set":29,"id":"9f560f44_33b57aef","line":314,"range":{"start_line":314,"start_character":0,"end_line":314,"end_character":31},"updated":"2020-09-04 06:50:16.000000000","message":"How about \"Before the ECMP routing implementation, ...\"","commit_id":"33164e24e3487056622130dc24a9556049740eb7"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"03fd391e09ce50ce350fc4b40c47c1748fd45c01","unresolved":false,"context_lines":[{"line_number":311,"context_line":""},{"line_number":312,"context_line":"  PUT /v2.0/routers/\u003crouter_id\u003e"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"Before the changes in this file, when L3 agent receive a route having"},{"line_number":315,"context_line":"an existing destination and a different hexthop, it will replace the"},{"line_number":316,"context_line":"old route with the new one. But now after these changes, there will be"},{"line_number":317,"context_line":"a ECMP route in the router."},{"line_number":318,"context_line":""}],"source_content_type":"text/x-rst","patch_set":29,"id":"9f560f44_93c3a657","line":315,"range":{"start_line":314,"start_character":55,"end_line":315,"end_character":39},"updated":"2020-09-04 06:50:16.000000000","message":"a route entry with same destination and different nexthop","commit_id":"33164e24e3487056622130dc24a9556049740eb7"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"03fd391e09ce50ce350fc4b40c47c1748fd45c01","unresolved":false,"context_lines":[{"line_number":312,"context_line":"  PUT /v2.0/routers/\u003crouter_id\u003e"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"Before the changes in this file, when L3 agent receive a route having"},{"line_number":315,"context_line":"an existing destination and a different hexthop, it will replace the"},{"line_number":316,"context_line":"old route with the new one. But now after these changes, there will be"},{"line_number":317,"context_line":"a ECMP route in the router."},{"line_number":318,"context_line":""}],"source_content_type":"text/x-rst","patch_set":29,"id":"9f560f44_7393725d","line":315,"range":{"start_line":315,"start_character":40,"end_line":315,"end_character":47},"updated":"2020-09-04 06:50:16.000000000","message":"nexthop","commit_id":"33164e24e3487056622130dc24a9556049740eb7"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"03fd391e09ce50ce350fc4b40c47c1748fd45c01","unresolved":false,"context_lines":[{"line_number":314,"context_line":"Before the changes in this file, when L3 agent receive a route having"},{"line_number":315,"context_line":"an existing destination and a different hexthop, it will replace the"},{"line_number":316,"context_line":"old route with the new one. But now after these changes, there will be"},{"line_number":317,"context_line":"a ECMP route in the router."},{"line_number":318,"context_line":""},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"Documentation Impact"}],"source_content_type":"text/x-rst","patch_set":29,"id":"9f560f44_33aa9a84","line":317,"range":{"start_line":317,"start_character":26,"end_line":317,"end_character":27},"updated":"2020-09-04 06:50:16.000000000","message":"The entire paragraph looks not so much related to the API.","commit_id":"33164e24e3487056622130dc24a9556049740eb7"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"e0c932d76bcb458dfe0448cadd378ed0310e4019","unresolved":false,"context_lines":[{"line_number":195,"context_line":""},{"line_number":196,"context_line":"  openstack router set --route destination\u003d20.0.20.0/24,gateway\u003d12.0.0.11 \\"},{"line_number":197,"context_line":"  --route destination\u003d20.0.20.0/24,gateway\u003d12.0.0.12 router-ecmp"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"And withdraw the ECMP entry with::"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"  openstack router unset --route destination\u003d20.0.20.0/24,gateway\u003d12.0.0.11 \\"}],"source_content_type":"text/x-rst","patch_set":32,"id":"1f621f24_4b79572d","line":198,"updated":"2020-11-05 19:00:05.000000000","message":"Question: did you considered to add possibilty for defining weight as well for a route?","commit_id":"cada7b6800a689dc60255aaa28b49acb131aa076"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"a54536ca9e6487157a836bde7e78378eb2ab1874","unresolved":false,"context_lines":[{"line_number":195,"context_line":""},{"line_number":196,"context_line":"  openstack router set --route destination\u003d20.0.20.0/24,gateway\u003d12.0.0.11 \\"},{"line_number":197,"context_line":"  --route destination\u003d20.0.20.0/24,gateway\u003d12.0.0.12 router-ecmp"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"And withdraw the ECMP entry with::"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"  openstack router unset --route destination\u003d20.0.20.0/24,gateway\u003d12.0.0.11 \\"}],"source_content_type":"text/x-rst","patch_set":32,"id":"1f621f24_31543353","line":198,"in_reply_to":"1f621f24_2e1d040f","updated":"2020-11-09 09:05:33.000000000","message":"Ok, thanks","commit_id":"cada7b6800a689dc60255aaa28b49acb131aa076"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"518be04a76ace6eae9c5b092ecde4ae5ba513846","unresolved":false,"context_lines":[{"line_number":195,"context_line":""},{"line_number":196,"context_line":"  openstack router set --route destination\u003d20.0.20.0/24,gateway\u003d12.0.0.11 \\"},{"line_number":197,"context_line":"  --route destination\u003d20.0.20.0/24,gateway\u003d12.0.0.12 router-ecmp"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"And withdraw the ECMP entry with::"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"  openstack router unset --route destination\u003d20.0.20.0/24,gateway\u003d12.0.0.11 \\"}],"source_content_type":"text/x-rst","patch_set":32,"id":"1f621f24_2e1d040f","line":198,"in_reply_to":"1f621f24_4b79572d","updated":"2020-11-06 08:44:50.000000000","message":"\u003e Question: did you considered to add possibilty for defining weight\n \u003e as well for a route?\n\nNo,there\u0027s no need for that at the moment.\nThe discussion at the previous neutron\u0027s meeting resulted in no changes to the API, only changes to the logic used to generate the routes, and with that as the premise, I can\u0027t define the weights","commit_id":"cada7b6800a689dc60255aaa28b49acb131aa076"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"e0c932d76bcb458dfe0448cadd378ed0310e4019","unresolved":false,"context_lines":[{"line_number":245,"context_line":"The `routes_updated` function in RouterInfo will behave as below:"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"* When more than one route is found to have the same destination, L3"},{"line_number":248,"context_line":"  agent should execute an pyroute2 code, which looks like"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"::"},{"line_number":251,"context_line":""}],"source_content_type":"text/x-rst","patch_set":32,"id":"1f621f24_46f5ce82","line":248,"range":{"start_line":248,"start_character":23,"end_line":248,"end_character":25},"updated":"2020-11-05 19:00:05.000000000","message":"nit: a","commit_id":"cada7b6800a689dc60255aaa28b49acb131aa076"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"518be04a76ace6eae9c5b092ecde4ae5ba513846","unresolved":false,"context_lines":[{"line_number":245,"context_line":"The `routes_updated` function in RouterInfo will behave as below:"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"* When more than one route is found to have the same destination, L3"},{"line_number":248,"context_line":"  agent should execute an pyroute2 code, which looks like"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"::"},{"line_number":251,"context_line":""}],"source_content_type":"text/x-rst","patch_set":32,"id":"1f621f24_6e17fcee","line":248,"range":{"start_line":248,"start_character":23,"end_line":248,"end_character":25},"in_reply_to":"1f621f24_46f5ce82","updated":"2020-11-06 08:44:50.000000000","message":"Done","commit_id":"cada7b6800a689dc60255aaa28b49acb131aa076"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"e0c932d76bcb458dfe0448cadd378ed0310e4019","unresolved":false,"context_lines":[{"line_number":260,"context_line":"      nexthop via \u003cnexthop_ip1\u003e dev qr-xxxxxxxx-nn weight 1"},{"line_number":261,"context_line":"      nexthop via \u003cnexthop_ip2\u003e dev qr-xxxxxxxx-nn weight 1"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"Then router will randomlly pick a \u003cnexthop_ip\u003e and fill its mac address into"},{"line_number":264,"context_line":"the package\u0027s dst_mac address when it wants to get to the \u003cdestination_ip\u003e."},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"[`p2`_]For keeping connection while removing a load balancing node, use"}],"source_content_type":"text/x-rst","patch_set":32,"id":"1f621f24_ba02f207","line":263,"range":{"start_line":263,"start_character":17,"end_line":263,"end_character":26},"updated":"2020-11-05 19:00:05.000000000","message":"nit: randomly\n\nIf I understand well that is the default behaviour for hashing (https://cumulusnetworks.com/blog/celebrating-ecmp-part-two/ )","commit_id":"cada7b6800a689dc60255aaa28b49acb131aa076"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"a54536ca9e6487157a836bde7e78378eb2ab1874","unresolved":false,"context_lines":[{"line_number":260,"context_line":"      nexthop via \u003cnexthop_ip1\u003e dev qr-xxxxxxxx-nn weight 1"},{"line_number":261,"context_line":"      nexthop via \u003cnexthop_ip2\u003e dev qr-xxxxxxxx-nn weight 1"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"Then router will randomlly pick a \u003cnexthop_ip\u003e and fill its mac address into"},{"line_number":264,"context_line":"the package\u0027s dst_mac address when it wants to get to the \u003cdestination_ip\u003e."},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"[`p2`_]For keeping connection while removing a load balancing node, use"}],"source_content_type":"text/x-rst","patch_set":32,"id":"1f621f24_914d47c6","line":263,"range":{"start_line":263,"start_character":17,"end_line":263,"end_character":26},"in_reply_to":"1f621f24_0eb768f8","updated":"2020-11-09 09:05:33.000000000","message":"Thanks","commit_id":"cada7b6800a689dc60255aaa28b49acb131aa076"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"518be04a76ace6eae9c5b092ecde4ae5ba513846","unresolved":false,"context_lines":[{"line_number":260,"context_line":"      nexthop via \u003cnexthop_ip1\u003e dev qr-xxxxxxxx-nn weight 1"},{"line_number":261,"context_line":"      nexthop via \u003cnexthop_ip2\u003e dev qr-xxxxxxxx-nn weight 1"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"Then router will randomlly pick a \u003cnexthop_ip\u003e and fill its mac address into"},{"line_number":264,"context_line":"the package\u0027s dst_mac address when it wants to get to the \u003cdestination_ip\u003e."},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"[`p2`_]For keeping connection while removing a load balancing node, use"}],"source_content_type":"text/x-rst","patch_set":32,"id":"1f621f24_0eb768f8","line":263,"range":{"start_line":263,"start_character":17,"end_line":263,"end_character":26},"in_reply_to":"1f621f24_ba02f207","updated":"2020-11-06 08:44:50.000000000","message":"Done\nyes,that is the default behaviour","commit_id":"cada7b6800a689dc60255aaa28b49acb131aa076"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"e0c932d76bcb458dfe0448cadd378ed0310e4019","unresolved":false,"context_lines":[{"line_number":263,"context_line":"Then router will randomlly pick a \u003cnexthop_ip\u003e and fill its mac address into"},{"line_number":264,"context_line":"the package\u0027s dst_mac address when it wants to get to the \u003cdestination_ip\u003e."},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"[`p2`_]For keeping connection while removing a load balancing node, use"},{"line_number":267,"context_line":"iptables instead of simply a ip route entry."},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"  -  Use `HMARK` in mangle table, marking flows with a number:"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"  ::"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"    iptables -t mangle -A PREROUTING -p tcp -d \u003cvip\u003e -j HMARK \\"},{"line_number":274,"context_line":"    --hmark-tuple src --hmark-mod \u003cN\u003e --hmark-rnd 0xcafeface --hmark-offset X"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"    #N is the number of the loadbalancers"},{"line_number":277,"context_line":"    #X is the number of the offset where the ecmp table start"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"  - Distribute flows to different tables by `fwmark` value:"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"  ::"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    ip route add fwmark \u003cX + 0\u003e table \u003cX + 0\u003e pref 100"},{"line_number":284,"context_line":"    ip route add fwmark \u003cX + 1\u003e table \u003cX + 1\u003e pref 100"},{"line_number":285,"context_line":"    ..."},{"line_number":286,"context_line":"    ip route add fwmark \u003cX + N - 1\u003e table \u003cX + N - 1\u003e pref 100"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"  - For each table, give it a default \u003cnexthop_ip\u003e:"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"  ::"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    ip route add default via \u003cnexthop_ip1\u003e table \u003cX+0\u003e"},{"line_number":294,"context_line":"    ip route add default via \u003cnexthop_ip2\u003e table \u003cX+1\u003e"},{"line_number":295,"context_line":"    ..."},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"  - If \u003cnexthop_ip1\u003e is not reachable for the time:"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"  ::"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"    ip route del fwmark \u003cX + 0\u003e"},{"line_number":302,"context_line":"    ip route add fwmark \u003cX + 0\u003e table \u003cX + 1\u003e pref 100"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"In order to let traffic from the same network to pass through the router,"},{"line_number":305,"context_line":"L3 agent will also let router to use Proxy ARP by setting command::"}],"source_content_type":"text/x-rst","patch_set":32,"id":"1f621f24_e6f05a6a","line":302,"range":{"start_line":266,"start_character":0,"end_line":302,"end_character":54},"updated":"2020-11-05 19:00:05.000000000","message":"This part sounds too loadbalancer specific, could you reframe it to general Neutron terminology?\nIs this really something that needs to be in neutron to make ECMP work?","commit_id":"cada7b6800a689dc60255aaa28b49acb131aa076"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"518be04a76ace6eae9c5b092ecde4ae5ba513846","unresolved":false,"context_lines":[{"line_number":263,"context_line":"Then router will randomlly pick a \u003cnexthop_ip\u003e and fill its mac address into"},{"line_number":264,"context_line":"the package\u0027s dst_mac address when it wants to get to the \u003cdestination_ip\u003e."},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"[`p2`_]For keeping connection while removing a load balancing node, use"},{"line_number":267,"context_line":"iptables instead of simply a ip route entry."},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"  -  Use `HMARK` in mangle table, marking flows with a number:"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"  ::"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"    iptables -t mangle -A PREROUTING -p tcp -d \u003cvip\u003e -j HMARK \\"},{"line_number":274,"context_line":"    --hmark-tuple src --hmark-mod \u003cN\u003e --hmark-rnd 0xcafeface --hmark-offset X"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"    #N is the number of the loadbalancers"},{"line_number":277,"context_line":"    #X is the number of the offset where the ecmp table start"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"  - Distribute flows to different tables by `fwmark` value:"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"  ::"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    ip route add fwmark \u003cX + 0\u003e table \u003cX + 0\u003e pref 100"},{"line_number":284,"context_line":"    ip route add fwmark \u003cX + 1\u003e table \u003cX + 1\u003e pref 100"},{"line_number":285,"context_line":"    ..."},{"line_number":286,"context_line":"    ip route add fwmark \u003cX + N - 1\u003e table \u003cX + N - 1\u003e pref 100"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"  - For each table, give it a default \u003cnexthop_ip\u003e:"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"  ::"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    ip route add default via \u003cnexthop_ip1\u003e table \u003cX+0\u003e"},{"line_number":294,"context_line":"    ip route add default via \u003cnexthop_ip2\u003e table \u003cX+1\u003e"},{"line_number":295,"context_line":"    ..."},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"  - If \u003cnexthop_ip1\u003e is not reachable for the time:"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"  ::"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"    ip route del fwmark \u003cX + 0\u003e"},{"line_number":302,"context_line":"    ip route add fwmark \u003cX + 0\u003e table \u003cX + 1\u003e pref 100"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"In order to let traffic from the same network to pass through the router,"},{"line_number":305,"context_line":"L3 agent will also let router to use Proxy ARP by setting command::"}],"source_content_type":"text/x-rst","patch_set":32,"id":"1f621f24_6ec53c5b","line":302,"range":{"start_line":266,"start_character":0,"end_line":302,"end_character":54},"in_reply_to":"1f621f24_e6f05a6a","updated":"2020-11-06 08:44:50.000000000","message":"\u003e This part sounds too loadbalancer specific, could you reframe it to\n \u003e general Neutron terminology?\n \u003e Is this really something that needs to be in neutron to make ECMP\n \u003e work?\n\nI\u0027ll try it.\n\nYou can take a look at https://review.opendev.org/723864, this new topology need Neutron to support ECMP.","commit_id":"cada7b6800a689dc60255aaa28b49acb131aa076"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"e0c932d76bcb458dfe0448cadd378ed0310e4019","unresolved":false,"context_lines":[{"line_number":305,"context_line":"L3 agent will also let router to use Proxy ARP by setting command::"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"  sysctl -w net.ipv4.conf.\u003cNIC_1\u003e.proxy_arp\u003d1"},{"line_number":308,"context_line":"  sysctl -w net.ipv4.conf.\u003cNIC_1\u003e.proxy_arp_pvlan\u003d1"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"* \u003cNIC_1\u003e is the name of the router internal gateway to which the"},{"line_number":311,"context_line":"  destination subnet is connected. For example, router `R1` is connected"}],"source_content_type":"text/x-rst","patch_set":32,"id":"1f621f24_c6343efe","line":308,"range":{"start_line":308,"start_character":2,"end_line":308,"end_character":51},"updated":"2020-11-05 19:00:05.000000000","message":"I am not an expert here, but by this sysctl documentation (\nhttps://sysctl-explorer.net/net/ipv4/proxy_arp_pvlan/ ) :\n\n\"Don’t need to be used together with proxy_arp.\"\n\nSo not sure if it is really needed.","commit_id":"cada7b6800a689dc60255aaa28b49acb131aa076"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"36b067b90f6399281c9e335cd7138e5d498de37d","unresolved":true,"context_lines":[{"line_number":14,"context_line":"Launchpad Bug:"},{"line_number":15,"context_line":"https://bugs.launchpad.net/neutron/+bug/1880532"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"ECMP is a kind of routing technology which allows multiple different links"},{"line_number":18,"context_line":"reach the same destination. Neutron does not need to calculate the equivalent"},{"line_number":19,"context_line":"route path, but leave that part of the work to those applications using"},{"line_number":20,"context_line":"ECMP API. Neutron just receives those parameters and configures routers."},{"line_number":21,"context_line":"Since we have \"ip route\" command provided by the iproute2 utility in Linux,"}],"source_content_type":"text/x-rst","patch_set":33,"id":"8086b4f0_520d4964","line":18,"range":{"start_line":17,"start_character":50,"end_line":18,"end_character":26},"updated":"2020-11-23 15:45:58.000000000","message":"nit: traffic to reach the same destination via multiple different links","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"5bb3c5ba0320c62eb2ba71496de45f752da40c66","unresolved":false,"context_lines":[{"line_number":14,"context_line":"Launchpad Bug:"},{"line_number":15,"context_line":"https://bugs.launchpad.net/neutron/+bug/1880532"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"ECMP is a kind of routing technology which allows multiple different links"},{"line_number":18,"context_line":"reach the same destination. Neutron does not need to calculate the equivalent"},{"line_number":19,"context_line":"route path, but leave that part of the work to those applications using"},{"line_number":20,"context_line":"ECMP API. Neutron just receives those parameters and configures routers."},{"line_number":21,"context_line":"Since we have \"ip route\" command provided by the iproute2 utility in Linux,"}],"source_content_type":"text/x-rst","patch_set":33,"id":"de6c6ccb_8337e8e8","line":18,"range":{"start_line":17,"start_character":50,"end_line":18,"end_character":26},"in_reply_to":"8086b4f0_520d4964","updated":"2020-11-24 09:04:58.000000000","message":"Done","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"36b067b90f6399281c9e335cd7138e5d498de37d","unresolved":true,"context_lines":[{"line_number":36,"context_line":"[`P2`_] Currently the equal cost route is a simple 5 tuple, that means if"},{"line_number":37,"context_line":"we have one \u003cnexthop\u003e unreachable and remove it from ECMP routes, all"},{"line_number":38,"context_line":"connections get redistributed. To avoid this, we intend to use a persistent"},{"line_number":39,"context_line":"hash instead of the original scheme. This scheme is based on hmark which added"},{"line_number":40,"context_line":"in iptables-1.4.15 or later. See the history file of iptables on [1]_."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"Then this spec describes how to implement ECMP in Neutron."}],"source_content_type":"text/x-rst","patch_set":33,"id":"d6b3e8e6_7bda142e","line":39,"range":{"start_line":39,"start_character":37,"end_line":39,"end_character":48},"updated":"2020-11-23 15:45:58.000000000","message":"Based on lines 266-274 \"This scheme\" refers to consistent hashing. Stating this explicitly would help the reader here.","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"36b067b90f6399281c9e335cd7138e5d498de37d","unresolved":true,"context_lines":[{"line_number":33,"context_line":"  **Note:** Items marked with [`P2`_] refer to lower priority features"},{"line_number":34,"context_line":"  to be designed / implemented only after initial release."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"[`P2`_] Currently the equal cost route is a simple 5 tuple, that means if"},{"line_number":37,"context_line":"we have one \u003cnexthop\u003e unreachable and remove it from ECMP routes, all"},{"line_number":38,"context_line":"connections get redistributed. To avoid this, we intend to use a persistent"},{"line_number":39,"context_line":"hash instead of the original scheme. This scheme is based on hmark which added"},{"line_number":40,"context_line":"in iptables-1.4.15 or later. See the history file of iptables on [1]_."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"Then this spec describes how to implement ECMP in Neutron."}],"source_content_type":"text/x-rst","patch_set":33,"id":"5192a7a9_72122937","line":39,"range":{"start_line":36,"start_character":0,"end_line":39,"end_character":36},"updated":"2020-11-23 15:45:58.000000000","message":"Don\u0027t we conflate two things here?\n\n1) What is the input to the (outgoing link selector) hash? 3-tuple or 5-tuple?\n\n2) Is the hashing consistent or not? You use the word \"persistent\", but I usually find this is called \"consistent\" or \"resilient\" hashing. From user perspective this difference means that on addition/deletion to/from the ECMP bundle how much traffic gets disturbed/redistributed (almost all or the least possible).\n\nTo my understanding both of these options cause observable differences in the behavior of an ECMP router, therefore I think it would make sense to expose these settings via the API. For example as a new router attribute (thinking out loud):\n\n \"ecmp_options\": {\n     \"hash_input\": \"5-tuple\",\n     \"consistent_hash\": False,\n }\n\nOf course the implementation could first reject a router creation request with consistent_hash\u003dTrue as unimplemented. But we would have a way to introduce consistent hashing and make it queryable/settable by the user.","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"f601c3b8251ac104b73283f6362b24e58a537e91","unresolved":true,"context_lines":[{"line_number":33,"context_line":"  **Note:** Items marked with [`P2`_] refer to lower priority features"},{"line_number":34,"context_line":"  to be designed / implemented only after initial release."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"[`P2`_] Currently the equal cost route is a simple 5 tuple, that means if"},{"line_number":37,"context_line":"we have one \u003cnexthop\u003e unreachable and remove it from ECMP routes, all"},{"line_number":38,"context_line":"connections get redistributed. To avoid this, we intend to use a persistent"},{"line_number":39,"context_line":"hash instead of the original scheme. This scheme is based on hmark which added"},{"line_number":40,"context_line":"in iptables-1.4.15 or later. See the history file of iptables on [1]_."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"Then this spec describes how to implement ECMP in Neutron."}],"source_content_type":"text/x-rst","patch_set":33,"id":"8d876253_817b013f","line":39,"range":{"start_line":36,"start_character":0,"end_line":39,"end_character":36},"in_reply_to":"126125ab_1255918c","updated":"2020-11-25 08:25:22.000000000","message":"Yes, due to the functionality of Octavia, I plan to merge the ECMP implementation I\u0027m currently using first, and then make improvements later.\nAs for how users will know which version is being used, how about changing the shim extension name from \u0027ecmp-route\u0027 to \u0027ecmp-iptables\u0027?","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"5bb3c5ba0320c62eb2ba71496de45f752da40c66","unresolved":false,"context_lines":[{"line_number":33,"context_line":"  **Note:** Items marked with [`P2`_] refer to lower priority features"},{"line_number":34,"context_line":"  to be designed / implemented only after initial release."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"[`P2`_] Currently the equal cost route is a simple 5 tuple, that means if"},{"line_number":37,"context_line":"we have one \u003cnexthop\u003e unreachable and remove it from ECMP routes, all"},{"line_number":38,"context_line":"connections get redistributed. To avoid this, we intend to use a persistent"},{"line_number":39,"context_line":"hash instead of the original scheme. This scheme is based on hmark which added"},{"line_number":40,"context_line":"in iptables-1.4.15 or later. See the history file of iptables on [1]_."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"Then this spec describes how to implement ECMP in Neutron."}],"source_content_type":"text/x-rst","patch_set":33,"id":"541bc9fd_1f95543a","line":39,"range":{"start_line":36,"start_character":0,"end_line":39,"end_character":36},"in_reply_to":"5192a7a9_72122937","updated":"2020-11-24 09:04:58.000000000","message":"What I mean is that adding ECMP routing in the current scheme does not allow for consistent hashing, and we need to pursue consistent hashing to ensure that the network traffic receives minimal impact when a node is unreachable.\n\nI don\u0027t think it is necessary to add a new router attribute to allow users to choose whether to use a consistent hash or not, because there is no reason for users not to use a consistent hash when it can be achieved.","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"85fad621c919a7aa7bcd37c20d817ced69ee9b4b","unresolved":true,"context_lines":[{"line_number":33,"context_line":"  **Note:** Items marked with [`P2`_] refer to lower priority features"},{"line_number":34,"context_line":"  to be designed / implemented only after initial release."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"[`P2`_] Currently the equal cost route is a simple 5 tuple, that means if"},{"line_number":37,"context_line":"we have one \u003cnexthop\u003e unreachable and remove it from ECMP routes, all"},{"line_number":38,"context_line":"connections get redistributed. To avoid this, we intend to use a persistent"},{"line_number":39,"context_line":"hash instead of the original scheme. This scheme is based on hmark which added"},{"line_number":40,"context_line":"in iptables-1.4.15 or later. See the history file of iptables on [1]_."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"Then this spec describes how to implement ECMP in Neutron."}],"source_content_type":"text/x-rst","patch_set":33,"id":"126125ab_1255918c","line":39,"range":{"start_line":36,"start_character":0,"end_line":39,"end_character":36},"in_reply_to":"541bc9fd_1f95543a","updated":"2020-11-24 15:29:15.000000000","message":"I fully agree consistent hashing is desired.\n\nHowever I\u0027m a bit lost why is this marked as Prio2 then. The note in line 33 says that you intend to merge ecmp support first without consistent hashing. Then later add consistent hashing as a separate feature. How can a user find out which version he\u0027s getting?","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"16db2cb9d6f72f76640912cf37df8fae6c3c7762","unresolved":true,"context_lines":[{"line_number":33,"context_line":"  **Note:** Items marked with [`P2`_] refer to lower priority features"},{"line_number":34,"context_line":"  to be designed / implemented only after initial release."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"[`P2`_] Currently the equal cost route is a simple 5 tuple, that means if"},{"line_number":37,"context_line":"we have one \u003cnexthop\u003e unreachable and remove it from ECMP routes, all"},{"line_number":38,"context_line":"connections get redistributed. To avoid this, we intend to use a persistent"},{"line_number":39,"context_line":"hash instead of the original scheme. This scheme is based on hmark which added"},{"line_number":40,"context_line":"in iptables-1.4.15 or later. See the history file of iptables on [1]_."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"Then this spec describes how to implement ECMP in Neutron."}],"source_content_type":"text/x-rst","patch_set":33,"id":"31e62e96_6d20636d","line":39,"range":{"start_line":36,"start_character":0,"end_line":39,"end_character":36},"in_reply_to":"8d876253_817b013f","updated":"2020-12-03 12:22:45.000000000","message":"If we want the API to be generic and work with other future ECMP implementations too (for example with hardware routers where we don\u0027t control the implementation, whether they can use a 5-tuple or do consistent hashing) I still believe the explicit extra API option better covers the possibilites.\n\nWhile I believe this makes sense here in the scope of this spec, I\u0027m open to taking this to a followup spec.","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"5bb3c5ba0320c62eb2ba71496de45f752da40c66","unresolved":false,"context_lines":[{"line_number":36,"context_line":"[`P2`_] Currently the equal cost route is a simple 5 tuple, that means if"},{"line_number":37,"context_line":"we have one \u003cnexthop\u003e unreachable and remove it from ECMP routes, all"},{"line_number":38,"context_line":"connections get redistributed. To avoid this, we intend to use a persistent"},{"line_number":39,"context_line":"hash instead of the original scheme. This scheme is based on hmark which added"},{"line_number":40,"context_line":"in iptables-1.4.15 or later. See the history file of iptables on [1]_."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"Then this spec describes how to implement ECMP in Neutron."}],"source_content_type":"text/x-rst","patch_set":33,"id":"484de66a_d69444aa","line":39,"range":{"start_line":39,"start_character":37,"end_line":39,"end_character":48},"in_reply_to":"d6b3e8e6_7bda142e","updated":"2020-11-24 09:04:58.000000000","message":"Done","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"36b067b90f6399281c9e335cd7138e5d498de37d","unresolved":true,"context_lines":[{"line_number":199,"context_line":"And withdraw the ECMP entry with::"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"  openstack router unset --route destination\u003d20.0.20.0/24,gateway\u003d12.0.0.11 \\"},{"line_number":202,"context_line":"  --route destination\u003d20.0.20.0/24,gateway\u003d12.0.0.12 router-ecmp"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"For more information about router related OSC, please read [3]_."},{"line_number":205,"context_line":""}],"source_content_type":"text/x-rst","patch_set":33,"id":"f086dc45_ea2fc24d","line":202,"updated":"2020-11-23 15:45:58.000000000","message":"FYI: This osc syntax uses the older \"PUT /router/ID\" API, while \"openstack router add route\" (and conversely \"router remove route\") uses the \"PUT /router/ID/add_extraroute\" API.","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"5bb3c5ba0320c62eb2ba71496de45f752da40c66","unresolved":false,"context_lines":[{"line_number":199,"context_line":"And withdraw the ECMP entry with::"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"  openstack router unset --route destination\u003d20.0.20.0/24,gateway\u003d12.0.0.11 \\"},{"line_number":202,"context_line":"  --route destination\u003d20.0.20.0/24,gateway\u003d12.0.0.12 router-ecmp"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"For more information about router related OSC, please read [3]_."},{"line_number":205,"context_line":""}],"source_content_type":"text/x-rst","patch_set":33,"id":"9caa9f08_85d13db8","line":202,"in_reply_to":"f086dc45_ea2fc24d","updated":"2020-11-24 09:04:58.000000000","message":"I will change this.\nDone","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"36b067b90f6399281c9e335cd7138e5d498de37d","unresolved":true,"context_lines":[{"line_number":207,"context_line":"Data flow"},{"line_number":208,"context_line":"---------"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"* The intranet client requests mac address of the VIP and accesses the"},{"line_number":211,"context_line":"  service based on this mac address."},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"* [`p2`_] The extranet client accesses the tenant service via floating IP."}],"source_content_type":"text/x-rst","patch_set":33,"id":"6b4bd76f_049e1991","line":210,"range":{"start_line":210,"start_character":6,"end_line":210,"end_character":21},"updated":"2020-11-23 15:45:58.000000000","message":"By intranet client you mean a port/IP from the same subnet where the ECMP nexthops are, right?\n\nWhy do we keep the client and the nexthops in the same subnet in the first place? Is this mandated by Octavia? If yes, why?\n\nIf we had them in different subnets (both connected to the router via router interfaces), then the traffic would naturally flow through the router and the arp-proxy in the implementation patch would become unnecessary.\n\nUsing an arp-proxy to force intra-subnet traffic still through the router is quite surprising. Causing the least surprise is generally desirable. Do we have a reason that outweighs the surprise?","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"16db2cb9d6f72f76640912cf37df8fae6c3c7762","unresolved":true,"context_lines":[{"line_number":207,"context_line":"Data flow"},{"line_number":208,"context_line":"---------"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"* The intranet client requests mac address of the VIP and accesses the"},{"line_number":211,"context_line":"  service based on this mac address."},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"* [`p2`_] The extranet client accesses the tenant service via floating IP."}],"source_content_type":"text/x-rst","patch_set":33,"id":"e9d0d904_89fd92f5","line":210,"range":{"start_line":210,"start_character":6,"end_line":210,"end_character":21},"in_reply_to":"084e1931_f4649ab9","updated":"2020-12-03 12:22:45.000000000","message":"I\u0027m not necessarily against convenience features like this arp-proxy. However here too I\u0027m considering hardware-router based implementations where dropping in an extra arp proxy may not be trivial or possible at all. That\u0027s why I would suggest at least making the arp-proxy feature into something optional - so another implementation could choose to not implement it.","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"f601c3b8251ac104b73283f6362b24e58a537e91","unresolved":true,"context_lines":[{"line_number":207,"context_line":"Data flow"},{"line_number":208,"context_line":"---------"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"* The intranet client requests mac address of the VIP and accesses the"},{"line_number":211,"context_line":"  service based on this mac address."},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"* [`p2`_] The extranet client accesses the tenant service via floating IP."}],"source_content_type":"text/x-rst","patch_set":33,"id":"084e1931_f4649ab9","line":210,"range":{"start_line":210,"start_character":6,"end_line":210,"end_character":21},"in_reply_to":"1582303a_cfe76972","updated":"2020-11-25 08:25:22.000000000","message":"This is really to accommodate the same subnet case, although there is no use case that requires being on the same subnet, and there is no feature distinction between being on and off the same subnet.\nAfter all, the same customer\u0027s hosts are likely to be planned in the same subnet.\n\nHappily, turning on the arp proxy does not affect normal host communication on the same subnet (this is the result of my experiment, probably because these hosts did not turn off arp response) so don\u0027t worry too much about \u0027surprising traffic\u0027.","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"0f6559feda8e8f916459e212068ddb0743bf2292","unresolved":true,"context_lines":[{"line_number":207,"context_line":"Data flow"},{"line_number":208,"context_line":"---------"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"* The intranet client requests mac address of the VIP and accesses the"},{"line_number":211,"context_line":"  service based on this mac address."},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"* [`p2`_] The extranet client accesses the tenant service via floating IP."}],"source_content_type":"text/x-rst","patch_set":33,"id":"5c610d83_a513b105","line":210,"range":{"start_line":210,"start_character":6,"end_line":210,"end_character":21},"in_reply_to":"2e6bb1c8_0940c2f6","updated":"2020-12-10 10:07:40.000000000","message":"Sorry, but I still do not agree. We already have an ECMP implementation in OpenDayLight that does not have the proposed ARP proxy, but uses the same API. Also we should not make future hardware-router backends impossible by making the ARP proxy mandatory.\n\nI believe you were referring to this meeting:\n\nhttp://eavesdrop.openstack.org/irclogs/%23openstack-meeting/%23openstack-meeting.2020-07-10.log.html#t2020-07-10T14:09:07\n\nI was not present, but I did read the meeting log. I don\u0027t interpret the outcome of that meeting as prohibiting all API changes. I see one API-change proposal discussed and rejected. But the topic of the ARP proxy (and a different API change for that) was not discussed at all.\n\nOther people who took part in that discussion (slaweq, yamamoto, ralonsoh, njohnston, mlavalle), could you please express your opinion on this question?","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"1aec1e343e6fbbdbb3f00734488e1a4d29c48e91","unresolved":true,"context_lines":[{"line_number":207,"context_line":"Data flow"},{"line_number":208,"context_line":"---------"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"* The intranet client requests mac address of the VIP and accesses the"},{"line_number":211,"context_line":"  service based on this mac address."},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"* [`p2`_] The extranet client accesses the tenant service via floating IP."}],"source_content_type":"text/x-rst","patch_set":33,"id":"e1db8cf1_4b2e5428","line":210,"range":{"start_line":210,"start_character":6,"end_line":210,"end_character":21},"in_reply_to":"5c610d83_a513b105","updated":"2020-12-11 08:56:11.000000000","message":"I\u0027m not sure if I understand all of that properly but IMO we shouldn\u0027t have \"config driven API\" so I don\u0027t think our API should behave differently if arp_proxy is enabled or disabled in config.\nI read it once again and my understanding is that this arp proxy is detail of the backend (L3 agent) implementation. But if other router/SDN will do it differently, then it will be fine too. What am I missing here?","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"5bb3c5ba0320c62eb2ba71496de45f752da40c66","unresolved":false,"context_lines":[{"line_number":207,"context_line":"Data flow"},{"line_number":208,"context_line":"---------"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"* The intranet client requests mac address of the VIP and accesses the"},{"line_number":211,"context_line":"  service based on this mac address."},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"* [`p2`_] The extranet client accesses the tenant service via floating IP."}],"source_content_type":"text/x-rst","patch_set":33,"id":"96bcc761_ebfefdee","line":210,"range":{"start_line":210,"start_character":6,"end_line":210,"end_character":21},"in_reply_to":"6b4bd76f_049e1991","updated":"2020-11-24 09:04:58.000000000","message":"In a production environment, a virtual machine created by a customer is often planned on one subnet, so that the client virtual machine he creates and the servers he needs to use for load balancing are on a subnet.","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"85fad621c919a7aa7bcd37c20d817ced69ee9b4b","unresolved":true,"context_lines":[{"line_number":207,"context_line":"Data flow"},{"line_number":208,"context_line":"---------"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"* The intranet client requests mac address of the VIP and accesses the"},{"line_number":211,"context_line":"  service based on this mac address."},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"* [`p2`_] The extranet client accesses the tenant service via floating IP."}],"source_content_type":"text/x-rst","patch_set":33,"id":"1582303a_cfe76972","line":210,"range":{"start_line":210,"start_character":6,"end_line":210,"end_character":21},"in_reply_to":"96bcc761_ebfefdee","updated":"2020-11-24 15:29:15.000000000","message":"I understand that people may have previously put various VMs in the same subnet. But I\u0027m asking for something different: What is the use case for having them in the same subnet? In other words: What feature (if any) is lost if we mandate the client and the nexthops being on separate subnets?\n\nThe other side is clear: without proxy arp the implementation is simpler and we don\u0027t create surprising traffic flows.","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"7c121add287cfe93dada4ae930e5e4990e80ff63","unresolved":true,"context_lines":[{"line_number":207,"context_line":"Data flow"},{"line_number":208,"context_line":"---------"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"* The intranet client requests mac address of the VIP and accesses the"},{"line_number":211,"context_line":"  service based on this mac address."},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"* [`p2`_] The extranet client accesses the tenant service via floating IP."}],"source_content_type":"text/x-rst","patch_set":33,"id":"e6ae4244_fb597329","line":210,"range":{"start_line":210,"start_character":6,"end_line":210,"end_character":21},"in_reply_to":"d29dd802_1328ddd4","updated":"2020-12-08 09:26:41.000000000","message":"Again, I\u0027m not against an optional arp proxy, but we cannot expect a OpenStack client to magically know the server side configuration. If it behaves differently it must look different in the API too.","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"db6d09425e0cc29df736a7e43f9bb2f27cf232db","unresolved":true,"context_lines":[{"line_number":207,"context_line":"Data flow"},{"line_number":208,"context_line":"---------"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"* The intranet client requests mac address of the VIP and accesses the"},{"line_number":211,"context_line":"  service based on this mac address."},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"* [`p2`_] The extranet client accesses the tenant service via floating IP."}],"source_content_type":"text/x-rst","patch_set":33,"id":"95da038b_8a61105c","line":210,"range":{"start_line":210,"start_character":6,"end_line":210,"end_character":21},"in_reply_to":"e1db8cf1_4b2e5428","updated":"2020-12-17 05:12:24.000000000","message":"Generally speaking, the API definition is a combination of REST API request/response AND expected behavior. Ideally all backend behaviors are visible via the API.\n\nOn the other hand, the feature discussed here, proxy ARP for ECMP, sounds a gray zone.\n\nI see several implementation-specific differences (including this spec):\n\n- ECMP support itself\n- Proxy ARP for ECMP\n\nRegarding the first one, whether ECMP support is enabled is NOT expressed via API, so we already have different behaviors per backend.\nThe second one, proxy ARP for ECMP, can be considered as a same level as the first one.\n\nThus, I agree that this kind of difference should be expressed via the API ideally, I am not sure we need to do it for \"proxy ARP for ECMP\" only.\n\nFYI: If we express the availability of \"proxy ARP for ECMP\", a backend driver can declare if the feature is supported or not and we can control the API extension based on this information. I don\u0027t think a config option is required. (As an implementation reference we can refer to the implementation of the security group extension https://opendev.org/openstack/neutron/src/branch/master/neutron/agent/securitygroups_rpc.py#L48)","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"26076a8584df766e2aaa17da21b93902d9ec53b7","unresolved":false,"context_lines":[{"line_number":207,"context_line":"Data flow"},{"line_number":208,"context_line":"---------"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"* The intranet client requests mac address of the VIP and accesses the"},{"line_number":211,"context_line":"  service based on this mac address."},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"* [`p2`_] The extranet client accesses the tenant service via floating IP."}],"source_content_type":"text/x-rst","patch_set":33,"id":"2e6bb1c8_0940c2f6","line":210,"range":{"start_line":210,"start_character":6,"end_line":210,"end_character":21},"in_reply_to":"e6ae4244_fb597329","updated":"2020-12-09 03:42:39.000000000","message":"\u003e Again, I\u0027m not against an optional arp proxy, but we cannot expect a OpenStack client to magically know the server side configuration. If it behaves differently it must look different in the API too.\n\nFirst of all, modifying the internal logic on the agent side without adding additional APIs was the result of the meeting, so I could not let the client to know or modify the background configurations via API.\n\nIn that case, I have to make enabling the ARP proxy as a fixed action of ECMP, if the hardware router doesn\u0027t support this feature, then so be it.","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"beb1056e83de1ef5ceb2669fe44ac1d15d09ec04","unresolved":false,"context_lines":[{"line_number":207,"context_line":"Data flow"},{"line_number":208,"context_line":"---------"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"* The intranet client requests mac address of the VIP and accesses the"},{"line_number":211,"context_line":"  service based on this mac address."},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"* [`p2`_] The extranet client accesses the tenant service via floating IP."}],"source_content_type":"text/x-rst","patch_set":33,"id":"d29dd802_1328ddd4","line":210,"range":{"start_line":210,"start_character":6,"end_line":210,"end_character":21},"in_reply_to":"e9d0d904_89fd92f5","updated":"2020-12-04 03:16:22.000000000","message":"I\u0027m not sure if hardware routing supports ARP proxies, I would consider adding a configuration item to the config file later to decide if I want to enable ARP proxies along with ECMP.","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"36b067b90f6399281c9e335cd7138e5d498de37d","unresolved":true,"context_lines":[{"line_number":211,"context_line":"  service based on this mac address."},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"* [`p2`_] The extranet client accesses the tenant service via floating IP."},{"line_number":214,"context_line":"  This need to improve existing Neutron `floatingips` API."},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"* When the intranet client requests mac address of the VIP, the router"},{"line_number":217,"context_line":"  will use gateway MAC address to respond, the client\u0027s datagram will"}],"source_content_type":"text/x-rst","patch_set":33,"id":"07368093_a513095d","line":214,"range":{"start_line":214,"start_character":0,"end_line":214,"end_character":58},"updated":"2020-11-23 15:45:58.000000000","message":"Could you please explain why?","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"5bb3c5ba0320c62eb2ba71496de45f752da40c66","unresolved":false,"context_lines":[{"line_number":211,"context_line":"  service based on this mac address."},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"* [`p2`_] The extranet client accesses the tenant service via floating IP."},{"line_number":214,"context_line":"  This need to improve existing Neutron `floatingips` API."},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"* When the intranet client requests mac address of the VIP, the router"},{"line_number":217,"context_line":"  will use gateway MAC address to respond, the client\u0027s datagram will"}],"source_content_type":"text/x-rst","patch_set":33,"id":"06a276f4_974d4130","line":214,"range":{"start_line":214,"start_character":0,"end_line":214,"end_character":58},"in_reply_to":"07368093_a513095d","updated":"2020-11-24 09:04:58.000000000","message":"There is no need for this, I will delete this sentence.","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"36b067b90f6399281c9e335cd7138e5d498de37d","unresolved":true,"context_lines":[{"line_number":249,"context_line":""},{"line_number":250,"context_line":"::"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"  ip.route(\u0027replace\u0027, dst\u003d\u0027\u003cdestination_ip\u003e\u0027,multipath\u003d[{\"gateway\":"},{"line_number":253,"context_line":"  \"\u003cnexthop1\u003e\"},{\"gateway\":\"\u003cnexthop2\u003e\"}])"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"* Then there will be an ip route entry in the namespace, which looks like"},{"line_number":256,"context_line":""}],"source_content_type":"text/x-rst","patch_set":33,"id":"9d8345f0_c57dcea6","line":253,"range":{"start_line":252,"start_character":2,"end_line":253,"end_character":42},"updated":"2020-11-23 15:45:58.000000000","message":"Is there a downside to changing all routes to syntactically multipath routes - ECMP routes with actually multiple nexthops, non-ECMP routes with only a single nexthop?","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"5bb3c5ba0320c62eb2ba71496de45f752da40c66","unresolved":false,"context_lines":[{"line_number":249,"context_line":""},{"line_number":250,"context_line":"::"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"  ip.route(\u0027replace\u0027, dst\u003d\u0027\u003cdestination_ip\u003e\u0027,multipath\u003d[{\"gateway\":"},{"line_number":253,"context_line":"  \"\u003cnexthop1\u003e\"},{\"gateway\":\"\u003cnexthop2\u003e\"}])"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"* Then there will be an ip route entry in the namespace, which looks like"},{"line_number":256,"context_line":""}],"source_content_type":"text/x-rst","patch_set":33,"id":"120d505f_afc31a8a","line":253,"range":{"start_line":252,"start_character":2,"end_line":253,"end_character":42},"in_reply_to":"9d8345f0_c57dcea6","updated":"2020-11-24 09:04:58.000000000","message":"Doing so is the result of discussions at previous meetings. If you have to say there is a downside, then the user modifying the custom gateway now needs to delete the previous one (if there is one).","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"36b067b90f6399281c9e335cd7138e5d498de37d","unresolved":true,"context_lines":[{"line_number":270,"context_line":"  - Distribute flows to different tables by `fwmark` values."},{"line_number":271,"context_line":"  - There is a mapping between the fwmark values and the table values"},{"line_number":272,"context_line":"  - For each table, give it a default nexthop ip."},{"line_number":273,"context_line":"  - Modify the mapping between fwmark values and table values"},{"line_number":274,"context_line":"    when a `nexthop` is unreachable."},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"In order to let traffic from the same network to pass through the router,"},{"line_number":277,"context_line":"L3 agent will also let router to use Proxy ARP by setting command::"}],"source_content_type":"text/x-rst","patch_set":33,"id":"f5d2d2fb_1270c80a","line":274,"range":{"start_line":273,"start_character":4,"end_line":274,"end_character":36},"updated":"2020-11-23 15:45:58.000000000","message":"Would this be relying on conntrack?\n\nIsn\u0027t consistent hashing solving the same problem but using fewer resources (no dependency on conntrack)?\n\nI mean what\u0027s described in this paper in section 3.4:\nhttps://static.googleusercontent.com/media/research.google.com/en//pubs/archive/44824.pdf\n\nOr here:\nhttps://en.wikipedia.org/wiki/Consistent_hashing\n\nWeb searches tell me an open source implementation of this is available by using Linux IPVS with the Maglev scheduler.\n\nI\u0027m not really familiar with neither IPVS nor Maglev, so I may easily have skipped over important details. But it seems to be something that already does what we need here.","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"9dea06d4611dcda46453abd701614efa9b93ba4b","unresolved":false,"context_lines":[{"line_number":271,"context_line":"  - There is a mapping between the fwmark values and the table values"},{"line_number":272,"context_line":"  - For each table, give it a default nexthop ip."},{"line_number":273,"context_line":"  - Modify the mapping between fwmark values and table values"},{"line_number":274,"context_line":"    when a `nexthop` is unreachable."},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"In order to let traffic from the same network to pass through the router,"},{"line_number":277,"context_line":"L3 agent will also let router to use Proxy ARP by setting command::"}],"source_content_type":"text/x-rst","patch_set":33,"id":"fffc6b78_67ee9089","line":274,"updated":"2020-11-19 08:56:22.000000000","message":"just to make it visible - we now started talking about migration from legacy iptables to nftables, are You sure all of that will be supported there? I guess it will but just to make sure :)","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"beb1056e83de1ef5ceb2669fe44ac1d15d09ec04","unresolved":false,"context_lines":[{"line_number":270,"context_line":"  - Distribute flows to different tables by `fwmark` values."},{"line_number":271,"context_line":"  - There is a mapping between the fwmark values and the table values"},{"line_number":272,"context_line":"  - For each table, give it a default nexthop ip."},{"line_number":273,"context_line":"  - Modify the mapping between fwmark values and table values"},{"line_number":274,"context_line":"    when a `nexthop` is unreachable."},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"In order to let traffic from the same network to pass through the router,"},{"line_number":277,"context_line":"L3 agent will also let router to use Proxy ARP by setting command::"}],"source_content_type":"text/x-rst","patch_set":33,"id":"fb67400e_b7d311e9","line":274,"range":{"start_line":273,"start_character":4,"end_line":274,"end_character":36},"in_reply_to":"61568299_1f8365eb","updated":"2020-12-04 03:16:22.000000000","message":"My solution is to have the HMARK value mapped to the source address of the traffic, so the consistency hash is implemented from line 269 to line 274 together, and I believe this solution meets the current requirements.\nThe \"ipvs+maglev\" scheme you mentioned I could not find any specific information and open source implementation, perhaps you can provide some relevant URLs.","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"16db2cb9d6f72f76640912cf37df8fae6c3c7762","unresolved":false,"context_lines":[{"line_number":270,"context_line":"  - Distribute flows to different tables by `fwmark` values."},{"line_number":271,"context_line":"  - There is a mapping between the fwmark values and the table values"},{"line_number":272,"context_line":"  - For each table, give it a default nexthop ip."},{"line_number":273,"context_line":"  - Modify the mapping between fwmark values and table values"},{"line_number":274,"context_line":"    when a `nexthop` is unreachable."},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"In order to let traffic from the same network to pass through the router,"},{"line_number":277,"context_line":"L3 agent will also let router to use Proxy ARP by setting command::"}],"source_content_type":"text/x-rst","patch_set":33,"id":"61568299_1f8365eb","line":274,"range":{"start_line":273,"start_character":4,"end_line":274,"end_character":36},"in_reply_to":"e3bacf4a_f582ead3","updated":"2020-12-03 12:22:45.000000000","message":"I think I failed to express my question properly. Sorry for that. What I wanted to ask you is this:\n\nEverything that makes the hashing \"consistent\" happens in the step in lines 273-274, right? The use of iptables HMARK in itself does not make the hashing consistent. That just computes a hash. But consistency depends on how the hash space is (re-)mapped to the (changing) set of nexthops.\n\nIs this understanding correct?\n\nIf it is, then your suggestion (that is implementing lines 273-274) involves a from-scratch implementation of consistent hashing. Which I believe is not a trivial task. That\u0027s why I was suggesting to explore a possibly already existing open source implementation (ipvs+maglev).","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"f601c3b8251ac104b73283f6362b24e58a537e91","unresolved":false,"context_lines":[{"line_number":270,"context_line":"  - Distribute flows to different tables by `fwmark` values."},{"line_number":271,"context_line":"  - There is a mapping between the fwmark values and the table values"},{"line_number":272,"context_line":"  - For each table, give it a default nexthop ip."},{"line_number":273,"context_line":"  - Modify the mapping between fwmark values and table values"},{"line_number":274,"context_line":"    when a `nexthop` is unreachable."},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"In order to let traffic from the same network to pass through the router,"},{"line_number":277,"context_line":"L3 agent will also let router to use Proxy ARP by setting command::"}],"source_content_type":"text/x-rst","patch_set":33,"id":"e3bacf4a_f582ead3","line":274,"range":{"start_line":273,"start_character":4,"end_line":274,"end_character":36},"in_reply_to":"f5d2d2fb_1270c80a","updated":"2020-11-25 08:25:22.000000000","message":"The Linux kernel routing module does not currently implement ecmp routing for consistent hashing, so it has to make a detour based on hmac to implement consistent hashing.\n\nConntrack information does not carry nexthop information, and the linux routing module does not refer to conntrack information when routing.","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"7c121add287cfe93dada4ae930e5e4990e80ff63","unresolved":true,"context_lines":[{"line_number":270,"context_line":"  - Distribute flows to different tables by `fwmark` values."},{"line_number":271,"context_line":"  - There is a mapping between the fwmark values and the table values"},{"line_number":272,"context_line":"  - For each table, give it a default nexthop ip."},{"line_number":273,"context_line":"  - Modify the mapping between fwmark values and table values"},{"line_number":274,"context_line":"    when a `nexthop` is unreachable."},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"In order to let traffic from the same network to pass through the router,"},{"line_number":277,"context_line":"L3 agent will also let router to use Proxy ARP by setting command::"}],"source_content_type":"text/x-rst","patch_set":33,"id":"6a5fe3aa_d673cf12","line":274,"range":{"start_line":273,"start_character":4,"end_line":274,"end_character":36},"in_reply_to":"fb67400e_b7d311e9","updated":"2020-12-08 09:26:41.000000000","message":"I googled a bit more and put together a play-environment. It seems to be doing the job properly.\n\nSimulate having 3 backends.\nMake sure we can identify which backend a request hits, by serving different content.\n $ mkdir 8001\n $ mkdir 8002\n $ mkdir 8003\n $ echo 8001 \u003e 8001/test\n $ echo 8002 \u003e 8002/test\n $ echo 8003 \u003e 8003/test\n $ ( cd 8001 \u0026\u0026 python3 -m http.server 8001 \u0026 )\n $ ( cd 8002 \u0026\u0026 python3 -m http.server 8002 \u0026 )\n $ ( cd 8003 \u0026\u0026 python3 -m http.server 8003 \u0026 )\n\nSee if the \"backends\" work.\n $ wget -q -O- http://127.0.0.1:8001/test\n ...\n\nInstall user space utilities for IPVS.\n $ sudo apt-get install ipvsadm\n\nAdd a VIP (here just port 8000 on the loopback interface) with the 3 \"backends\" we have.\nThe real work is done in the Linux kernel, the mh (Maglev Hashing) scheduler I believe is available since Linux 4.18.\nIn a real setup we would probably use \"-g / --gatewaying\" instead of \"-m / --masquerading\".\n $ sudo ipvsadm -A -t 127.0.0.1:8000 -s mh\n $ sudo ipvsadm -a -t 127.0.0.1:8000 -r 127.0.0.1:8001 -m\n $ sudo ipvsadm -a -t 127.0.0.1:8000 -r 127.0.0.1:8002 -m\n $ sudo ipvsadm -a -t 127.0.0.1:8000 -r 127.0.0.1:8003 -m\n\nTest a request on the VIP. In my environment this request was scheduled to backend 8002.\n $ wget -q -O- http://127.0.0.1:8000/test\n 8002\n\nWhat happens if I delete a different backend? No disruption, the request is not re-scheduled.\n $ sudo ipvsadm -d -t 127.0.0.1:8000 -r 127.0.0.1:8001\n $ wget -q -O- http://127.0.0.1:8000/test\n 8002\n\nAdd it back after the disruption test.\n $ sudo ipvsadm -a -t 127.0.0.1:8000 -r 127.0.0.1:8001 -m\n\nWhat happens if I delete backend 8002? Of course the request must be re-scheduled.\n $ sudo ipvsadm -d -t 127.0.0.1:8000 -r 127.0.0.1:8002\n $ wget -q -O- http://127.0.0.1:8000/test\n 8001\n\nBut when we add backend 8002 back, the request gets back too.\n $ sudo ipvsadm -a -t 127.0.0.1:8000 -r 127.0.0.1:8002 -m\n $ wget -q -O- http://127.0.0.1:8000/test\n 8002\n\nAccording to \"man ipvsadm\":\n\nmh - Maglev Hashing: assigns incoming jobs based on Google\u0027s Maglev hashing algorithm, providing an almost equal share of jobs to each real server and provides minimal disruption. When the set of real servers  changes, a  connection  will likely be sent to the same real server as it was before.  This scheduler has two flags: mh-fallback, which enables fallback to a different server if the selected server was unavailable, and mh-port, which adds the source port number to the hash computation.","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"36b067b90f6399281c9e335cd7138e5d498de37d","unresolved":true,"context_lines":[{"line_number":296,"context_line":"---------------"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"Following REST APIs wil be affected::"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"  PUT /v2.0/routers/\u003crouter_id\u003e/add_extraroutes"},{"line_number":302,"context_line":""}],"source_content_type":"text/x-rst","patch_set":33,"id":"890c27be_cc1564e1","line":299,"range":{"start_line":299,"start_character":20,"end_line":299,"end_character":35},"updated":"2020-11-23 15:45:58.000000000","message":"These API methods will be used, but not changed in any way, right?","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"5bb3c5ba0320c62eb2ba71496de45f752da40c66","unresolved":false,"context_lines":[{"line_number":296,"context_line":"---------------"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"Following REST APIs wil be affected::"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"  PUT /v2.0/routers/\u003crouter_id\u003e/add_extraroutes"},{"line_number":302,"context_line":""}],"source_content_type":"text/x-rst","patch_set":33,"id":"e49f8b93_a844d71e","line":299,"range":{"start_line":299,"start_character":20,"end_line":299,"end_character":35},"in_reply_to":"890c27be_cc1564e1","updated":"2020-11-24 09:04:58.000000000","message":"\u003e These API methods will be used, but not changed in any way, right?\n\nRight.","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"36b067b90f6399281c9e335cd7138e5d498de37d","unresolved":true,"context_lines":[{"line_number":308,"context_line":"routes. See the usage of `extraroutes` on [4]_. (The third API"},{"line_number":309,"context_line":"`PUT /v2.0/routers/\u003crouter_id\u003e` is not recommended for adding routes)"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"Before the ECMP routing Implementation, when L3 agent receive several route"},{"line_number":312,"context_line":"entries with same destination and different nexthops, it will only keep one"},{"line_number":313,"context_line":"entry of them, or replace the existing route with a new one. But now after"},{"line_number":314,"context_line":"these changes, there will be an ECMP route in the router. So you can add an"},{"line_number":315,"context_line":"ECMP route entry like this:"},{"line_number":316,"context_line":""}],"source_content_type":"text/x-rst","patch_set":33,"id":"0715959f_4f7f3128","line":313,"range":{"start_line":311,"start_character":0,"end_line":313,"end_character":60},"updated":"2020-11-23 15:45:58.000000000","message":"I think we need a shim extension to make this behavior change discoverable. Otherwise an unsuspecting client can do the same thing against two different Neutron versions and get two different behaviors.","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"5bb3c5ba0320c62eb2ba71496de45f752da40c66","unresolved":true,"context_lines":[{"line_number":308,"context_line":"routes. See the usage of `extraroutes` on [4]_. (The third API"},{"line_number":309,"context_line":"`PUT /v2.0/routers/\u003crouter_id\u003e` is not recommended for adding routes)"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"Before the ECMP routing Implementation, when L3 agent receive several route"},{"line_number":312,"context_line":"entries with same destination and different nexthops, it will only keep one"},{"line_number":313,"context_line":"entry of them, or replace the existing route with a new one. But now after"},{"line_number":314,"context_line":"these changes, there will be an ECMP route in the router. So you can add an"},{"line_number":315,"context_line":"ECMP route entry like this:"},{"line_number":316,"context_line":""}],"source_content_type":"text/x-rst","patch_set":33,"id":"87bd3e8a_51de941f","line":313,"range":{"start_line":311,"start_character":0,"end_line":313,"end_character":60},"in_reply_to":"0715959f_4f7f3128","updated":"2020-11-24 09:04:58.000000000","message":"\u003e I think we need a shim extension to make this behavior change discoverable. Otherwise an unsuspecting client can do the same thing against two different Neutron versions and get two different behaviors.\n\nWhat do you mean by \"shim extension\"? I hope you can give an example of the effect you want to achieve. And how can an openstack environment has two different Neutron versions?","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"85fad621c919a7aa7bcd37c20d817ced69ee9b4b","unresolved":true,"context_lines":[{"line_number":308,"context_line":"routes. See the usage of `extraroutes` on [4]_. (The third API"},{"line_number":309,"context_line":"`PUT /v2.0/routers/\u003crouter_id\u003e` is not recommended for adding routes)"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"Before the ECMP routing Implementation, when L3 agent receive several route"},{"line_number":312,"context_line":"entries with same destination and different nexthops, it will only keep one"},{"line_number":313,"context_line":"entry of them, or replace the existing route with a new one. But now after"},{"line_number":314,"context_line":"these changes, there will be an ECMP route in the router. So you can add an"},{"line_number":315,"context_line":"ECMP route entry like this:"},{"line_number":316,"context_line":""}],"source_content_type":"text/x-rst","patch_set":33,"id":"dcade94b_19f51429","line":313,"range":{"start_line":311,"start_character":0,"end_line":313,"end_character":60},"in_reply_to":"87bd3e8a_51de941f","updated":"2020-11-24 15:29:15.000000000","message":"By shim extension I mean adding a new record to the list of supported extensions, so we have something on the API, that can be queried and used to discover which behavior to expect. When there\u0027s no change in API syntax, only a semantic (behavior) change we usually still add an extension for that and call it a \"shim extension\". Here\u0027s a patch that does something similar:\n\nhttps://review.opendev.org/c/openstack/neutron/+/562320\n\nIf you search between neutron reviews for \u0027shim\u0027 you can find a whole lot of these.\n\nDoes that make sense?\n\nRegarding the multiple versions: A client (including a human non-admin user of a cloud) generally does not know what version of OpenStack is on the other side and it may talk to multiple OpenStack deployments. When we change a behavior for the same API input, it needs to know which one to expect: the original or the changed behavior.","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"f601c3b8251ac104b73283f6362b24e58a537e91","unresolved":false,"context_lines":[{"line_number":308,"context_line":"routes. See the usage of `extraroutes` on [4]_. (The third API"},{"line_number":309,"context_line":"`PUT /v2.0/routers/\u003crouter_id\u003e` is not recommended for adding routes)"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"Before the ECMP routing Implementation, when L3 agent receive several route"},{"line_number":312,"context_line":"entries with same destination and different nexthops, it will only keep one"},{"line_number":313,"context_line":"entry of them, or replace the existing route with a new one. But now after"},{"line_number":314,"context_line":"these changes, there will be an ECMP route in the router. So you can add an"},{"line_number":315,"context_line":"ECMP route entry like this:"},{"line_number":316,"context_line":""}],"source_content_type":"text/x-rst","patch_set":33,"id":"076a15e1_d191555f","line":313,"range":{"start_line":311,"start_character":0,"end_line":313,"end_character":60},"in_reply_to":"dcade94b_19f51429","updated":"2020-11-25 08:25:22.000000000","message":"Very thanks for telling me that， I‘ll add shim extension for ECMP.","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"36b067b90f6399281c9e335cd7138e5d498de37d","unresolved":true,"context_lines":[{"line_number":371,"context_line":"Documentation Impact"},{"line_number":372,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"User Documentation"},{"line_number":375,"context_line":"------------------"},{"line_number":376,"context_line":"* Needs user documentation"},{"line_number":377,"context_line":""}],"source_content_type":"text/x-rst","patch_set":33,"id":"6ae5f64e_c7808bb4","line":374,"range":{"start_line":374,"start_character":0,"end_line":374,"end_character":18},"updated":"2020-11-23 15:45:58.000000000","message":"After an l3-agent upgrade when the new l3-agent version is started, will we get the old or the new behavior for a pre-existing router with pre-set ECMP extraroutes? If we get the new, that\u0027s just great. If we get the old, it may be worth documenting that you need to re-set your ECMP extraroutes after such an upgrade.","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"5bb3c5ba0320c62eb2ba71496de45f752da40c66","unresolved":false,"context_lines":[{"line_number":371,"context_line":"Documentation Impact"},{"line_number":372,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"User Documentation"},{"line_number":375,"context_line":"------------------"},{"line_number":376,"context_line":"* Needs user documentation"},{"line_number":377,"context_line":""}],"source_content_type":"text/x-rst","patch_set":33,"id":"cf4154bb_f7889f75","line":374,"range":{"start_line":374,"start_character":0,"end_line":374,"end_character":18},"in_reply_to":"6ae5f64e_c7808bb4","updated":"2020-11-24 09:04:58.000000000","message":"Don\u0027t worry about that, the current code logic and experimental results show that the routes are generated according to the new rules.","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"}],"specs/wallaby/l3-router-support-ecmp.rst":[{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"4b593cd684e0571d5899bed3eca2fb43eeb9bb69","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":33,"id":"c77be0ab_2114e623","line":210,"range":{"start_line":210,"start_character":6,"end_line":210,"end_character":21},"in_reply_to":"5c610d83_a513b105","updated":"2020-12-10 16:47:36.000000000","message":"I agree with Bence here that changing behavior of the same API can be problematic, the user has different experience with different backends is hard to explain in documentation.\nI think a well expressed API change is always welcomed","commit_id":"a1d8bfc5c94e841b73f1435aa4dfbd1efdf75ac8"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"09dbfc34db6e03c3ec205a3c62a92610ae94f38e","unresolved":true,"context_lines":[{"line_number":37,"context_line":"we have one \u003cnexthop\u003e unreachable and remove it from ECMP routes, all"},{"line_number":38,"context_line":"connections get redistributed. To avoid this, we intend to use a consistent"},{"line_number":39,"context_line":"hashing instead of the original scheme. This scheme which can support"},{"line_number":40,"context_line":"consistent hashing is based on hmark which added in iptables-1.4.15 or"},{"line_number":41,"context_line":"later. See the history file of iptables on [1]_."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"Then this spec describes how to implement ECMP in Neutron."}],"source_content_type":"text/x-rst","patch_set":35,"id":"961319f1_05b53eda","line":40,"range":{"start_line":40,"start_character":37,"end_line":40,"end_character":42},"updated":"2020-11-30 09:15:25.000000000","message":"nitty nit: \"which was added\"","commit_id":"fa8f20ab30d588f8c5bbbbb95240ba60ed174fb5"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"225c7b26e6910761eb8b0d67f26d5a7bc17b2704","unresolved":false,"context_lines":[{"line_number":37,"context_line":"we have one \u003cnexthop\u003e unreachable and remove it from ECMP routes, all"},{"line_number":38,"context_line":"connections get redistributed. To avoid this, we intend to use a consistent"},{"line_number":39,"context_line":"hashing instead of the original scheme. This scheme which can support"},{"line_number":40,"context_line":"consistent hashing is based on hmark which added in iptables-1.4.15 or"},{"line_number":41,"context_line":"later. See the history file of iptables on [1]_."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"Then this spec describes how to implement ECMP in Neutron."}],"source_content_type":"text/x-rst","patch_set":35,"id":"2bf358a1_d2a26ec4","line":40,"range":{"start_line":40,"start_character":37,"end_line":40,"end_character":42},"in_reply_to":"961319f1_05b53eda","updated":"2020-12-04 02:33:59.000000000","message":"Done","commit_id":"fa8f20ab30d588f8c5bbbbb95240ba60ed174fb5"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"09dbfc34db6e03c3ec205a3c62a92610ae94f38e","unresolved":true,"context_lines":[{"line_number":38,"context_line":"connections get redistributed. To avoid this, we intend to use a consistent"},{"line_number":39,"context_line":"hashing instead of the original scheme. This scheme which can support"},{"line_number":40,"context_line":"consistent hashing is based on hmark which added in iptables-1.4.15 or"},{"line_number":41,"context_line":"later. See the history file of iptables on [1]_."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"Then this spec describes how to implement ECMP in Neutron."},{"line_number":44,"context_line":""}],"source_content_type":"text/x-rst","patch_set":35,"id":"37fb7d31_828f6e5f","line":41,"range":{"start_line":41,"start_character":31,"end_line":41,"end_character":39},"updated":"2020-11-30 09:15:25.000000000","message":"nitty nit: \"the iptables\" I think","commit_id":"fa8f20ab30d588f8c5bbbbb95240ba60ed174fb5"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"225c7b26e6910761eb8b0d67f26d5a7bc17b2704","unresolved":false,"context_lines":[{"line_number":38,"context_line":"connections get redistributed. To avoid this, we intend to use a consistent"},{"line_number":39,"context_line":"hashing instead of the original scheme. This scheme which can support"},{"line_number":40,"context_line":"consistent hashing is based on hmark which added in iptables-1.4.15 or"},{"line_number":41,"context_line":"later. See the history file of iptables on [1]_."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"Then this spec describes how to implement ECMP in Neutron."},{"line_number":44,"context_line":""}],"source_content_type":"text/x-rst","patch_set":35,"id":"ca69584f_4f0b4200","line":41,"range":{"start_line":41,"start_character":31,"end_line":41,"end_character":39},"in_reply_to":"37fb7d31_828f6e5f","updated":"2020-12-04 02:33:59.000000000","message":"Done","commit_id":"fa8f20ab30d588f8c5bbbbb95240ba60ed174fb5"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"09dbfc34db6e03c3ec205a3c62a92610ae94f38e","unresolved":true,"context_lines":[{"line_number":114,"context_line":"  different networks."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"In such a situation, Octavia needs the router to support ECMP for distributing"},{"line_number":117,"context_line":"requests. So Octavia can send a request to Neutron for creating a ECMP route,"},{"line_number":118,"context_line":"then Neutron L3 agent execute command in Neutron router namespace to create an"},{"line_number":119,"context_line":"ECMP entry in it, using VIP as the destination IP of the route\u0027s entry, and"},{"line_number":120,"context_line":"several load balancers\u0027 IP as nexthop IP. So those requests having VIP as"}],"source_content_type":"text/x-rst","patch_set":35,"id":"a9a36208_6abb6b09","line":117,"range":{"start_line":117,"start_character":64,"end_line":117,"end_character":65},"updated":"2020-11-30 09:15:25.000000000","message":"an","commit_id":"fa8f20ab30d588f8c5bbbbb95240ba60ed174fb5"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"225c7b26e6910761eb8b0d67f26d5a7bc17b2704","unresolved":false,"context_lines":[{"line_number":114,"context_line":"  different networks."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"In such a situation, Octavia needs the router to support ECMP for distributing"},{"line_number":117,"context_line":"requests. So Octavia can send a request to Neutron for creating a ECMP route,"},{"line_number":118,"context_line":"then Neutron L3 agent execute command in Neutron router namespace to create an"},{"line_number":119,"context_line":"ECMP entry in it, using VIP as the destination IP of the route\u0027s entry, and"},{"line_number":120,"context_line":"several load balancers\u0027 IP as nexthop IP. So those requests having VIP as"}],"source_content_type":"text/x-rst","patch_set":35,"id":"6652b7c3_a634ef07","line":117,"range":{"start_line":117,"start_character":64,"end_line":117,"end_character":65},"in_reply_to":"a9a36208_6abb6b09","updated":"2020-12-04 02:33:59.000000000","message":"Done","commit_id":"fa8f20ab30d588f8c5bbbbb95240ba60ed174fb5"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"09dbfc34db6e03c3ec205a3c62a92610ae94f38e","unresolved":true,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"In such a situation, Octavia needs the router to support ECMP for distributing"},{"line_number":117,"context_line":"requests. So Octavia can send a request to Neutron for creating a ECMP route,"},{"line_number":118,"context_line":"then Neutron L3 agent execute command in Neutron router namespace to create an"},{"line_number":119,"context_line":"ECMP entry in it, using VIP as the destination IP of the route\u0027s entry, and"},{"line_number":120,"context_line":"several load balancers\u0027 IP as nexthop IP. So those requests having VIP as"},{"line_number":121,"context_line":"their destinations can be distributed to each loadbalancer."}],"source_content_type":"text/x-rst","patch_set":35,"id":"73641ac9_66425917","line":118,"range":{"start_line":118,"start_character":22,"end_line":118,"end_character":29},"updated":"2020-11-30 09:15:25.000000000","message":"executes","commit_id":"fa8f20ab30d588f8c5bbbbb95240ba60ed174fb5"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"09dbfc34db6e03c3ec205a3c62a92610ae94f38e","unresolved":true,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"In such a situation, Octavia needs the router to support ECMP for distributing"},{"line_number":117,"context_line":"requests. So Octavia can send a request to Neutron for creating a ECMP route,"},{"line_number":118,"context_line":"then Neutron L3 agent execute command in Neutron router namespace to create an"},{"line_number":119,"context_line":"ECMP entry in it, using VIP as the destination IP of the route\u0027s entry, and"},{"line_number":120,"context_line":"several load balancers\u0027 IP as nexthop IP. So those requests having VIP as"},{"line_number":121,"context_line":"their destinations can be distributed to each loadbalancer."}],"source_content_type":"text/x-rst","patch_set":35,"id":"884c9c86_cd74ec02","line":118,"range":{"start_line":118,"start_character":41,"end_line":118,"end_character":48},"updated":"2020-11-30 09:15:25.000000000","message":"the Neutron router\u0027s","commit_id":"fa8f20ab30d588f8c5bbbbb95240ba60ed174fb5"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"225c7b26e6910761eb8b0d67f26d5a7bc17b2704","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"In such a situation, Octavia needs the router to support ECMP for distributing"},{"line_number":117,"context_line":"requests. So Octavia can send a request to Neutron for creating a ECMP route,"},{"line_number":118,"context_line":"then Neutron L3 agent execute command in Neutron router namespace to create an"},{"line_number":119,"context_line":"ECMP entry in it, using VIP as the destination IP of the route\u0027s entry, and"},{"line_number":120,"context_line":"several load balancers\u0027 IP as nexthop IP. So those requests having VIP as"},{"line_number":121,"context_line":"their destinations can be distributed to each loadbalancer."}],"source_content_type":"text/x-rst","patch_set":35,"id":"2a9e79f6_7a1ed2f1","line":118,"range":{"start_line":118,"start_character":22,"end_line":118,"end_character":29},"in_reply_to":"73641ac9_66425917","updated":"2020-12-04 02:33:59.000000000","message":"Done","commit_id":"fa8f20ab30d588f8c5bbbbb95240ba60ed174fb5"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"225c7b26e6910761eb8b0d67f26d5a7bc17b2704","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"In such a situation, Octavia needs the router to support ECMP for distributing"},{"line_number":117,"context_line":"requests. So Octavia can send a request to Neutron for creating a ECMP route,"},{"line_number":118,"context_line":"then Neutron L3 agent execute command in Neutron router namespace to create an"},{"line_number":119,"context_line":"ECMP entry in it, using VIP as the destination IP of the route\u0027s entry, and"},{"line_number":120,"context_line":"several load balancers\u0027 IP as nexthop IP. So those requests having VIP as"},{"line_number":121,"context_line":"their destinations can be distributed to each loadbalancer."}],"source_content_type":"text/x-rst","patch_set":35,"id":"7c83efd0_7fa3bef9","line":118,"range":{"start_line":118,"start_character":41,"end_line":118,"end_character":48},"in_reply_to":"884c9c86_cd74ec02","updated":"2020-12-04 02:33:59.000000000","message":"Done","commit_id":"fa8f20ab30d588f8c5bbbbb95240ba60ed174fb5"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"09dbfc34db6e03c3ec205a3c62a92610ae94f38e","unresolved":true,"context_lines":[{"line_number":120,"context_line":"several load balancers\u0027 IP as nexthop IP. So those requests having VIP as"},{"line_number":121,"context_line":"their destinations can be distributed to each loadbalancer."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"The whole process implements two levels load balancing, i.e. load balancing"},{"line_number":124,"context_line":"between multiple loadbalancers and load balancing between the backend"},{"line_number":125,"context_line":"real servers"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-rst","patch_set":35,"id":"cdabee4e_7ab1ebe2","line":123,"range":{"start_line":123,"start_character":40,"end_line":123,"end_character":54},"updated":"2020-11-30 09:15:25.000000000","message":"of load balancing","commit_id":"fa8f20ab30d588f8c5bbbbb95240ba60ed174fb5"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"225c7b26e6910761eb8b0d67f26d5a7bc17b2704","unresolved":false,"context_lines":[{"line_number":120,"context_line":"several load balancers\u0027 IP as nexthop IP. So those requests having VIP as"},{"line_number":121,"context_line":"their destinations can be distributed to each loadbalancer."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"The whole process implements two levels load balancing, i.e. load balancing"},{"line_number":124,"context_line":"between multiple loadbalancers and load balancing between the backend"},{"line_number":125,"context_line":"real servers"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-rst","patch_set":35,"id":"aedb8c69_3e6ea452","line":123,"range":{"start_line":123,"start_character":40,"end_line":123,"end_character":54},"in_reply_to":"cdabee4e_7ab1ebe2","updated":"2020-12-04 02:33:59.000000000","message":"Done","commit_id":"fa8f20ab30d588f8c5bbbbb95240ba60ed174fb5"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"09dbfc34db6e03c3ec205a3c62a92610ae94f38e","unresolved":true,"context_lines":[{"line_number":190,"context_line":"loadbalancer, and it could be modified when adding or removing a load balancing"},{"line_number":191,"context_line":"node."},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"In addition, users can also use the ECMP function for their own purposes"},{"line_number":194,"context_line":"without using Octavia. For putting an ECMP entry into the router namespace,"},{"line_number":195,"context_line":"user can set routes with same destination by using command::"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"  openstack router add route \\"},{"line_number":198,"context_line":"  --route destination\u003d20.0.20.0/24,gateway\u003d12.0.0.11 \\"},{"line_number":199,"context_line":"  --route destination\u003d20.0.20.0/24,gateway\u003d12.0.0.12 router-ecmp"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"And withdraw the ECMP entry with::"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"  openstack router add route \\"},{"line_number":204,"context_line":"  --route destination\u003d20.0.20.0/24,gateway\u003d12.0.0.11 \\"},{"line_number":205,"context_line":"  --route destination\u003d20.0.20.0/24,gateway\u003d12.0.0.12 router-ecmp"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"For more information about router related OSC, please read [3]_."},{"line_number":208,"context_line":""}],"source_content_type":"text/x-rst","patch_set":35,"id":"c52001d5_97104ede","line":205,"range":{"start_line":193,"start_character":0,"end_line":205,"end_character":64},"updated":"2020-11-30 09:15:25.000000000","message":"IMHO this should be written first as \"general\" use case. And Octavia is just an example of users for this new feature.","commit_id":"fa8f20ab30d588f8c5bbbbb95240ba60ed174fb5"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"814ff45aca602bebedd7879a00079b001c6a951a","unresolved":false,"context_lines":[{"line_number":190,"context_line":"loadbalancer, and it could be modified when adding or removing a load balancing"},{"line_number":191,"context_line":"node."},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"In addition, users can also use the ECMP function for their own purposes"},{"line_number":194,"context_line":"without using Octavia. For putting an ECMP entry into the router namespace,"},{"line_number":195,"context_line":"user can set routes with same destination by using command::"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"  openstack router add route \\"},{"line_number":198,"context_line":"  --route destination\u003d20.0.20.0/24,gateway\u003d12.0.0.11 \\"},{"line_number":199,"context_line":"  --route destination\u003d20.0.20.0/24,gateway\u003d12.0.0.12 router-ecmp"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"And withdraw the ECMP entry with::"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"  openstack router add route \\"},{"line_number":204,"context_line":"  --route destination\u003d20.0.20.0/24,gateway\u003d12.0.0.11 \\"},{"line_number":205,"context_line":"  --route destination\u003d20.0.20.0/24,gateway\u003d12.0.0.12 router-ecmp"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"For more information about router related OSC, please read [3]_."},{"line_number":208,"context_line":""}],"source_content_type":"text/x-rst","patch_set":35,"id":"1c259e0a_a52b0db8","line":205,"range":{"start_line":193,"start_character":0,"end_line":205,"end_character":64},"in_reply_to":"5b249c98_8206cd77","updated":"2020-12-09 09:54:38.000000000","message":"yes, thx :)","commit_id":"fa8f20ab30d588f8c5bbbbb95240ba60ed174fb5"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"225c7b26e6910761eb8b0d67f26d5a7bc17b2704","unresolved":true,"context_lines":[{"line_number":190,"context_line":"loadbalancer, and it could be modified when adding or removing a load balancing"},{"line_number":191,"context_line":"node."},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"In addition, users can also use the ECMP function for their own purposes"},{"line_number":194,"context_line":"without using Octavia. For putting an ECMP entry into the router namespace,"},{"line_number":195,"context_line":"user can set routes with same destination by using command::"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"  openstack router add route \\"},{"line_number":198,"context_line":"  --route destination\u003d20.0.20.0/24,gateway\u003d12.0.0.11 \\"},{"line_number":199,"context_line":"  --route destination\u003d20.0.20.0/24,gateway\u003d12.0.0.12 router-ecmp"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"And withdraw the ECMP entry with::"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"  openstack router add route \\"},{"line_number":204,"context_line":"  --route destination\u003d20.0.20.0/24,gateway\u003d12.0.0.11 \\"},{"line_number":205,"context_line":"  --route destination\u003d20.0.20.0/24,gateway\u003d12.0.0.12 router-ecmp"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"For more information about router related OSC, please read [3]_."},{"line_number":208,"context_line":""}],"source_content_type":"text/x-rst","patch_set":35,"id":"5b249c98_8206cd77","line":205,"range":{"start_line":193,"start_character":0,"end_line":205,"end_character":64},"in_reply_to":"c52001d5_97104ede","updated":"2020-12-04 02:33:59.000000000","message":"I\u0027ll move this to the front of Octavia\u0027s workflow， is that correct？","commit_id":"fa8f20ab30d588f8c5bbbbb95240ba60ed174fb5"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"db6d09425e0cc29df736a7e43f9bb2f27cf232db","unresolved":true,"context_lines":[{"line_number":31,"context_line":".. _P2:"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"  **Note:** Items marked with [`P2`_] refer to lower priority features"},{"line_number":34,"context_line":"  to be designed / implemented only after initial release."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"[`P2`_] Currently the equal cost route is a simple 5 tuple, that means if"},{"line_number":37,"context_line":"we have one \u003cnexthop\u003e unreachable and remove it from ECMP routes, all"}],"source_content_type":"text/x-rst","patch_set":36,"id":"61104184_67849ba8","line":34,"updated":"2020-12-17 05:12:24.000000000","message":"(rendering issue) L.33-34 need three space indent. Add one more space per line.\nThe same thing applies to other similar notes in this file.\n\nSee the rendered HTML \nhttps://59cf76542d9f261862f7-56852c2a39b5b5caf6602061c30b0cc0.ssl.cf2.rackcdn.com/729532/36/check/openstack-tox-docs/a9d611b/docs/specs/wallaby/l3-router-support-ecmp.html","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"db6d09425e0cc29df736a7e43f9bb2f27cf232db","unresolved":true,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":".. _P2:"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"  **Note:** Items marked with [`P2`_] refer to lower priority features"},{"line_number":34,"context_line":"  to be designed / implemented only after initial release."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"[`P2`_] Currently the equal cost route is a simple 5 tuple, that means if"},{"line_number":37,"context_line":"we have one \u003cnexthop\u003e unreachable and remove it from ECMP routes, all"}],"source_content_type":"text/x-rst","patch_set":36,"id":"6823671b_c44858d5","line":34,"range":{"start_line":33,"start_character":47,"end_line":34,"end_character":58},"updated":"2020-12-17 05:12:24.000000000","message":"Could you clarify \"lower priority features\" is a part of this blueprint or not?","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"1016fde1fd919b35da1a7bab4e144290ba34fb72","unresolved":false,"context_lines":[{"line_number":31,"context_line":".. _P2:"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"  **Note:** Items marked with [`P2`_] refer to lower priority features"},{"line_number":34,"context_line":"  to be designed / implemented only after initial release."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"[`P2`_] Currently the equal cost route is a simple 5 tuple, that means if"},{"line_number":37,"context_line":"we have one \u003cnexthop\u003e unreachable and remove it from ECMP routes, all"}],"source_content_type":"text/x-rst","patch_set":36,"id":"f899068c_d1cca977","line":34,"in_reply_to":"61104184_67849ba8","updated":"2021-01-21 03:08:49.000000000","message":"Done","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"1016fde1fd919b35da1a7bab4e144290ba34fb72","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":".. _P2:"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"  **Note:** Items marked with [`P2`_] refer to lower priority features"},{"line_number":34,"context_line":"  to be designed / implemented only after initial release."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"[`P2`_] Currently the equal cost route is a simple 5 tuple, that means if"},{"line_number":37,"context_line":"we have one \u003cnexthop\u003e unreachable and remove it from ECMP routes, all"}],"source_content_type":"text/x-rst","patch_set":36,"id":"e619ca23_3e1b42ba","line":34,"range":{"start_line":33,"start_character":47,"end_line":34,"end_character":58},"in_reply_to":"6823671b_c44858d5","updated":"2021-01-21 03:08:49.000000000","message":"It is.","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"814ff45aca602bebedd7879a00079b001c6a951a","unresolved":true,"context_lines":[{"line_number":149,"context_line":""},{"line_number":150,"context_line":"For more information about router related OSC, please read [3]_."},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"An integrated sequence diagram of the Octaiva\u0027s use case is here:"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"::"},{"line_number":155,"context_line":""}],"source_content_type":"text/x-rst","patch_set":36,"id":"f2beb774_9a10035d","line":152,"range":{"start_line":152,"start_character":38,"end_line":152,"end_character":45},"updated":"2020-12-09 09:54:38.000000000","message":"nitty nit: Octavia :)","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"1016fde1fd919b35da1a7bab4e144290ba34fb72","unresolved":false,"context_lines":[{"line_number":149,"context_line":""},{"line_number":150,"context_line":"For more information about router related OSC, please read [3]_."},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"An integrated sequence diagram of the Octaiva\u0027s use case is here:"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"::"},{"line_number":155,"context_line":""}],"source_content_type":"text/x-rst","patch_set":36,"id":"8bdaa120_c3eac15c","line":152,"range":{"start_line":152,"start_character":38,"end_line":152,"end_character":45},"in_reply_to":"f2beb774_9a10035d","updated":"2021-01-21 03:08:49.000000000","message":"Done","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"db6d09425e0cc29df736a7e43f9bb2f27cf232db","unresolved":true,"context_lines":[{"line_number":210,"context_line":"Data flow"},{"line_number":211,"context_line":"---------"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"* The intranet client requests mac address of the VIP and accesses the"},{"line_number":214,"context_line":"  service based on this mac address."},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"* When the intranet client requests mac address of the VIP, the router"}],"source_content_type":"text/x-rst","patch_set":36,"id":"8ecc66d4_4793b422","line":213,"range":{"start_line":213,"start_character":2,"end_line":213,"end_character":21},"updated":"2020-12-17 05:12:24.000000000","message":"What is \"The intranet client\"? Do you discuss how a client on \"Tenant based network\" in the above diagram (a network which LBs exist) communicate with LBs?\n\nLooking at \"Proposed Change\", It seems you are talking about data flow from a client *on a same network*. Is it right? If so, I would suggest to use the same terminology consistently to avoid confusions.","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"1016fde1fd919b35da1a7bab4e144290ba34fb72","unresolved":true,"context_lines":[{"line_number":210,"context_line":"Data flow"},{"line_number":211,"context_line":"---------"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"* The intranet client requests mac address of the VIP and accesses the"},{"line_number":214,"context_line":"  service based on this mac address."},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"* When the intranet client requests mac address of the VIP, the router"}],"source_content_type":"text/x-rst","patch_set":36,"id":"f728090d_67d8cfc8","line":213,"range":{"start_line":213,"start_character":2,"end_line":213,"end_character":21},"in_reply_to":"8ecc66d4_4793b422","updated":"2021-01-21 03:08:49.000000000","message":"By ‘The intranet client’，I mean VMs（client and LBs） under the same layer 2 broadcast domain，so yes, and I will change the terminology.","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"52560449934b015b8cdbdb51e11f78f9e071e467","unresolved":true,"context_lines":[{"line_number":223,"context_line":"* Load balancer accepts connections from clients, receives traffic, then"},{"line_number":224,"context_line":"  distributes it to the back-end server pool."},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"* Traffic from the back-end server pool goes to the gateway through"},{"line_number":227,"context_line":"  load balancer."},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"Proposed Change"},{"line_number":230,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":36,"id":"523a082b_43a9c98f","line":227,"range":{"start_line":226,"start_character":0,"end_line":227,"end_character":16},"updated":"2020-12-09 14:51:25.000000000","message":"Could you explain the detail about how the packet from the backend server replied back to the intranet client?","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"fa0e18b37112b1d03b2931af0923351a8afe0ebf","unresolved":true,"context_lines":[{"line_number":223,"context_line":"* Load balancer accepts connections from clients, receives traffic, then"},{"line_number":224,"context_line":"  distributes it to the back-end server pool."},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"* Traffic from the back-end server pool goes to the gateway through"},{"line_number":227,"context_line":"  load balancer."},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"Proposed Change"},{"line_number":230,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":36,"id":"f8850cd5_d0d9efe9","line":227,"range":{"start_line":226,"start_character":0,"end_line":227,"end_character":16},"in_reply_to":"523a082b_43a9c98f","updated":"2020-12-10 10:18:09.000000000","message":"The reply packets from the backend server go through amphorea and then comes to the intranet client。 That\u0027s it, the reply flow has nothing to do with neutron and ECMP anymore，","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"ec39cf9b681ebcfaa5cf87c0e02880647561097e","unresolved":false,"context_lines":[{"line_number":223,"context_line":"* Load balancer accepts connections from clients, receives traffic, then"},{"line_number":224,"context_line":"  distributes it to the back-end server pool."},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"* Traffic from the back-end server pool goes to the gateway through"},{"line_number":227,"context_line":"  load balancer."},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"Proposed Change"},{"line_number":230,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":36,"id":"40f677eb_df0d147e","line":227,"range":{"start_line":226,"start_character":0,"end_line":227,"end_character":16},"in_reply_to":"8affc9af_9d185b10","updated":"2020-12-14 08:34:50.000000000","message":"Done","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"a79435488bfabb51b3b436e795d41e7910a70822","unresolved":true,"context_lines":[{"line_number":223,"context_line":"* Load balancer accepts connections from clients, receives traffic, then"},{"line_number":224,"context_line":"  distributes it to the back-end server pool."},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"* Traffic from the back-end server pool goes to the gateway through"},{"line_number":227,"context_line":"  load balancer."},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"Proposed Change"},{"line_number":230,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":36,"id":"8affc9af_9d185b10","line":227,"range":{"start_line":226,"start_character":0,"end_line":227,"end_character":16},"in_reply_to":"f8850cd5_d0d9efe9","updated":"2020-12-10 11:33:39.000000000","message":"IMO, your answer should be written to this spec. 😊","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"52560449934b015b8cdbdb51e11f78f9e071e467","unresolved":true,"context_lines":[{"line_number":266,"context_line":"[`p2`_]For keeping connection while removing a load balancing node, use"},{"line_number":267,"context_line":"iptables instead of simply a ip route entry."},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"  - Use `HMARK` to mark flows in mangle table, the `fwmark` values"},{"line_number":270,"context_line":"    determined by the source address."},{"line_number":271,"context_line":"  - Distribute flows to different tables by `fwmark` values."},{"line_number":272,"context_line":"  - There is a mapping between the `fwmark` values and the table values"},{"line_number":273,"context_line":"  - For each table, give it a default nexthop ip."},{"line_number":274,"context_line":"  - Modify the mapping between `fwmark` values and table values"},{"line_number":275,"context_line":"    when a `nexthop` is unreachable."},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"In order to let traffic from the same network to pass through the router,"},{"line_number":278,"context_line":"L3 agent will also let router to use Proxy ARP by setting command::"}],"source_content_type":"text/x-rst","patch_set":36,"id":"e5927534_f62b92b2","line":275,"range":{"start_line":269,"start_character":0,"end_line":275,"end_character":36},"updated":"2020-12-09 14:51:25.000000000","message":"All these works are done by kernel automatically?","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"ec39cf9b681ebcfaa5cf87c0e02880647561097e","unresolved":false,"context_lines":[{"line_number":266,"context_line":"[`p2`_]For keeping connection while removing a load balancing node, use"},{"line_number":267,"context_line":"iptables instead of simply a ip route entry."},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"  - Use `HMARK` to mark flows in mangle table, the `fwmark` values"},{"line_number":270,"context_line":"    determined by the source address."},{"line_number":271,"context_line":"  - Distribute flows to different tables by `fwmark` values."},{"line_number":272,"context_line":"  - There is a mapping between the `fwmark` values and the table values"},{"line_number":273,"context_line":"  - For each table, give it a default nexthop ip."},{"line_number":274,"context_line":"  - Modify the mapping between `fwmark` values and table values"},{"line_number":275,"context_line":"    when a `nexthop` is unreachable."},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"In order to let traffic from the same network to pass through the router,"},{"line_number":278,"context_line":"L3 agent will also let router to use Proxy ARP by setting command::"}],"source_content_type":"text/x-rst","patch_set":36,"id":"bca8d9f0_c2a5abf0","line":275,"range":{"start_line":269,"start_character":0,"end_line":275,"end_character":36},"in_reply_to":"4356b73c_c4ff66b3","updated":"2020-12-14 08:34:50.000000000","message":"Yes, these rules are to be issued by L3-agent.","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"a79435488bfabb51b3b436e795d41e7910a70822","unresolved":false,"context_lines":[{"line_number":266,"context_line":"[`p2`_]For keeping connection while removing a load balancing node, use"},{"line_number":267,"context_line":"iptables instead of simply a ip route entry."},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"  - Use `HMARK` to mark flows in mangle table, the `fwmark` values"},{"line_number":270,"context_line":"    determined by the source address."},{"line_number":271,"context_line":"  - Distribute flows to different tables by `fwmark` values."},{"line_number":272,"context_line":"  - There is a mapping between the `fwmark` values and the table values"},{"line_number":273,"context_line":"  - For each table, give it a default nexthop ip."},{"line_number":274,"context_line":"  - Modify the mapping between `fwmark` values and table values"},{"line_number":275,"context_line":"    when a `nexthop` is unreachable."},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"In order to let traffic from the same network to pass through the router,"},{"line_number":278,"context_line":"L3 agent will also let router to use Proxy ARP by setting command::"}],"source_content_type":"text/x-rst","patch_set":36,"id":"4356b73c_c4ff66b3","line":275,"range":{"start_line":269,"start_character":0,"end_line":275,"end_character":36},"in_reply_to":"e0770cab_8d594f8e","updated":"2020-12-10 11:33:39.000000000","message":"Did you mean all these works will be done by L3-agent if there are some ECMP routes?","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"fa0e18b37112b1d03b2931af0923351a8afe0ebf","unresolved":false,"context_lines":[{"line_number":266,"context_line":"[`p2`_]For keeping connection while removing a load balancing node, use"},{"line_number":267,"context_line":"iptables instead of simply a ip route entry."},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"  - Use `HMARK` to mark flows in mangle table, the `fwmark` values"},{"line_number":270,"context_line":"    determined by the source address."},{"line_number":271,"context_line":"  - Distribute flows to different tables by `fwmark` values."},{"line_number":272,"context_line":"  - There is a mapping between the `fwmark` values and the table values"},{"line_number":273,"context_line":"  - For each table, give it a default nexthop ip."},{"line_number":274,"context_line":"  - Modify the mapping between `fwmark` values and table values"},{"line_number":275,"context_line":"    when a `nexthop` is unreachable."},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"In order to let traffic from the same network to pass through the router,"},{"line_number":278,"context_line":"L3 agent will also let router to use Proxy ARP by setting command::"}],"source_content_type":"text/x-rst","patch_set":36,"id":"e0770cab_8d594f8e","line":275,"range":{"start_line":269,"start_character":0,"end_line":275,"end_character":36},"in_reply_to":"e5927534_f62b92b2","updated":"2020-12-10 10:18:09.000000000","message":"\u003e All these works are done by kernel automatically?\n\nOf course we need neutron to issue some iptables and ip rule commands，\nI think you have seen the old version of this part。\nReviewer Lajos Katona said ：”This part sounds too loadbalancer specific“\nSo I\u0027ve modified and simplified this passage into the terminology。\n\nThe old version of this part was：\n\n  -  Use `HMARK` in mangle table, marking flows with a number:\n\n  ::\n\n    iptables -t mangle -A PREROUTING -p tcp -d \u003cvip\u003e -j HMARK \\\n    --hmark-tuple src --hmark-mod \u003cN\u003e --hmark-rnd 0xcafeface --hmark-offset X\n\n    #N is the number of the loadbalancers\n    #X is the number of the offset where the ecmp table start\n\n  - Distribute flows to different tables by `fwmark` value:\n\n  ::\n\n    ip route add fwmark \u003cX + 0\u003e table \u003cX + 0\u003e pref 100\n    ip route add fwmark \u003cX + 1\u003e table \u003cX + 1\u003e pref 100\n    ...\n    ip route add fwmark \u003cX + N - 1\u003e table \u003cX + N - 1\u003e pref 100\n\n\n  - For each table, give it a default \u003cnexthop_ip\u003e:\n\n  ::\n\n    ip route add default via \u003cnexthop_ip1\u003e table \u003cX+0\u003e\n    ip route add default via \u003cnexthop_ip2\u003e table \u003cX+1\u003e\n    ...\n\n  - If \u003cnexthop_ip1\u003e is not reachable for the time:\n\n  ::\n\n    ip route del fwmark \u003cX + 0\u003e\n    ip route add fwmark \u003cX + 0\u003e table \u003cX + 1\u003e pref 100","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"52560449934b015b8cdbdb51e11f78f9e071e467","unresolved":true,"context_lines":[{"line_number":277,"context_line":"In order to let traffic from the same network to pass through the router,"},{"line_number":278,"context_line":"L3 agent will also let router to use Proxy ARP by setting command::"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"  sysctl -w net.ipv4.conf.\u003cNIC_1\u003e.proxy_arp_pvlan\u003d1"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"* \u003cNIC_1\u003e is the name of the router internal gateway to which the"},{"line_number":283,"context_line":"  destination subnet is connected. For example, router `R1` is connected"}],"source_content_type":"text/x-rst","patch_set":36,"id":"86777b6f_aeeff51f","line":280,"range":{"start_line":280,"start_character":44,"end_line":280,"end_character":49},"updated":"2020-12-09 14:51:25.000000000","message":"Why use this config? The \"proxy_arp\" option has some side effect?","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"ec39cf9b681ebcfaa5cf87c0e02880647561097e","unresolved":false,"context_lines":[{"line_number":277,"context_line":"In order to let traffic from the same network to pass through the router,"},{"line_number":278,"context_line":"L3 agent will also let router to use Proxy ARP by setting command::"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"  sysctl -w net.ipv4.conf.\u003cNIC_1\u003e.proxy_arp_pvlan\u003d1"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"* \u003cNIC_1\u003e is the name of the router internal gateway to which the"},{"line_number":283,"context_line":"  destination subnet is connected. For example, router `R1` is connected"}],"source_content_type":"text/x-rst","patch_set":36,"id":"bbf3a74f_e31347b5","line":280,"range":{"start_line":280,"start_character":44,"end_line":280,"end_character":49},"in_reply_to":"02f9418c_35010d77","updated":"2020-12-14 08:34:50.000000000","message":"\u003e My question is why we choose \"proxy_arp_pvlan\"? why we do not use \"proxy_arp\"?\n\nAlthough I would love to answer your question in theory, I really haven\u0027t found a reason why the proxy_arp parameter doesn\u0027t work.\n\nWhat I want to do is to allow traffic between hosts on the same subnet to be forced through the router, as you can see from the following parameter description and RFC3069, proxy_arp_pvlan should be designed for this need.\nhttps://sysctl-explorer.net/net/ipv4/proxy_arp_pvlan/\nhttps://tools.ietf.org/html/rfc3069\n\nI also found a example from the web that wanted to use proxy_arp to achieve a similar goal but failed.\nhttps://serverfault.com/questions/212074/is-it-possible-to-use-proxy-arp-back-to-the-same-interface","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"0d4a61fdd97d4f5050da2b318c8c9233953302e1","unresolved":false,"context_lines":[{"line_number":277,"context_line":"In order to let traffic from the same network to pass through the router,"},{"line_number":278,"context_line":"L3 agent will also let router to use Proxy ARP by setting command::"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"  sysctl -w net.ipv4.conf.\u003cNIC_1\u003e.proxy_arp_pvlan\u003d1"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"* \u003cNIC_1\u003e is the name of the router internal gateway to which the"},{"line_number":283,"context_line":"  destination subnet is connected. For example, router `R1` is connected"}],"source_content_type":"text/x-rst","patch_set":36,"id":"88483b95_cdb42924","line":280,"range":{"start_line":280,"start_character":44,"end_line":280,"end_character":49},"in_reply_to":"1018fd95_53888254","updated":"2021-01-26 02:26:39.000000000","message":"\u003e \u003e nit: I would suggest to add this discussion to the spec as a note. The review is long and it is not easy to follow all discussions.\n\u003e \n\u003e I am not very familiar with the functions of this site, cloud you teach me how to do it?\n\nAkihiro Motoki means you should add some important Q/A notes to this spec. Something like we do at line 226-227.","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"4b593cd684e0571d5899bed3eca2fb43eeb9bb69","unresolved":false,"context_lines":[{"line_number":277,"context_line":"In order to let traffic from the same network to pass through the router,"},{"line_number":278,"context_line":"L3 agent will also let router to use Proxy ARP by setting command::"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"  sysctl -w net.ipv4.conf.\u003cNIC_1\u003e.proxy_arp_pvlan\u003d1"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"* \u003cNIC_1\u003e is the name of the router internal gateway to which the"},{"line_number":283,"context_line":"  destination subnet is connected. For example, router `R1` is connected"}],"source_content_type":"text/x-rst","patch_set":36,"id":"02f9418c_35010d77","line":280,"range":{"start_line":280,"start_character":44,"end_line":280,"end_character":49},"in_reply_to":"2b37b6e2_cc30542a","updated":"2020-12-10 16:47:36.000000000","message":"It was me who said that it is not necessary to use both.\n(https://review.opendev.org/c/openstack/neutron-specs/+/729532/32/specs/victoria/l3-router-support-ecmp.rst#308)","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"fa0e18b37112b1d03b2931af0923351a8afe0ebf","unresolved":false,"context_lines":[{"line_number":277,"context_line":"In order to let traffic from the same network to pass through the router,"},{"line_number":278,"context_line":"L3 agent will also let router to use Proxy ARP by setting command::"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"  sysctl -w net.ipv4.conf.\u003cNIC_1\u003e.proxy_arp_pvlan\u003d1"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"* \u003cNIC_1\u003e is the name of the router internal gateway to which the"},{"line_number":283,"context_line":"  destination subnet is connected. For example, router `R1` is connected"}],"source_content_type":"text/x-rst","patch_set":36,"id":"fd29992c_01138fca","line":280,"range":{"start_line":280,"start_character":44,"end_line":280,"end_character":49},"in_reply_to":"86777b6f_aeeff51f","updated":"2020-12-10 10:18:09.000000000","message":"A reviewer told me \"Don’t need to be used together with proxy_arp\"\nYou can see the reason here\nhttps://sysctl-explorer.net/net/ipv4/proxy_arp_pvlan/","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"1016fde1fd919b35da1a7bab4e144290ba34fb72","unresolved":false,"context_lines":[{"line_number":277,"context_line":"In order to let traffic from the same network to pass through the router,"},{"line_number":278,"context_line":"L3 agent will also let router to use Proxy ARP by setting command::"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"  sysctl -w net.ipv4.conf.\u003cNIC_1\u003e.proxy_arp_pvlan\u003d1"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"* \u003cNIC_1\u003e is the name of the router internal gateway to which the"},{"line_number":283,"context_line":"  destination subnet is connected. For example, router `R1` is connected"}],"source_content_type":"text/x-rst","patch_set":36,"id":"1018fd95_53888254","line":280,"range":{"start_line":280,"start_character":44,"end_line":280,"end_character":49},"in_reply_to":"b3f064c5_42e42eb0","updated":"2021-01-21 03:08:49.000000000","message":"\u003e nit: I would suggest to add this discussion to the spec as a note. The review is long and it is not easy to follow all discussions.\n\nI am not very familiar with the functions of this site, cloud you teach me how to do it?","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"db6d09425e0cc29df736a7e43f9bb2f27cf232db","unresolved":false,"context_lines":[{"line_number":277,"context_line":"In order to let traffic from the same network to pass through the router,"},{"line_number":278,"context_line":"L3 agent will also let router to use Proxy ARP by setting command::"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"  sysctl -w net.ipv4.conf.\u003cNIC_1\u003e.proxy_arp_pvlan\u003d1"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"* \u003cNIC_1\u003e is the name of the router internal gateway to which the"},{"line_number":283,"context_line":"  destination subnet is connected. For example, router `R1` is connected"}],"source_content_type":"text/x-rst","patch_set":36,"id":"b3f064c5_42e42eb0","line":280,"range":{"start_line":280,"start_character":44,"end_line":280,"end_character":49},"in_reply_to":"bbf3a74f_e31347b5","updated":"2020-12-17 05:12:24.000000000","message":"nit: I would suggest to add this discussion to the spec as a note. The review is long and it is not easy to follow all discussions.","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"a79435488bfabb51b3b436e795d41e7910a70822","unresolved":false,"context_lines":[{"line_number":277,"context_line":"In order to let traffic from the same network to pass through the router,"},{"line_number":278,"context_line":"L3 agent will also let router to use Proxy ARP by setting command::"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"  sysctl -w net.ipv4.conf.\u003cNIC_1\u003e.proxy_arp_pvlan\u003d1"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"* \u003cNIC_1\u003e is the name of the router internal gateway to which the"},{"line_number":283,"context_line":"  destination subnet is connected. For example, router `R1` is connected"}],"source_content_type":"text/x-rst","patch_set":36,"id":"2b37b6e2_cc30542a","line":280,"range":{"start_line":280,"start_character":44,"end_line":280,"end_character":49},"in_reply_to":"fd29992c_01138fca","updated":"2020-12-10 11:33:39.000000000","message":"My question is why we choose \"proxy_arp_pvlan\"? why we do not use \"proxy_arp\"?","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"db6d09425e0cc29df736a7e43f9bb2f27cf232db","unresolved":true,"context_lines":[{"line_number":279,"context_line":""},{"line_number":280,"context_line":"  sysctl -w net.ipv4.conf.\u003cNIC_1\u003e.proxy_arp_pvlan\u003d1"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"* \u003cNIC_1\u003e is the name of the router internal gateway to which the"},{"line_number":283,"context_line":"  destination subnet is connected. For example, router `R1` is connected"},{"line_number":284,"context_line":"  to a subnet `sub-1` whose cidr is `10.10.10.0/24`, so there will be a"},{"line_number":285,"context_line":"  virtual network interface device `qr-abcdefgh` in the router related"}],"source_content_type":"text/x-rst","patch_set":36,"id":"a14ce286_157281e2","line":282,"range":{"start_line":282,"start_character":25,"end_line":282,"end_character":52},"updated":"2020-12-17 05:12:24.000000000","message":"We usually call it as \"router interface\" (in the terminology in the neutron API).","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"1016fde1fd919b35da1a7bab4e144290ba34fb72","unresolved":false,"context_lines":[{"line_number":279,"context_line":""},{"line_number":280,"context_line":"  sysctl -w net.ipv4.conf.\u003cNIC_1\u003e.proxy_arp_pvlan\u003d1"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"* \u003cNIC_1\u003e is the name of the router internal gateway to which the"},{"line_number":283,"context_line":"  destination subnet is connected. For example, router `R1` is connected"},{"line_number":284,"context_line":"  to a subnet `sub-1` whose cidr is `10.10.10.0/24`, so there will be a"},{"line_number":285,"context_line":"  virtual network interface device `qr-abcdefgh` in the router related"}],"source_content_type":"text/x-rst","patch_set":36,"id":"3c18fe75_a8ff6314","line":282,"range":{"start_line":282,"start_character":25,"end_line":282,"end_character":52},"in_reply_to":"a14ce286_157281e2","updated":"2021-01-21 03:08:49.000000000","message":"Done","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"db6d09425e0cc29df736a7e43f9bb2f27cf232db","unresolved":true,"context_lines":[{"line_number":285,"context_line":"  virtual network interface device `qr-abcdefgh` in the router related"},{"line_number":286,"context_line":"  namespace as the internal gateway for the subnet `sub-1`, then add an"},{"line_number":287,"context_line":"  ECMP route with a destination like `10.10.10.5/32` which is in the"},{"line_number":288,"context_line":"  scope of the subnet `sub-1`, at this point, the above two commands"},{"line_number":289,"context_line":"  will be executed and \u003cNIC_1\u003e will be `qr-abcdefgh`."},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"Data Model Impact"}],"source_content_type":"text/x-rst","patch_set":36,"id":"87521e5d_bf2c2de2","line":288,"range":{"start_line":288,"start_character":56,"end_line":288,"end_character":59},"updated":"2020-12-17 05:12:24.000000000","message":"I see only \"one\" command...","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"1016fde1fd919b35da1a7bab4e144290ba34fb72","unresolved":true,"context_lines":[{"line_number":285,"context_line":"  virtual network interface device `qr-abcdefgh` in the router related"},{"line_number":286,"context_line":"  namespace as the internal gateway for the subnet `sub-1`, then add an"},{"line_number":287,"context_line":"  ECMP route with a destination like `10.10.10.5/32` which is in the"},{"line_number":288,"context_line":"  scope of the subnet `sub-1`, at this point, the above two commands"},{"line_number":289,"context_line":"  will be executed and \u003cNIC_1\u003e will be `qr-abcdefgh`."},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"Data Model Impact"}],"source_content_type":"text/x-rst","patch_set":36,"id":"56435061_4469e61b","line":288,"range":{"start_line":288,"start_character":56,"end_line":288,"end_character":59},"in_reply_to":"87521e5d_bf2c2de2","updated":"2021-01-21 03:08:49.000000000","message":"my mistake","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"52560449934b015b8cdbdb51e11f78f9e071e467","unresolved":true,"context_lines":[{"line_number":321,"context_line":""},{"line_number":322,"context_line":"  { \"router\":"},{"line_number":323,"context_line":"    { \"routes\":"},{"line_number":324,"context_line":"      [ { \"destination\": \"192.168.1.6/32\","},{"line_number":325,"context_line":"          \"nexthop\": \"192.168.1.88\" },"},{"line_number":326,"context_line":"        { \"destination\": \"192.168.1.6/32\","},{"line_number":327,"context_line":"          \"nexthop\": \"192.168.1.99\" }"},{"line_number":328,"context_line":"        ..."},{"line_number":329,"context_line":"      ]"},{"line_number":330,"context_line":"    }"}],"source_content_type":"text/x-rst","patch_set":36,"id":"578967c7_b4cee34b","line":327,"range":{"start_line":324,"start_character":8,"end_line":327,"end_character":37},"updated":"2020-12-09 14:51:25.000000000","message":"Neutron current allow to add route entry to override the default route, something like this:\nto 0.0.0.0 via 1.2.3.4\nto 0.0.0.0 via 1.2.3.5\n\nand allow to set the link routes:\nto 1.2.3.4 via 0.0.0.1/0\nto 1.2.3.4 via 0.0.0.2/0\n\nThese routes will have side effect to such ecmp?","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"ec39cf9b681ebcfaa5cf87c0e02880647561097e","unresolved":false,"context_lines":[{"line_number":321,"context_line":""},{"line_number":322,"context_line":"  { \"router\":"},{"line_number":323,"context_line":"    { \"routes\":"},{"line_number":324,"context_line":"      [ { \"destination\": \"192.168.1.6/32\","},{"line_number":325,"context_line":"          \"nexthop\": \"192.168.1.88\" },"},{"line_number":326,"context_line":"        { \"destination\": \"192.168.1.6/32\","},{"line_number":327,"context_line":"          \"nexthop\": \"192.168.1.99\" }"},{"line_number":328,"context_line":"        ..."},{"line_number":329,"context_line":"      ]"},{"line_number":330,"context_line":"    }"}],"source_content_type":"text/x-rst","patch_set":36,"id":"d4182833_bd9f4ef1","line":327,"range":{"start_line":324,"start_character":8,"end_line":327,"end_character":37},"in_reply_to":"2a57bc7d_e46bb268","updated":"2020-12-14 08:34:50.000000000","message":"Done","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"fa0e18b37112b1d03b2931af0923351a8afe0ebf","unresolved":true,"context_lines":[{"line_number":321,"context_line":""},{"line_number":322,"context_line":"  { \"router\":"},{"line_number":323,"context_line":"    { \"routes\":"},{"line_number":324,"context_line":"      [ { \"destination\": \"192.168.1.6/32\","},{"line_number":325,"context_line":"          \"nexthop\": \"192.168.1.88\" },"},{"line_number":326,"context_line":"        { \"destination\": \"192.168.1.6/32\","},{"line_number":327,"context_line":"          \"nexthop\": \"192.168.1.99\" }"},{"line_number":328,"context_line":"        ..."},{"line_number":329,"context_line":"      ]"},{"line_number":330,"context_line":"    }"}],"source_content_type":"text/x-rst","patch_set":36,"id":"b15bfb6f_27abb050","line":327,"range":{"start_line":324,"start_character":8,"end_line":327,"end_character":37},"in_reply_to":"578967c7_b4cee34b","updated":"2020-12-10 10:18:09.000000000","message":"As long as neutron, the lunix kernel and pyroute2 all support doing this, I think it\u0027s fine, Octavia won\u0027t modify this kind of routing. And I have no reason to stop users from doing this themselves.\n\nAbout the second one：\nto 1.2.3.4 via 0.0.0.1/0\nto 1.2.3.4 via 0.0.0.2/0\nI have tried to run the cmd ：\nip route add 1.2.3.4 via 0.0.0.1/0\nit comes to an error ：\ninet address is expected rather than \"0.0.0.1/0\"\nlunix doesn\u0027t allow this kind of routes\nI wonder if this is in the scope of the routes_update function in router_info, if not, it will have nothing to do with ECMP","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"a79435488bfabb51b3b436e795d41e7910a70822","unresolved":true,"context_lines":[{"line_number":321,"context_line":""},{"line_number":322,"context_line":"  { \"router\":"},{"line_number":323,"context_line":"    { \"routes\":"},{"line_number":324,"context_line":"      [ { \"destination\": \"192.168.1.6/32\","},{"line_number":325,"context_line":"          \"nexthop\": \"192.168.1.88\" },"},{"line_number":326,"context_line":"        { \"destination\": \"192.168.1.6/32\","},{"line_number":327,"context_line":"          \"nexthop\": \"192.168.1.99\" }"},{"line_number":328,"context_line":"        ..."},{"line_number":329,"context_line":"      ]"},{"line_number":330,"context_line":"    }"}],"source_content_type":"text/x-rst","patch_set":36,"id":"2a57bc7d_e46bb268","line":327,"range":{"start_line":324,"start_character":8,"end_line":327,"end_character":37},"in_reply_to":"b15bfb6f_27abb050","updated":"2020-12-10 11:33:39.000000000","message":"My mistake, the route \"to 1.2.3.4 via 0.0.0.0\" is not allowed by neutron.","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"db6d09425e0cc29df736a7e43f9bb2f27cf232db","unresolved":true,"context_lines":[{"line_number":340,"context_line":"    nexthop via 192.168.1.88 dev qr-9adb238b-c2 weight 1"},{"line_number":341,"context_line":"    nexthop via 192.168.1.99 dev qr-9adb238b-c2 weight 1"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"To make this behavior change discoverable, a shim extension will be added."},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"Implementation"},{"line_number":346,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":36,"id":"87e52547_e3103653","line":343,"updated":"2020-12-17 05:12:24.000000000","message":"Could you add a proposed extension name here?","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"db6d09425e0cc29df736a7e43f9bb2f27cf232db","unresolved":true,"context_lines":[{"line_number":375,"context_line":""},{"line_number":376,"context_line":"User Documentation"},{"line_number":377,"context_line":"------------------"},{"line_number":378,"context_line":"* Needs user documentation"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"Developer Documentation"},{"line_number":381,"context_line":"-----------------------"}],"source_content_type":"text/x-rst","patch_set":36,"id":"445eb94d_bd3f85d3","line":378,"updated":"2020-12-17 05:12:24.000000000","message":"API reference needs to be updated too.","commit_id":"b8358fd12f1b21c6db70085676404cccfa8d7fc4"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"0d4a61fdd97d4f5050da2b318c8c9233953302e1","unresolved":true,"context_lines":[{"line_number":290,"context_line":""},{"line_number":291,"context_line":"* For making the ARP proxy optional, add an config option in L3Agent.ini::"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    [ECMP]"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"    ARP_PROXY\u003dTRUE"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"Data Model Impact"}],"source_content_type":"text/x-rst","patch_set":37,"id":"ababd2d3_1c2b41cc","line":295,"range":{"start_line":293,"start_character":4,"end_line":295,"end_character":18},"updated":"2021-01-26 02:26:39.000000000","message":"I\u0027m fine with adding a new config option, this should be, a self-documenting name:\n\n    [ECMP]\n\n    router_interface_arp_proxy \u003d True","commit_id":"7350c9dcb861fbb96bb1843ac79f909c524c5174"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"86e943d8fb0cb079ca48c66dc2a692b4c5caf233","unresolved":false,"context_lines":[{"line_number":290,"context_line":""},{"line_number":291,"context_line":"* For making the ARP proxy optional, add an config option in L3Agent.ini::"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    [ECMP]"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"    ARP_PROXY\u003dTRUE"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"Data Model Impact"}],"source_content_type":"text/x-rst","patch_set":37,"id":"d60284bb_d68b11fe","line":295,"range":{"start_line":293,"start_character":4,"end_line":295,"end_character":18},"in_reply_to":"ababd2d3_1c2b41cc","updated":"2021-01-27 11:03:29.000000000","message":"OK","commit_id":"7350c9dcb861fbb96bb1843ac79f909c524c5174"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"0d4a61fdd97d4f5050da2b318c8c9233953302e1","unresolved":true,"context_lines":[{"line_number":347,"context_line":"    nexthop via 192.168.1.88 dev qr-9adb238b-c2 weight 1"},{"line_number":348,"context_line":"    nexthop via 192.168.1.99 dev qr-9adb238b-c2 weight 1"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"To make this behavior change discoverable, a shim extension called \u0027ecmp\u0027"},{"line_number":351,"context_line":"will be added."},{"line_number":352,"context_line":"[`p2`_]To make ARP proxy optional, a shim extension called \u0027ecmp_arp\u0027"},{"line_number":353,"context_line":"will be added, it will be removed dynamically when related option in config"}],"source_content_type":"text/x-rst","patch_set":37,"id":"e87de255_07732cb6","line":350,"range":{"start_line":350,"start_character":67,"end_line":350,"end_character":73},"updated":"2021-01-26 02:26:39.000000000","message":"This shoule be called ``ecmp_routes``.","commit_id":"7350c9dcb861fbb96bb1843ac79f909c524c5174"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"86e943d8fb0cb079ca48c66dc2a692b4c5caf233","unresolved":false,"context_lines":[{"line_number":347,"context_line":"    nexthop via 192.168.1.88 dev qr-9adb238b-c2 weight 1"},{"line_number":348,"context_line":"    nexthop via 192.168.1.99 dev qr-9adb238b-c2 weight 1"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"To make this behavior change discoverable, a shim extension called \u0027ecmp\u0027"},{"line_number":351,"context_line":"will be added."},{"line_number":352,"context_line":"[`p2`_]To make ARP proxy optional, a shim extension called \u0027ecmp_arp\u0027"},{"line_number":353,"context_line":"will be added, it will be removed dynamically when related option in config"}],"source_content_type":"text/x-rst","patch_set":37,"id":"4a17c2be_f20ffb4b","line":350,"range":{"start_line":350,"start_character":67,"end_line":350,"end_character":73},"in_reply_to":"e87de255_07732cb6","updated":"2021-01-27 11:03:29.000000000","message":"OK","commit_id":"7350c9dcb861fbb96bb1843ac79f909c524c5174"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"0d4a61fdd97d4f5050da2b318c8c9233953302e1","unresolved":true,"context_lines":[{"line_number":349,"context_line":""},{"line_number":350,"context_line":"To make this behavior change discoverable, a shim extension called \u0027ecmp\u0027"},{"line_number":351,"context_line":"will be added."},{"line_number":352,"context_line":"[`p2`_]To make ARP proxy optional, a shim extension called \u0027ecmp_arp\u0027"},{"line_number":353,"context_line":"will be added, it will be removed dynamically when related option in config"},{"line_number":354,"context_line":"file is `FALSE`."},{"line_number":355,"context_line":""}],"source_content_type":"text/x-rst","patch_set":37,"id":"f763d0ef_edf4d966","line":352,"range":{"start_line":352,"start_character":0,"end_line":352,"end_character":33},"updated":"2021-01-26 02:26:39.000000000","message":"Why a shim API extension will control the agent side ARP proxy?","commit_id":"7350c9dcb861fbb96bb1843ac79f909c524c5174"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"86e943d8fb0cb079ca48c66dc2a692b4c5caf233","unresolved":false,"context_lines":[{"line_number":349,"context_line":""},{"line_number":350,"context_line":"To make this behavior change discoverable, a shim extension called \u0027ecmp\u0027"},{"line_number":351,"context_line":"will be added."},{"line_number":352,"context_line":"[`p2`_]To make ARP proxy optional, a shim extension called \u0027ecmp_arp\u0027"},{"line_number":353,"context_line":"will be added, it will be removed dynamically when related option in config"},{"line_number":354,"context_line":"file is `FALSE`."},{"line_number":355,"context_line":""}],"source_content_type":"text/x-rst","patch_set":37,"id":"fd5cf4ac_4093ed6b","line":352,"range":{"start_line":352,"start_character":0,"end_line":352,"end_character":33},"in_reply_to":"f763d0ef_edf4d966","updated":"2021-01-27 11:03:29.000000000","message":"This API is added so that users can query to know if the backend will open an ARP proxy for ECMP，The option in config file will control the agent side ARP proxy.","commit_id":"7350c9dcb861fbb96bb1843ac79f909c524c5174"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"0d4a61fdd97d4f5050da2b318c8c9233953302e1","unresolved":true,"context_lines":[{"line_number":350,"context_line":"To make this behavior change discoverable, a shim extension called \u0027ecmp\u0027"},{"line_number":351,"context_line":"will be added."},{"line_number":352,"context_line":"[`p2`_]To make ARP proxy optional, a shim extension called \u0027ecmp_arp\u0027"},{"line_number":353,"context_line":"will be added, it will be removed dynamically when related option in config"},{"line_number":354,"context_line":"file is `FALSE`."},{"line_number":355,"context_line":""},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"Implementation"}],"source_content_type":"text/x-rst","patch_set":37,"id":"0b49fc3b_f0896164","line":354,"range":{"start_line":353,"start_character":51,"end_line":354,"end_character":16},"updated":"2021-01-26 02:26:39.000000000","message":"Could you elaborate the config option? Did you mean the option you mentioned in line 295?","commit_id":"7350c9dcb861fbb96bb1843ac79f909c524c5174"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"86e943d8fb0cb079ca48c66dc2a692b4c5caf233","unresolved":false,"context_lines":[{"line_number":350,"context_line":"To make this behavior change discoverable, a shim extension called \u0027ecmp\u0027"},{"line_number":351,"context_line":"will be added."},{"line_number":352,"context_line":"[`p2`_]To make ARP proxy optional, a shim extension called \u0027ecmp_arp\u0027"},{"line_number":353,"context_line":"will be added, it will be removed dynamically when related option in config"},{"line_number":354,"context_line":"file is `FALSE`."},{"line_number":355,"context_line":""},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"Implementation"}],"source_content_type":"text/x-rst","patch_set":37,"id":"b06317e1_f5f6f631","line":354,"range":{"start_line":353,"start_character":51,"end_line":354,"end_character":16},"in_reply_to":"0b49fc3b_f0896164","updated":"2021-01-27 11:03:29.000000000","message":"Yes, I mean the option in line 295","commit_id":"7350c9dcb861fbb96bb1843ac79f909c524c5174"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"0d4a61fdd97d4f5050da2b318c8c9233953302e1","unresolved":true,"context_lines":[{"line_number":387,"context_line":""},{"line_number":388,"context_line":"User Documentation"},{"line_number":389,"context_line":"------------------"},{"line_number":390,"context_line":"* API reference needs to be updated."},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"Developer Documentation"},{"line_number":393,"context_line":"-----------------------"}],"source_content_type":"text/x-rst","patch_set":37,"id":"1935d40d_da72f440","line":390,"range":{"start_line":390,"start_character":0,"end_line":390,"end_character":36},"updated":"2021-01-26 02:26:39.000000000","message":"If I understande correctly, Akihiro Motoki\u0027s comment is told you we should update the API reference as well. So here should be:\nUser Documentation\n------------------\n* User documentation\n* API reference","commit_id":"7350c9dcb861fbb96bb1843ac79f909c524c5174"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"114af70ba3f5e83b1840c2a137db22f29ccceeba","unresolved":true,"context_lines":[{"line_number":28,"context_line":"virtual IP at the same time to serve a set of functions that require high"},{"line_number":29,"context_line":"concurrency support."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":".. _P2:"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"   **Note:** Items marked with [`P2`_] refer to lower priority features"},{"line_number":34,"context_line":"   to be designed / implemented only after initial release."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"[`P2`_] Currently the equal cost route is a simple 5 tuple, that means if"},{"line_number":37,"context_line":"we have one \u003cnexthop\u003e unreachable and remove it from ECMP routes, all"}],"source_content_type":"text/x-rst","patch_set":38,"id":"759f854e_708ce5f4","line":34,"range":{"start_line":31,"start_character":0,"end_line":34,"end_character":59},"updated":"2021-02-12 09:52:01.000000000","message":"nit: Currently we have unnecessary vertical line in the rendered HTML. Consider:\n\n .. _P2:\n \n .. note::\n\n    Items marked with [`P2`_] refer to lower priority features\n    to be designed / implemented only after initial release.","commit_id":"1f9b92a8b3dd438353356c34b76297e815e21899"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"2d34e9acd996490a045685eb230268b1d579855b","unresolved":false,"context_lines":[{"line_number":28,"context_line":"virtual IP at the same time to serve a set of functions that require high"},{"line_number":29,"context_line":"concurrency support."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":".. _P2:"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"   **Note:** Items marked with [`P2`_] refer to lower priority features"},{"line_number":34,"context_line":"   to be designed / implemented only after initial release."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"[`P2`_] Currently the equal cost route is a simple 5 tuple, that means if"},{"line_number":37,"context_line":"we have one \u003cnexthop\u003e unreachable and remove it from ECMP routes, all"}],"source_content_type":"text/x-rst","patch_set":38,"id":"3afaa442_0e468d5b","line":34,"range":{"start_line":31,"start_character":0,"end_line":34,"end_character":59},"in_reply_to":"759f854e_708ce5f4","updated":"2021-02-19 10:06:50.000000000","message":"Done","commit_id":"1f9b92a8b3dd438353356c34b76297e815e21899"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"114af70ba3f5e83b1840c2a137db22f29ccceeba","unresolved":true,"context_lines":[{"line_number":266,"context_line":"[`p2`_]For keeping connection while removing a load balancing node, use"},{"line_number":267,"context_line":"iptables instead of simply a ip route entry."},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"  - Use `HMARK` to mark flows in mangle table, the `fwmark` values"},{"line_number":270,"context_line":"    determined by the source address."},{"line_number":271,"context_line":"  - Distribute flows to different tables by `fwmark` values."},{"line_number":272,"context_line":"  - There is a mapping between the `fwmark` values and the table values"},{"line_number":273,"context_line":"  - For each table, give it a default nexthop ip."},{"line_number":274,"context_line":"  - Modify the mapping between `fwmark` values and table values"},{"line_number":275,"context_line":"    when a `nexthop` is unreachable."},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"[`p2`_]In order to let traffic from the same network to pass through the"},{"line_number":278,"context_line":"router, L3 agent will also let router to use Proxy ARP by setting command::"},{"line_number":279,"context_line":""}],"source_content_type":"text/x-rst","patch_set":38,"id":"3e321705_953d60e1","line":276,"range":{"start_line":269,"start_character":0,"end_line":276,"end_character":0},"updated":"2021-02-12 09:52:01.000000000","message":"Remove the spaces at the beginning of lines. They are unnecessary.","commit_id":"1f9b92a8b3dd438353356c34b76297e815e21899"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"2d34e9acd996490a045685eb230268b1d579855b","unresolved":false,"context_lines":[{"line_number":266,"context_line":"[`p2`_]For keeping connection while removing a load balancing node, use"},{"line_number":267,"context_line":"iptables instead of simply a ip route entry."},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"  - Use `HMARK` to mark flows in mangle table, the `fwmark` values"},{"line_number":270,"context_line":"    determined by the source address."},{"line_number":271,"context_line":"  - Distribute flows to different tables by `fwmark` values."},{"line_number":272,"context_line":"  - There is a mapping between the `fwmark` values and the table values"},{"line_number":273,"context_line":"  - For each table, give it a default nexthop ip."},{"line_number":274,"context_line":"  - Modify the mapping between `fwmark` values and table values"},{"line_number":275,"context_line":"    when a `nexthop` is unreachable."},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"[`p2`_]In order to let traffic from the same network to pass through the"},{"line_number":278,"context_line":"router, L3 agent will also let router to use Proxy ARP by setting command::"},{"line_number":279,"context_line":""}],"source_content_type":"text/x-rst","patch_set":38,"id":"60ecc3e3_4897d763","line":276,"range":{"start_line":269,"start_character":0,"end_line":276,"end_character":0},"in_reply_to":"3e321705_953d60e1","updated":"2021-02-19 10:06:50.000000000","message":"Done","commit_id":"1f9b92a8b3dd438353356c34b76297e815e21899"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"114af70ba3f5e83b1840c2a137db22f29ccceeba","unresolved":true,"context_lines":[{"line_number":279,"context_line":""},{"line_number":280,"context_line":"  sysctl -w net.ipv4.conf.\u003cNIC_1\u003e.proxy_arp_pvlan\u003d1"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"* \u003cNIC_1\u003e is the name of the router internal gateway to which the"},{"line_number":283,"context_line":"  destination subnet is connected. For example, router `R1` is connected"},{"line_number":284,"context_line":"  to a subnet `sub-1` whose cidr is `10.10.10.0/24`, so there will be a"},{"line_number":285,"context_line":"  virtual network interface device `qr-abcdefgh` in the router related"}],"source_content_type":"text/x-rst","patch_set":38,"id":"1e16631c_10feffed","line":282,"range":{"start_line":282,"start_character":25,"end_line":282,"end_character":52},"updated":"2021-02-12 09:52:01.000000000","message":"nit: We call it as \"router interface\" rather than \"router internal gateway\".\nI commented this in a past patch set and you said \"Done\" but it was not fixed yet.","commit_id":"1f9b92a8b3dd438353356c34b76297e815e21899"},{"author":{"_account_id":31814,"name":"XiaoYu Zhu","email":"z503755743@gmail.com","username":"z503755743"},"change_message_id":"2d34e9acd996490a045685eb230268b1d579855b","unresolved":true,"context_lines":[{"line_number":279,"context_line":""},{"line_number":280,"context_line":"  sysctl -w net.ipv4.conf.\u003cNIC_1\u003e.proxy_arp_pvlan\u003d1"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"* \u003cNIC_1\u003e is the name of the router internal gateway to which the"},{"line_number":283,"context_line":"  destination subnet is connected. For example, router `R1` is connected"},{"line_number":284,"context_line":"  to a subnet `sub-1` whose cidr is `10.10.10.0/24`, so there will be a"},{"line_number":285,"context_line":"  virtual network interface device `qr-abcdefgh` in the router related"}],"source_content_type":"text/x-rst","patch_set":38,"id":"d1649831_50b3ed3f","line":282,"range":{"start_line":282,"start_character":25,"end_line":282,"end_character":52},"in_reply_to":"1e16631c_10feffed","updated":"2021-02-19 10:06:50.000000000","message":"Sorry，my fault.\nDone.","commit_id":"1f9b92a8b3dd438353356c34b76297e815e21899"}]}
