2574 Commits

Author SHA1 Message Date
Minoru TAKAHASHI
4feded18f3 ofctl_v1/2/3: Some improvements
* modify from "flow" to "meter" the argument of meter_mod
* modify the default argument from {} to None of the following methods
  because default value []/{} as argument is dangerous.
  - get_flow_stats
  - get_aggregate_flow_stats
  - mod_meter_entry
* fix some log messages for better readability

Signed-off-by: Minoru TAKAHASHI <takahashi.minoru7@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-12-25 10:03:53 +09:00
Minoru TAKAHASHI
3e86414b02 of14: Add action experimenter to flow stats reply unit test
Signed-off-by: Minoru TAKAHASHI <takahashi.minoru7@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-12-25 10:03:53 +09:00
IWASE Yusuke
541dc65026 test_tcp: Update test cases for tcp option
Signed-off-by: Minoru TAKAHASHI <takahashi.minoru7@gmail.com>
Signed-off-by: IWASE Yusuke <iwase.yusuke0@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-12-25 10:03:53 +09:00
IWASE Yusuke
9521e46181 lib/packet/tcp: Parse TCP Option field
Suggested-by: Ramana Reddy <gtvrreddy@gmail.com>
Signed-off-by: Minoru TAKAHASHI <takahashi.minoru7@gmail.com>
Signed-off-by: IWASE Yusuke <iwase.yusuke0@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-12-25 10:03:52 +09:00
ISHIDA Wataru
d9ecfccdc8 bgp: fix handling unknown and unsupported transitive path
attributes

we must forward optional transitive path attributes.

Signed-off-by: ISHIDA Wataru <ishida.wataru@lab.ntt.co.jp>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-12-25 10:03:52 +09:00
IWASE Yusuke
fede089e93 ofp_handler: Remove sending SET_CONFIG message
Because Ryu always sends SET_CONFIG message when a datapath connecting,
the switch configurations of user applications will be overwritten by
the default values of Ryu when the datapath re-connecting.

This patch removes sending SET_CONFIG message from ofp_handler and
avoids this problem.

Signed-off-by: IWASE Yusuke <iwase.yusuke0@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-12-22 14:13:16 +09:00
IWASE Yusuke
d736b830b9 lib/ofctl: Add test cases for ofctl_v1_0
TODO: Add test cases for the other messages after adding test cases
for ofproto/test_parser.

Signed-off-by: IWASE Yusuke <iwase.yusuke0@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-12-22 13:50:27 +09:00
IWASE Yusuke
83d529a979 lib/ofctl: Add test cases for ofctl_v1_2
Signed-off-by: IWASE Yusuke <iwase.yusuke0@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-12-22 13:50:27 +09:00
IWASE Yusuke
77f8628574 lib/ofctl: Add test cases for ofctl_v1_3
Signed-off-by: IWASE Yusuke <iwase.yusuke0@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-12-22 13:50:27 +09:00
IWASE Yusuke
1025d18297 lib/ofctl: Implement unit test for sending messages
Signed-off-by: IWASE Yusuke <iwase.yusuke0@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-12-22 13:50:27 +09:00
IWASE Yusuke
41e81c500a lib/ofctl: Rename unit test for action/match
Signed-off-by: IWASE Yusuke <iwase.yusuke0@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-12-22 13:50:27 +09:00
IWASE Yusuke
ed6adb6d83 lib/ofctl: Confirm UTF-8 in binary fields
Signed-off-by: IWASE Yusuke <iwase.yusuke0@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-12-22 13:50:27 +09:00
IWASE Yusuke
366044d724 ofproto_v1_[23]_parser: Add default arguments in OFPQueueProp
When loading OFPQueueGetConfigReply message from json dict,
ofproto_parser can not set the property field in OFPQueueProp,
because __init__() of OFPQueueProp sub-classes do not pass any
argument to its own super-class.
This patch fixes this problem.

Signed-off-by: IWASE Yusuke <iwase.yusuke0@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-12-22 13:50:27 +09:00
IWASE Yusuke
d58d93f2db test_parser: Add some expected json representations
This patch adds expected json representations for:
 - ofp_group_stats_request
 - fp_group_stats_reply

Signed-off-by: IWASE Yusuke <iwase.yusuke0@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-12-22 13:50:27 +09:00
IWASE Yusuke
9418dc530d packet_data: Regen
Signed-off-by: IWASE Yusuke <iwase.yusuke0@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-12-22 13:50:27 +09:00
IWASE Yusuke
d0c9ddd659 packet_data_generator: Add ofp_group_stats messages for OF1.2
Signed-off-by: IWASE Yusuke <iwase.yusuke0@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-12-22 13:50:27 +09:00
IWASE Yusuke
6e4b2b67a3 ofproto_v1_[2345]_parser: Set default length field
Signed-off-by: IWASE Yusuke <iwase.yusuke0@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-12-22 13:50:27 +09:00
FUJITA Tomonori
1ed92b25b5 avoid oslo.config 3.1.0 and later for python2.6 support
oslo.config v3.1.0 dropped python2.6 support:

9470f19eac

Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-12-08 21:48:38 +09:00
IWASE Yusuke
106e88f77a test_controller: Add unit test for _recv_loop()
Signed-off-by: IWASE Yusuke <iwase.yusuke0@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-12-08 21:24:50 +09:00
IWASE Yusuke
0a223481dd controller: Split received message buffer
When Ryu getting multiple OpenFlow messages in a single packet,
_recv_loop() can pass the messages data including the subsequent
OpenFlow message binary data to ofproto_parser.msg().
If the received OpenFlow message containing a binary data field
(e.g. Echo-Reply, Packet-In), the parser may compose messages
class with the subsequent messages data into the data field.

This patch splits the received message buffer by the recieved
OpenFlow message lenght and passes it to the parser.

Signed-off-by: IWASE Yusuke <iwase.yusuke0@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-12-08 21:24:49 +09:00
Victor J. Orlikowski
6ca70939a4 Fix a stability issue relating to switch disconnection/re-connection events.
If a switch gets disconnected via a network interruption on the control plane (or a similar event),
the datapath associated with that switch might not be properly cleaned up.

At the same time, the socket associated with that datapath can get leaked.
This ultimately results in file descriptor resource exhaustion for Ryu,
as a socket had the potential to be leaked on each reconnect.

Also, a small typo was corrected in a method name in DPSet.
2015-12-02 10:27:07 -05:00
FUJITA Tomonori
f449488e6a Ryu 3.28
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
v3.28
2015-12-02 09:04:18 +09:00
IWAMOTO Toshihiro
7a9b1be5d6 test_parser: add conntrack tests
Signed-off-by: IWAMOTO Toshihiro <iwamoto@valinux.co.jp>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-11-13 16:14:00 +09:00
IWAMOTO Toshihiro
877ed2804a packet_data_generator3: add a couple of conntrack packets
Signed-off-by: IWAMOTO Toshihiro <iwamoto@valinux.co.jp>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-11-13 16:13:59 +09:00
IWAMOTO Toshihiro
0599edf753 Implement NXActionCT and related ct_* matches
These are a Nicira extension for conntrack.

Signed-off-by: IWAMOTO Toshihiro <iwamoto@valinux.co.jp>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-11-13 16:13:58 +09:00
Satoshi KOBAYASHI
89e1bcd577 tox: disable wheel cache
Recently, installed packages are cached by Wheel. It is serious when the package is using 2to3 with setuptools (use_2to3) for adapting python3. Because Wheel is caching the contents of translated. If the contents of translated are cached, it can't work properly in python2

Signed-off-by: Satoshi KOBAYASHI <satoshi-k@iij.ad.jp>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-11-13 15:37:14 +09:00
Satoshi KOBAYASHI
7615458870 python3: implicit relative import was deprecated
Signed-off-by: Satoshi KOBAYASHI <satoshi-k@iij.ad.jp>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-11-13 15:36:51 +09:00
Satoshi KOBAYASHI
d6a16862ac python3: itertools.ifilter() doesn't exist
Signed-off-by: Satoshi KOBAYASHI <satoshi-k@iij.ad.jp>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-11-13 15:36:51 +09:00
Satoshi KOBAYASHI
718e934184 python3: iter#next() doesn't exist
Signed-off-by: Satoshi KOBAYASHI <satoshi-k@iij.ad.jp>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-11-13 15:36:51 +09:00
Satoshi KOBAYASHI
6c85fc9c70 python3: <function>#func_name is renamed to __name__
Signed-off-by: Satoshi KOBAYASHI <satoshi-k@iij.ad.jp>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-11-13 15:36:51 +09:00
Satoshi KOBAYASHI
3a0ea9e2bb python3: import __future__ for just in case
Signed-off-by: Satoshi KOBAYASHI <satoshi-k@iij.ad.jp>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-11-13 15:36:51 +09:00
Satoshi KOBAYASHI
466cf26d92 python3: StandardError doesn't exist
Signed-off-by: Satoshi KOBAYASHI <satoshi-k@iij.ad.jp>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-11-13 15:36:50 +09:00
Minoru TAKAHASHI
6133901bb5 ofctl_v1_3: Fix unsuitable error log in mod_meter_entry()
When omit the parameter of "flags" in mod_meter_entry(), following error log will be shown.

  example)

    1.use mod_meter_entry() with omitting the parameter of "flags".

   curl -X POST -d '{
   "dpid": 1,
   "meter_id": 1
   }' http://localhost:8080/stats/meterentry/delete

    2.following error log will be shown.

    Unknown flags: 0

This patch fixes the problem.

Signed-off-by: Minoru TAKAHASHI <takahashi.minoru7@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-11-13 15:35:34 +09:00
FUJITA Tomonori
0aefad7048 Ryu 3.27
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
v3.27
2015-11-03 12:53:30 +09:00
Toshiki Tsuboi
5b81c634be bgp: fix of sending "Start-of-RIB" and "End-of-RIB" in Enhanced Route-Refresh
According to RFC 7313 [Enhanced Route Refresh Capability for BGP-4], Ryu bgps needs to send "Start-of-RIB" before it advertises the Adj-RIB-Out. And then, Ryu bgps needs to send "End-of-RIB" after it advertises the Adj-RIB-Out.

Signed-off-by: Toshiki Tsuboi <t.tsubo2000@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-10-28 17:43:58 +09:00
Minoru TAKAHASHI
30e2eb67c4 doc/app/ofctl_rest: Add description for OFPTableStats message
Signed-off-by: Minoru TAKAHASHI <takahashi.minoru7@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-10-28 14:44:41 +09:00
Minoru TAKAHASHI
58cb365755 doc/app/ofctl_rest: Add description for OFPQueueGetConfig message
Signed-off-by: Minoru TAKAHASHI <takahashi.minoru7@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-10-28 14:44:41 +09:00
Minoru TAKAHASHI
ec55ca5756 doc/app/ofctl_rest: Add description for OFPTableFeaturesStats message
Signed-off-by: Minoru TAKAHASHI <takahashi.minoru7@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-10-28 14:44:41 +09:00
Minoru TAKAHASHI
6518654a1b ofctl_rest: support OFPQueueGetConfig Message
this patch makes ofctl_rest enable use of OFPQueueGetConfig message.

Get queues config:

  usage)

    URI:    /stats/queueconfig/<dpid>/<port>
    method: GET

  e.g.)

    $ curl -X GET http://localhost:8080/stats/queueconfig/1/1
    {
      "1": [
        {
          "port": 1,
          "queues": [
            {
              "properties": [
                {
                  "property": "MIN_RATE",
                  "rate": 80
                }
              ],
              "port": 0,
              "queue_id": 1
            },
            {
              "properties": [
                {
                  "property": "MAX_RATE",
                  "rate": 120
                }
              ],
              "port": 2,
              "queue_id": 2
            },
            {
              "properties": [
                {
                  "property": "EXPERIMENTER",
                  "data": [],
                  "experimenter": 999
                }
              ],
              "port": 3,
              "queue_id": 3
            }
          ]
        }
      ]
    }

Signed-off-by: Minoru TAKAHASHI <takahashi.minoru7@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-10-28 14:44:41 +09:00
Minoru TAKAHASHI
26e8efb246 ofctl_rest: support OFPTableFeaturesStats Message
this patch makes ofctl_rest enable use of OFPTableFeaturesStats message.

Get table features:

  usage)

    URI:    /stats/tablefeatures/<dpid>
    method: GET

  e.g.)

    $ curl -X GET http://localhost:8080/stats/tablefeatures/1
    {
      "1": [
        {
          "metadata_write": 18446744073709552000,
          "config": 0,
          "table_id": 0,
          "metadata_match": 18446744073709552000,
          "max_entries": 4096,
          "properties": [
            {
              "type": "INSTRUCTIONS",
              "instruction_ids": [
               {
               "len": 4,
               "type": 1
               },
	       ....
              ]
            },
            ...
          ],
          "name": "table_0"
        },
        {
          "metadata_write": 18446744073709552000,
          "config": 0,
          "table_id": 1,
          "metadata_match": 18446744073709552000,
          "max_entries": 4096,
          "properties": [
            {
              "type": "INSTRUCTIONS",
              "instruction_ids": [
               {
               "len": 4,
               "type": 1
               },
               ....
              ]
            },
            ...
          ],
          "name": "table_1"
        },
        ...
      ]
    }

Signed-off-by: Minoru TAKAHASHI <takahashi.minoru7@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-10-28 14:44:40 +09:00
Minoru TAKAHASHI
9a534b46a6 ofctl_rest: support OFPTableStats Message
this patch makes ofctl_rest enable use of OFPTableStats message.

Get table stats:

  usage)

    URI:    /stats/table/<dpid>
    method: GET

  e.g.)

    $ curl -X GET http://localhost:8080/stats/table/1

More infomation about this feature is described in the following URL.
http://ryu.readthedocs.org/en/latest/app/ofctl_rest.html#get-table-stats

Signed-off-by: Minoru TAKAHASHI <takahashi.minoru7@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-10-28 14:44:40 +09:00
Toshiki Tsuboi
f4f24469da vrrp: fix param of virtual_ip_address for rpc_api
It looks VRRPManager can't handle virtual_ip_address properly as bellow.

$ sudo ryu-manager ryu.services.protocols.vrrp.rpc_manager.py
loading app ryu.services.protocols.vrrp.rpc_manager.py
loading app ryu.services.protocols.vrrp.manager
instantiating app ryu.services.protocols.vrrp.manager of VRRPManager
instantiating app ryu.services.protocols.vrrp.rpc_manager.py of RpcVRRPManager
instantiating app None of VRRPInterfaceMonitorNetworkDevice
instantiating app None of VRRPRouterV3
handle EventVRRPStateChanged
VRID:1 VRRP-Router-VRRPInterfaceNetworkDevice<00:00:00:00:00:00, 192.168.0.2, None, eth1>-1-ipv4: None -> Initialize
handle EventVRRPStateChanged
VRID:1 VRRP-Router-VRRPInterfaceNetworkDevice<00:00:00:00:00:00, 192.168.0.2, None, eth1>-1-ipv4: Initialize -> Backup
hub: uncaught exception: Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/ryu/lib/hub.py", line 52, in _launch
    func(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/ryu/base/app_manager.py", line 276, in _event_loop
    handler(ev)
  File "/usr/local/lib/python2.7/dist-packages/ryu/services/protocols/vrrp/router.py", line 234, in master_down_handler
    self.state_impl.master_down(ev)
  File "/usr/local/lib/python2.7/dist-packages/ryu/services/protocols/vrrp/router.py", line 613, in master_down
    self._master_down()
  File "/usr/local/lib/python2.7/dist-packages/ryu/services/protocols/vrrp/router.py", line 579, in _master_down
    vrrp_router.send_advertisement()
  File "/usr/local/lib/python2.7/dist-packages/ryu/services/protocols/vrrp/router.py", line 219, in send_advertisement
    packet_.serialize()
  File "/usr/local/lib/python2.7/dist-packages/ryu/lib/packet/packet.py", line 74, in serialize
    data = p.serialize(self.data, prev)
  File "/usr/local/lib/python2.7/dist-packages/ryu/lib/packet/vrrp.py", line 394, in serialize
    return self.serialize_static(self, prev)
  File "/usr/local/lib/python2.7/dist-packages/ryu/lib/packet/vrrp.py", line 625, in serialize_static
    *[conv(x) for x in vrrp_.ip_addresses])
  File "/usr/local/lib/python2.7/dist-packages/ryu/lib/addrconv.py", line 27, in text_to_bin
    return self._addr(text, **self._addr_kwargs).packed
  File "/usr/local/lib/python2.7/dist-packages/netaddr/ip/__init__.py", line 314, in __init__
    % (addr, self._module.version))
AddrFormatError: base address '.' is not IPv4

Signed-off-by: Toshiki Tsuboi <t.tsubo2000@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-10-28 14:33:38 +09:00
IWASE Yusuke
7af6e28ea3 tester: Reduce pylint warnings
Signed-off-by: IWASE Yusuke <iwase.yusuke0@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-10-28 14:32:03 +09:00
IWASE Yusuke
ce6e5ddd62 tester: Add test cases for OpenFlow1.0
Note: OpenFlow 1.0 does not mention IPv6, but some implemetation
of the switch (e.g. Open vSwitch) can deal with IPv6 header field
in some OpenFlow1.0 match/actions.
So this patch includes tester.py to test match/actions with IPv6.

Signed-off-by: IWASE Yusuke <iwase.yusuke0@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-10-28 14:32:03 +09:00
IWASE Yusuke
74d5de7803 tester: Support to test OpenFlow1.0 switch
Signed-off-by: IWASE Yusuke <iwase.yusuke0@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-10-28 14:32:02 +09:00
IWASE Yusuke
7c7fb56ad6 packet_data: Fix wildcarded match value in OF1.0
OpenFlow Spec 1.0 does not define clearly the match value when the
corresponding wildcard flags are set, but OpenFlow 1.3.2 mandate
that masked value must be 0-bits in match.
This patch fixes wildcarded match value (dl_src) into 0-bits.

Signed-off-by: IWASE Yusuke <iwase.yusuke0@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-10-28 14:32:02 +09:00
IWASE Yusuke
d6b7dd5c40 of10: Human readable address field in json Match/Action
Signed-off-by: IWASE Yusuke <iwase.yusuke0@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-10-28 14:32:02 +09:00
IWAMOTO Toshihiro
a9876bf5c4 Try logging.config.dictConfig before in-tree version
Python bundles dictConfig since 2.7.  Try the bundled version first
as the version included in Ryu will not work with python3.

Signed-off-by: IWAMOTO Toshihiro <iwamoto@valinux.co.jp>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-10-22 05:50:56 +09:00
IWAMOTO Toshihiro
ff66183243 Python3: use int instead of long
Using int for long int should not cause issues since python2.4.
c.f. https://docs.python.org/2.6/whatsnew/2.4.html#pep-237-unifying-long-integers-and-integers

Signed-off-by: IWAMOTO Toshihiro <iwamoto@valinux.co.jp>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-10-22 05:50:55 +09:00
IWAMOTO Toshihiro
dc361d1a3b Python3: complete previous removal of types usage
Fix the leftover of previos types.*Type removal.  Also, as python3
doesn't have long type, use six.integer_types instead.

Signed-off-by: IWAMOTO Toshihiro <iwamoto@valinux.co.jp>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
2015-10-22 05:50:54 +09:00