<!-- 
RSS generated by JIRA (8.20.10#820010-sha1:ace47f9899e9ee25d7157d59aa17ab06aee30d3d) at Wed Feb 07 20:20:31 UTC 2024

It is possible to restrict the fields that are returned in this document by specifying the 'field' parameter in your request.
For example, to request only the issue key and summary append 'field=key&field=summary' to the URL of your request.
-->
<rss version="0.92" >
<channel>
    <title>OpenDaylight JIRA</title>
    <link>https://jira.opendaylight.org</link>
    <description>This file is an XML representation of an issue</description>
    <language>en-us</language>    <build-info>
        <version>8.20.10</version>
        <build-number>820010</build-number>
        <build-date>22-06-2022</build-date>
    </build-info>


<item>
            <title>[NETVIRT-30] Datapath_id potentially changes as ports are added to bridge</title>
                <link>https://jira.opendaylight.org/browse/NETVIRT-30</link>
                <project id="10144" key="NETVIRT">netvirt</project>
                    <description>&lt;p&gt;OVS sets the datapath_id using the following algorithm:&lt;/p&gt;

&lt;p&gt;if other_config:datapath_id is specified&lt;br/&gt;
    use that&lt;br/&gt;
otherwise if other_config:hwaddr specified&lt;br/&gt;
    use that&lt;br/&gt;
otherwise if this bridge has ports&lt;br/&gt;
    use the lowest mac address of the ports on this bridge&lt;br/&gt;
otherwise&lt;br/&gt;
    use a randomly generated mac&lt;/p&gt;

&lt;p&gt;this algorithm is re-run every time you add or remove a port from the bridge. So, if a port is added with a lower mac, the dpid will change mid-flight. As you can imagine this should really screw up the state, especially WRT operational vs. configuration. During tests it was observed that when this occurs flows are not properly installed in OVS.&lt;/p&gt;</description>
                <environment>&lt;p&gt;Operating System: All&lt;br/&gt;
Platform: All&lt;/p&gt;</environment>
        <key id="19951">NETVIRT-30</key>
            <summary>Datapath_id potentially changes as ports are added to bridge</summary>
                <type id="10104" iconUrl="https://jira.opendaylight.org/secure/viewavatar?size=xsmall&amp;avatarId=10303&amp;avatarType=issuetype">Bug</type>
                                                <status id="5" iconUrl="https://jira.opendaylight.org/images/icons/statuses/resolved.png" description="A resolution has been taken, and it is awaiting verification by reporter. From here issues are either reopened, or are closed.">Resolved</status>
                    <statusCategory id="3" key="done" colorName="green"/>
                                    <resolution id="10000">Done</resolution>
                                        <assignee username="jhershbe">Josh Hershberg</assignee>
                                    <reporter username="jhershbe">Josh Hershberg</reporter>
                        <labels>
                    </labels>
                <created>Wed, 15 Jun 2016 17:59:12 +0000</created>
                <updated>Tue, 29 May 2018 14:58:55 +0000</updated>
                            <resolved>Tue, 26 Jul 2016 18:57:57 +0000</resolved>
                                    <version>Beryllium</version>
                                                        <due></due>
                            <votes>0</votes>
                                    <watches>2</watches>
                                                                                                                <comments>
                            <comment id="36190" author="jhershbe" created="Wed, 15 Jun 2016 18:01:38 +0000"  >&lt;p&gt;Text of email thread on this subject:&lt;/p&gt;

&lt;p&gt;On Wed, Jun 15, 2016 at 10:00 AM, Josh Hershberg &amp;lt;jhershbe@redhat.com&amp;gt; wrote:&lt;/p&gt;

&lt;p&gt;    inline...&lt;/p&gt;

&lt;p&gt;    On Wed, Jun 15, 2016 at 3:42 PM, Sam Hague &amp;lt;shague@redhat.com&amp;gt; wrote:&lt;/p&gt;



&lt;p&gt;        On Wed, Jun 15, 2016 at 9:27 AM, Josh Hershberg &amp;lt;jhershbe@redhat.com&amp;gt; wrote:&lt;/p&gt;

&lt;p&gt;            I&#8203; hadn&apos;t noticed that there&apos;s a a way to directly set the datapath_id so in my tests I had been setting by setting the hwaddr of br-int. I guess it is more straightforward to set it directly.&lt;/p&gt;

&lt;p&gt;        The only sticky way to keep dpid is to use the other-config. Isn&apos;t that what you are doing? Or are you setting the hwaddr on the ip link for br-int?&lt;/p&gt;

&lt;p&gt;    &#8203;I was setting the hwaddr in other_config together with creating the bridge and the dpid is based on that. There is also the option of setting the datapath_id directly. I&apos;ll do that one in the fix I&apos;ll push.&lt;/p&gt;

&lt;p&gt;yeah, I found conflicting methods - use hwadrr or datapath-id. I use hwaddr and I think that is what is used in the code and in the ovs-vsctl man page it says that only hwaddr is kept on db resets.&lt;/p&gt;


&lt;p&gt;            So, here&apos;s the summary with a few questions peppered in there:&lt;/p&gt;

&lt;p&gt;            1) By default, we set the dpid together with creating br-int in a single transaction.&lt;br/&gt;
            2) That is override-able via some configuration option. Can you please provide a little more info about where this option should go? I assume in a config file or something?&lt;/p&gt;

&lt;p&gt;        Yeah, add it with our other config options. Oded is adding a value for the dhcp enable in the new netvirt. We already have some in the netvirtproviders-config of the old netvirt. It is dead simple to add the config. Just add a leaf to the yang and call the new generated method to get the value and store it in the class. it will need to be migrated to blueprint, but since adding this code is easy I don&apos;t think it matters.&lt;/p&gt;


&lt;p&gt;    &#8203;&lt;br/&gt;
    OK. Will ask Oded. If using old netvirt, which I guess you are, then yeah, just copy what you see for the table-offset. That is what Oded used for his example.&lt;br/&gt;
    &#8203;&lt;/p&gt;




&lt;p&gt;            Also, I assume this is serious enough that it should have a bug opened and its own commit.&lt;/p&gt;

&lt;p&gt;        Yeah, that is good so we can track it and look it up.&lt;/p&gt;


&lt;p&gt;            Thanks for all the time, man.&lt;/p&gt;

&lt;p&gt;        No, thank you for getting this. No idea how this never pops up. I guess as libvirt/neutron is adding vifs to the bridge it is getting lucky that it is a higher value.&lt;br/&gt;
        Actually, what is the metric for lower port - is it looking at the mac or is it looking at how the port is numbered in the stack - like is the port numbered in the order it is created?&lt;/p&gt;


&lt;p&gt;    &#8203;It&apos;s a memcmp of the bytes of the MAC address.&#8203;&lt;/p&gt;



&lt;p&gt;            &#8203;&lt;/p&gt;

&lt;p&gt;            On Wed, Jun 15, 2016 at 3:02 PM, Sam Hague &amp;lt;shague@redhat.com&amp;gt; wrote:&lt;/p&gt;



&lt;p&gt;                On Wed, Jun 15, 2016 at 8:03 AM, Josh Hershberg &amp;lt;jhershbe@redhat.com&amp;gt; wrote:&lt;/p&gt;

&lt;p&gt;                    Why does it need to be unique across all nodes?&lt;/p&gt;

&lt;p&gt;                    Here&apos;s what ovs itself does when it doesn&apos;t have any config or ports:&lt;br/&gt;
                    3182     /* Derive the default Ethernet address from the bridge&apos;s UUID.  This should&lt;br/&gt;
                    3183      * be unique and it will be stable between ovs-vswitchd runs.  */&lt;br/&gt;
                    3184     memcpy(&amp;amp;br-&amp;gt;default_ea, &amp;amp;br_cfg-&amp;gt;header_.uuid, ETH_ADDR_LEN);&lt;br/&gt;
                    3185     eth_addr_mark_random(&amp;amp;br-&amp;gt;default_ea);&lt;br/&gt;
                    This function ^^^ just marks the two low bits of the first byte to 0 (multicast and private) so functionally it&apos;s just a 46 bit random value. They use their UUID because it stays constant between restarts which is not something I&apos;m sure we care about especially since up until now the dpid and mac will change from the uuid derivative to the value of the lowest port mac, which is certainly not so unique. From all this it sounds to me like if we just generate our own random mac it should work.&lt;/p&gt;

&lt;p&gt;                agreed, so we rely on the typical mac uniqueness in this case and get the value for free. The problem is if the deployment or installer wants to set the br-int itself - I wasn&apos;t sure if we should override the value. Guess we could make it configurable. By default, ODL sets the value, otherwise keep what is given.&lt;/p&gt;

&lt;p&gt;                I did find this from a an older nec pugin where they were setting the dpid via the mac: &lt;a href=&quot;https://github.com/mlowery/bug1280915/blob/master/lib/neutron_plugins/nec&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;https://github.com/mlowery/bug1280915/blob/master/lib/neutron_plugins/nec&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;                    Also, it would seem to me that if we wait for the update when the dpid comes in we could theoretically have a race condition where if someone added a port before we wrote the hwaddr stuff could break, no?&lt;/p&gt;

&lt;p&gt;                Yeah, that was the one main concern. I think the window is small. And you still ahve the issue if someone created br-int already. But I think we have the same issue even if ODL sets the dpid since the add-br with other-config is a two step process isn&apos;t it? Normally you do the add-br br-int &amp;#8211; set Bridge br-int other-config xxxx via ovs-vsctl which might bunch it, but I am not sure if our southbound works the same way. Guess it is an easy test to verify.&lt;/p&gt;



&lt;p&gt;                    On Wed, Jun 15, 2016 at 1:47 PM, Sam Hague &amp;lt;shague@redhat.com&amp;gt; wrote:&lt;/p&gt;

&lt;p&gt;                        Just avoiding having to come up with a numbering scheme that would be unique across all nodes.&lt;br/&gt;
                        On Jun 15, 2016 7:45 AM, &quot;Josh Hershberg&quot; &amp;lt;jhershbe@redhat.com&amp;gt; wrote:&lt;/p&gt;

&lt;p&gt;                            How is that better than just setting it manually when we create the bridge?&lt;/p&gt;

&lt;p&gt;                            On Wed, Jun 15, 2016 at 1:44 PM, Sam Hague &amp;lt;shague@redhat.com&amp;gt; wrote:&lt;/p&gt;

&lt;p&gt;                                What if right after we see the bridge connect we set the datapath id to the value seen?&lt;br/&gt;
                                On Jun 15, 2016 7:08 AM, &quot;Josh Hershberg&quot; &amp;lt;jhershbe@redhat.com&amp;gt; wrote:&lt;/p&gt;

&lt;p&gt;                                    First created it with &quot;ip link&quot;, then set the mac, then SouthboundUtils.addTerminationPoint&lt;/p&gt;

&lt;p&gt;                                    On Wed, Jun 15, 2016 at 1:05 PM, Sam Hague &amp;lt;shague@redhat.com&amp;gt; wrote:&lt;/p&gt;

&lt;p&gt;                                        Josh,&lt;/p&gt;

&lt;p&gt;                                        How did you add the new port with decreased Mac?&lt;/p&gt;

&lt;p&gt;                                        Thanks,  Sam&lt;br/&gt;
                                        On Jun 15, 2016 3:46 AM, &quot;Josh Hershberg&quot; &amp;lt;jhershbe@redhat.com&amp;gt; wrote:&lt;/p&gt;

&lt;p&gt;                                            Adding Anil...&lt;/p&gt;

&lt;p&gt;                                            Anil, the background here is that in the process of developing the IT infra stuff I noticed that OVS sets the datapath_id using the following algorithm:&lt;br/&gt;
                                            if other_config:hwaddr specified&lt;br/&gt;
                                                use that&lt;br/&gt;
                                            otherwise if this bridge has ports&lt;br/&gt;
                                                use the lowest mac address of the ports on this bridge&lt;br/&gt;
                                            otherwise&lt;br/&gt;
                                                use a randomly generated mac&lt;/p&gt;

&lt;p&gt;                                            What&apos;s more, this algorithm is re-run every time you add or remove a port from the bridge. So, if a port is added with a lower mac, the dpid will change mid-flight. As you can imagine this should really screw up the state, especially WRT operational vs. configuration. Sam and I were discussing this yesterday and I had said I would validate that my understanding of this problem is correct. That&apos;s what the email below is. &lt;/p&gt;


&lt;p&gt;                                            On Wed, Jun 15, 2016 at 9:40 AM, Josh Hershberg &amp;lt;jhershbe@redhat.com&amp;gt; wrote:&lt;/p&gt;

&lt;p&gt;                                                So...I modified my IT test code so that it would add ports with MACs that sequentially &lt;em&gt;decrease&lt;/em&gt; and the dpid changes multiple times. Here&apos;s some log lines. I generate &lt;span class=&quot;error&quot;&gt;&amp;#91;1&amp;#93;&lt;/span&gt; them in between each addition of a port:&lt;br/&gt;
                                                JOSH - REFRESH old 244431472159045, new 268280838160388&lt;br/&gt;
                                                JOSH - REFRESH old 268280838160388, new 268280838160387&lt;br/&gt;
                                                JOSH - REFRESH old 268280838160387, new 268280838160386&lt;/p&gt;

&lt;p&gt;                                                And...the flows are screwed up &lt;span class=&quot;error&quot;&gt;&amp;#91;2&amp;#93;&lt;/span&gt;. I print them from inside the test after waiting three seconds after adding the three ports.&lt;/p&gt;

&lt;p&gt;                                                This is the behavior I expected based on my understanding of the OVS sources so i am not pretty convinced. I really don&apos;t know how to explain how this has never surfaced before. As I mentioned last night I suspect that generally MACs are probably generated in ascending order which would probably mask this to some extent. Anyway, I think the easiest way around this is to always set br-int&apos;s mac using other_config:hwaddr. Is that safe? Could it break stuff?&lt;/p&gt;

&lt;p&gt;                                                I had an idea to use the connection info to generate a MAC. The IP is four bytes and the port is two for a total of 6 == the length of a mac address. However, this is not perfect since in reality a MAC address is 6 bytes minus the multicast bit which must be zero, so in theory you could get a collision there but thought I would share the idea in the spirit of brainstorming. Another option, obviously is that we can just start assign it based on an internal counter of some sort. &lt;/p&gt;



&lt;p&gt;                                                &lt;span class=&quot;error&quot;&gt;&amp;#91;1&amp;#93;&lt;/span&gt; Here&apos;s the code that prints it:&lt;/p&gt;

&lt;p&gt;                                                public void refresh() throws InterruptedException {&lt;br/&gt;
                                                    long oldDpid = datapathId;&lt;br/&gt;
                                                    Thread.sleep(3000);&lt;/p&gt;

&lt;p&gt;                                                    ovsdbNode = itUtils.southboundUtils.getOvsdbNode(connectionInfo);&lt;br/&gt;
                                                    bridgeNode = itUtils.southboundUtils.getBridgeNode(ovsdbNode, INTEGRATION_BRIDGE_NAME);&lt;br/&gt;
                                                    datapathId = itUtils.southboundUtils.getDataPathId(bridgeNode);&lt;/p&gt;

&lt;p&gt;                                                    LOG.warn(&quot;JOSH - REFRESH old {}, new {}&quot;, oldDpid, datapathId);&lt;br/&gt;
                                                }&lt;/p&gt;


&lt;p&gt;                                                &lt;span class=&quot;error&quot;&gt;&amp;#91;2&amp;#93;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;                                                2016-06-15 08:36:53,818 | INFO  | ion(3)-10.0.0.17 | ProcUtils                        | 303 - org.opendaylight.ovsdb.utils.ovsdb-it-utils - 1.3.0.SNAPSHOT | ProcUtils.runProcess running &quot;&lt;span class=&quot;error&quot;&gt;&amp;#91;sudo, docker-compose, -f, /tmp/ovsdb-it-tmp-1430782894565815502.tmp, exec, ovs, ovs-ofctl, -OOpenFlow13, dump-flows, br-int&amp;#93;&lt;/span&gt;&quot;, waitFor 5000&lt;br/&gt;
                                                 OFPST_FLOW reply (OF1.3) (xid=0x2):&lt;br/&gt;
                                                  cookie=0x0, duration=19.181s, table=0, n_packets=0, n_bytes=0, dl_type=0x88cc actions=CONTROLLER:65535&lt;br/&gt;
                                                  cookie=0x0, duration=19.181s, table=0, n_packets=0, n_bytes=0, priority=0 actions=goto_table:20&lt;br/&gt;
                                                  cookie=0x0, duration=8.685s, table=20, n_packets=0, n_bytes=0, priority=1024,arp,tun_id=0x65,arp_tpa=10.0.0.3,arp_op=1 actions=move:NXM_OF_ETH_SRC[]&lt;del&gt;&amp;gt;NXM_OF_ETH_DST[],set_field:f4:00:00:0f:00:02&lt;/del&gt;&amp;gt;eth_src,load:0x2-&amp;gt;NXM_OF_ARP_OP[],move:NXM_NX_ARP_SHA[]&lt;del&gt;&amp;gt;NXM_NX_ARP_THA[],move:NXM_OF_ARP_SPA[]&lt;/del&gt;&amp;gt;NXM_OF_ARP_TPA[],load:0xf400000f0002-&amp;gt;NXM_NX_ARP_SHA[],load:0xa000003-&amp;gt;NXM_OF_ARP_SPA[],IN_PORT&lt;br/&gt;
                                                  cookie=0x0, duration=8.668s, table=20, n_packets=0, n_bytes=0, priority=1024,arp,tun_id=0x65,arp_tpa=10.0.0.1,arp_op=1 actions=move:NXM_OF_ETH_SRC[]&lt;del&gt;&amp;gt;NXM_OF_ETH_DST[],set_field:f4:00:00:0f:00:04&lt;/del&gt;&amp;gt;eth_src,load:0x2-&amp;gt;NXM_OF_ARP_OP[],move:NXM_NX_ARP_SHA[]&lt;del&gt;&amp;gt;NXM_NX_ARP_THA[],move:NXM_OF_ARP_SPA[]&lt;/del&gt;&amp;gt;NXM_OF_ARP_TPA[],load:0xf400000f0004-&amp;gt;NXM_NX_ARP_SHA[],load:0xa000001-&amp;gt;NXM_OF_ARP_SPA[],IN_PORT&lt;br/&gt;
                                                  cookie=0x0, duration=8.651s, table=20, n_packets=0, n_bytes=0, priority=1024,arp,tun_id=0x65,arp_tpa=10.0.0.2,arp_op=1 actions=move:NXM_OF_ETH_SRC[]&lt;del&gt;&amp;gt;NXM_OF_ETH_DST[],set_field:f4:00:00:0f:00:03&lt;/del&gt;&amp;gt;eth_src,load:0x2-&amp;gt;NXM_OF_ARP_OP[],move:NXM_NX_ARP_SHA[]&lt;del&gt;&amp;gt;NXM_NX_ARP_THA[],move:NXM_OF_ARP_SPA[]&lt;/del&gt;&amp;gt;NXM_OF_ARP_TPA[],load:0xf400000f0003-&amp;gt;NXM_NX_ARP_SHA[],load:0xa000002-&amp;gt;NXM_OF_ARP_SPA[],IN_PORT&lt;br/&gt;
                                                  cookie=0x0, duration=19.203s, table=20, n_packets=0, n_bytes=0, priority=0 actions=goto_table:30&lt;br/&gt;
                                                  cookie=0x0, duration=19.199s, table=30, n_packets=0, n_bytes=0, priority=0 actions=goto_table:40&lt;br/&gt;
                                                  cookie=0x0, duration=19.199s, table=40, n_packets=0, n_bytes=0, priority=0 actions=goto_table:50&lt;br/&gt;
                                                  cookie=0x0, duration=19.181s, table=50, n_packets=0, n_bytes=0, priority=0 actions=goto_table:60&lt;br/&gt;
                                                  cookie=0x0, duration=19.181s, table=60, n_packets=0, n_bytes=0, priority=0 actions=goto_table:70&lt;br/&gt;
                                                  cookie=0x0, duration=19.203s, table=70, n_packets=0, n_bytes=0, priority=0 actions=goto_table:80&lt;br/&gt;
                                                  cookie=0x0, duration=19.181s, table=80, n_packets=0, n_bytes=0, priority=0 actions=goto_table:90&lt;br/&gt;
                                                  cookie=0x0, duration=19.203s, table=90, n_packets=0, n_bytes=0, priority=0 actions=goto_table:100&lt;br/&gt;
                                                  cookie=0x0, duration=19.203s, table=100, n_packets=0, n_bytes=0, priority=0 actions=goto_table:110&lt;br/&gt;
                                                  cookie=0x0, duration=19.199s, table=110, n_packets=0, n_bytes=0, priority=0 actions=drop&lt;/p&gt;</comment>
                            <comment id="36191" author="vishnoianil@gmail.com" created="Wed, 15 Jun 2016 19:22:03 +0000"  >&lt;p&gt;Josh,&lt;/p&gt;

&lt;p&gt;Do you see connection to controller gets disconnected when the datapath_id changes? If not, i believe this is a bug with OVS code that should be fixed. Because openflow protocol, discover datapath id when switch connects to the controller, and if switch changes it datapath id without notifying the controller or disconnecting/re-connection, there is no way for controller to know the new datapath-id. And if switch keep changing the datapath-id that will create lot of issues. I don&apos;t really see any good technical reason why OVS will do that.&lt;/p&gt;</comment>
                            <comment id="36192" author="jhershbe" created="Thu, 16 Jun 2016 06:39:31 +0000"  >&lt;p&gt;(In reply to Anil Vishnoi from comment #2)&lt;br/&gt;
&amp;gt; Josh,&lt;br/&gt;
&amp;gt; &lt;br/&gt;
&amp;gt; Do you see connection to controller gets disconnected when the datapath_id&lt;br/&gt;
&amp;gt; changes? If not, i believe this is a bug with OVS code that should be fixed.&lt;br/&gt;
&amp;gt; Because openflow protocol, discover datapath id when switch connects to the&lt;br/&gt;
&amp;gt; controller, and if switch changes it datapath id without notifying the&lt;br/&gt;
&amp;gt; controller or disconnecting/re-connection, there is no way for controller to&lt;br/&gt;
&amp;gt; know the new datapath-id. And if switch keep changing the datapath-id that&lt;br/&gt;
&amp;gt; will create lot of issues. I don&apos;t really see any good technical reason why&lt;br/&gt;
&amp;gt; OVS will do that.&lt;/p&gt;

&lt;p&gt;There&apos;s a notification of the change just like the initial notification where you get the dpid the first time but I did not see that the connection flopped. I agree that this is a strange behavior though it seems to be pretty deliberate in the source code. I asked Flavio Leitner about it and he said he thought it had something to do with STP though I can&apos;t imagine why or how. Anyway, agree that we should clarify this with them.&lt;/p&gt;</comment>
                    </comments>
                    <attachments>
                    </attachments>
                <subtasks>
                    </subtasks>
                <customfields>
                                                                            <customfield id="customfield_11400" key="com.atlassian.jira.plugins.jira-development-integration-plugin:devsummary">
                        <customfieldname>Development</customfieldname>
                        <customfieldvalues>
                            
                        </customfieldvalues>
                    </customfield>
                                                                                                                        <customfield id="customfield_10208" key="com.atlassian.jira.plugin.system.customfieldtypes:textfield">
                        <customfieldname>External issue ID</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>6070</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10201" key="com.atlassian.jira.plugin.system.customfieldtypes:url">
                        <customfieldname>External issue URL</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue><![CDATA[https://bugs.opendaylight.org/show_bug.cgi?id=6070]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                            <customfield id="customfield_10206" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                        <customfieldname>Issue Type</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue key="10300"><![CDATA[Bug]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                        <customfield id="customfield_10000" key="com.pyxis.greenhopper.jira:gh-lexo-rank">
                        <customfieldname>Rank</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>0|i01pa7:</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                </customfields>
    </item>
</channel>
</rss>