Skip to content
Snippets Groups Projects
  1. Sep 20, 2017
    • Jean Aunis's avatar
      bridge : Fix one-way direct-media when early bridging with native_rtp · 6b7d5671
      Jean Aunis authored
      When two channels were early bridged in a native_rtp bridge, the RTP description
      on one side was not updated when the other side answered.
      This patch forbids non-answered channels to enter a native_rtp bridge, and
      triggers a bridge reconfiguration when an ANSWER frame is received.
      
      ASTERISK-27257
      
      Change-Id: If1aaee1b4ed9658a1aa91ab715ee0a6413b878df
      6b7d5671
  2. Aug 22, 2017
    • Richard Mudgett's avatar
      bridge_channel.c: Fix FRACK when mapping frames to the bridge. · 17976d1b
      Richard Mudgett authored
      * Add protection checks when mapping streams to the bridge.  The channel
      and bridge may be in the process of updating the stream mapping when a
      media frame comes in so we may not be able to map the frame at the time.
      
      * We need to map the streams to the bridge's stream numbers right before
      they are written into the bridge.  That way we don't have to keep
      locking/unlocking the bridge and we won't have any synchronization
      problems before the frames actually go into the bridge.
      
      * Protect the deferred queue with the bridge_channel lock.
      
      ASTERISK-27212
      
      Change-Id: Id6860dd61b594b90c8395f6e2c0150219094c21a
      17976d1b
    • Richard Mudgett's avatar
      bridge: Fix softmix bridge deadlock. · 6ad82492
      Richard Mudgett authored
      * Fix deadlock in
      bridge_softmix.c:softmix_bridge_stream_topology_changed() between
      bridge_channel and channel locks.
      
      * The new bridge technology topology change callbacks must be called with
      the bridge locked.  The callback references the bridge channel list, the
      bridge technology could change, and the bridge stream mapping is updated.
      
      ASTERISK-27212
      
      Change-Id: Ide4360ab853607e738ad471721af3f561ddd83be
      6ad82492
  3. Aug 06, 2017
    • Joshua Colp's avatar
      bridge: Fix stream topology/participant locking and video misrouting. · 88c65f7c
      Joshua Colp authored
      This change fixes a few locking issues and some video misrouting.
      
      1. When accessing the stream topology of a channel the channel lock
      must be held to guarantee the topology remains valid.
      
      2. When a channel was joined to a bridge the bridge specific
      implementation for stream mapping was not invoked, causing video
      to be misrouted for a brief period of time.
      
      ASTERISK-27182
      
      Change-Id: I5d2f779248b84d41c5bb3896bf22ba324b336b03
      88c65f7c
  4. Jul 11, 2017
    • Joshua Colp's avatar
      bridge/core_unreal: Fix SFU bugs with forwarding frames. · 7f09fd2c
      Joshua Colp authored
      This change fixes a few things uncovered during SFU testing.
      
      1. Unreal channels incorrectly forwarded video frames when
      no video stream was present on them. This caused a crash when
      they were read as the core requires a stream to exist for the
      underlying media type. The Unreal channel will now ensure a
      stream exists for the media type before forwarding the frame
      and if no stream exists then the frame is dropped.
      
      2. Mapping of frames during bridging from the stream number of
      the underlying channel to the stream number of the bridge was
      done in the wrong location. This resulted in the frame getting
      dropped. This mapping now occurs on reading of the frame from
      the channel.
      
      3. Bridging was using the wrong ast_read function resulting in
      it living in a non-multistream world.
      
      4. In bridge_softmix when adding new streams to existing channels
      the wrong stream topology was copied resulting in no streams
      being added.
      
      Change-Id: Ib7445722c3219951d6740802a0feddf2908c18c8
      7f09fd2c
  5. Jun 13, 2017
    • Joshua Colp's avatar
      bridge: Add a deferred queue. · d6386a8f
      Joshua Colp authored
      This change adds a deferred queue to bridging. If a bridge
      technology determines that a frame can not be written and
      should be deferred it can indicate back to bridging to do so.
      Bridging will then requeue any deferred frames upon a new
      channel joining the bridge.
      
      This change has been leveraged for T.38 request negotiate
      control frames. Without the deferred queue there is a race
      condition between the bridge receiving the T.38 request
      negotiate and the second channel joining and being in the
      bridge. If the channel is not yet in the bridge then the T.38
      negotiation fails.
      
      A unit test has also been added that confirms that a T.38
      request negotiate control frame is deferred when no other
      channel is in the bridge and that it is requeued when a new
      channel joins the bridge.
      
      ASTERISK-26923
      
      Change-Id: Ie05b08523f399eae579130f4a5f562a344d2e415
      d6386a8f
  6. May 30, 2017
    • Mark Michelson's avatar
      Add primitive SFU support to bridge_softmix. · 2da86940
      Mark Michelson authored
      This sets up the "plumbing" in bridge_softmix to
      be able to accommodate Asterisk asking as an SFU
      (selective forwarding unit) for conferences.
      
      The way this works is that whenever a channel enters or leaves a
      conference, all participants in the bridge get sent a stream topology
      change request. The topologies consist of the channels' original
      topology, along with video destination streams corresponding to each
      participants' source video streams. So for instance, if Alice, Bob, and
      Carol are in the conference, and each supplies one video stream, then
      the topologies for each would look like so:
      
      Alice:
      Audio,
      Source video(Alice),
      Destination Video(Bob),
      Destination video (Carol)
      
      Bob:
      Audio,
      Source video(Bob)
      Destination Video(Alice),
      Destination video (Carol)
      
      Carol:
      Audio,
      Source video(Carol)
      Destination Video(Alice),
      Destination video (Bob)
      
      This way, video that arrives from a source video stream can then be
      copied out to the destination video streams on the other participants'
      channels.
      
      Once the bridge gets told that a topology on a channel has changed, the
      bridge constructs a map in order to get the video frames routed to the
      proper destination streams. This is done using the bridge channel's
      stream_map.
      
      This change is bare-bones with regards to SFU support. Some key features
      are missing at this point:
      
      * Stream limits. This commit makes no effort to limit the number of
        streams on a specific channel. This means that if there were 50 video
        callers in a conference, bridge_softmix will happily send out topology
        change requests to every channel in the bridge, requesting 50+
        streams.
      
      * Configuration. The plumbing has been added to bridge_softmix, but
        there has been nothing added as of yet to app_confbridge to enable SFU
        video mode.
      
      * Testing. Some functions included here have unit tests.
        However, the functionality as a whole has only been verified by
        hand-tracing the code.
      
      * Selectivenss. For a "selective" forwarding unit, this does not
        currently have any means of being selective.
      
      * Features. Presumably, someone might wish to only receive video from
        specific sources. There are no external-facing functions at the moment
        that allow for users to select who they receive video from.
      
      * Efficiency. The current scheme treats all video streams as being
        unidirectional. We could be re-using a source video stream as a
        desetnation, too. But to simplify things on this first round, I did it
        this way.
      
      Change-Id: I7c44a829cc63acf8b596a337b2dc3c13898a6c4d
      2da86940
  7. May 16, 2017
    • Joshua Colp's avatar
      asterisk: Audit locking of channel when manipulating flags. · 5a7af00e
      Joshua Colp authored
      When manipulating flags on a channel the channel has to be
      locked to guarantee that nothing else is also manipulating
      the flags. This change introduces locking where necessary to
      guarantee this. It also adds helper functions that manipulate
      channel flags and lock to reduce repeated code.
      
      ASTERISK-26789
      
      Change-Id: I489280662dba0f4c50981bfc5b5a7073fef2db10
      5a7af00e
  8. May 03, 2017
    • Kevin Harwell's avatar
      bridge_simple: Added support for streams · 7b0e3b92
      Kevin Harwell authored
      This patch is the first cut at adding stream support to the bridging framework.
      Changes were made to the framework that allows mapping of stream topologies to
      a bridge's supported media types.
      
      The first channel to enter a bridge initially defines the media types for a
      bridge (i.e. a one to one mapping is created between the bridge and the first
      channel). Subsequently added channels merge their media types into the bridge's
      adding to it when necessary. This allows channels with different sized
      topologies to map correctly to each other according to media type. The bridge
      drops any frame that does not have a matching index into a given write stream.
      
      For now though, bridge_simple will align its two channels according to size or
      first to join. Once both channels join the bridge the one with the most streams
      will indicate to the other channel to update its streams to be the same as that
      of the other. If both channels have the same number of streams then the first
      channel to join is chosen as the stream base.
      
      A topology change source was also added to a channel when a stream toplogy
      change request is made. This allows subsystems to know whether or not they
      initiated a change request. Thus avoiding potential recursive situations.
      
      ASTERISK-26966 #close
      
      Change-Id: I1eb5987921dd80c3cdcf52accc136393ca2d4163
      7b0e3b92
  9. Apr 24, 2017
    • Sean Bright's avatar
      core: Use eventfd for alert pipes on Linux when possible · 59203c51
      Sean Bright authored
      The primary win of switching to eventfd when possible is that it only
      uses a single file descriptor while pipe() will use two. This means for
      each bridge channel we're reducing the number of required file
      descriptors by 1, and - if you're using timerfd - we also now have 1
      less file descriptor per Asterisk channel.
      
      The API is not ideal (passing int arrays), but this is the cleanest
      approach I could come up with to maintain API/ABI.
      
      I've also removed what I believe to be an erroneous code block that
      checked the non-blocking flag on the pipe ends for each read. If the
      file descriptor is 'losing' its non-blocking mode, it is because of a
      bug somewhere else in our code.
      
      In my testing I haven't seen any measurable difference in performance.
      
      Change-Id: Iff0fb1573e7f7a187d5211ddc60aa8f3da3edb1d
      59203c51
  10. Nov 04, 2016
    • Matt Jordan's avatar
      main/bridge_channel: Fix channel reference leak on video source · bbe94372
      Matt Jordan authored
      When a channel is made the video source, the bridge holds a reference to
      it. Whenever the video source changes, that reference is released.
      However, a ref leak does occur if the channel leaves the bridge (such as
      being hung up) while it is the video source, as the bridge never
      releases the ref in such a case.
      
      This patch adds a line to the bridge_channel_internal_join routine such
      that, when a channel finishes its time in the bridge, it notifies the
      bridge via ast_bridge_remove_video_src that if it is a video source its
      reference should be released.
      
      ASTERISK-26555 #close
      
      Change-Id: I3a2f5238a9d2fc49c591f0e65199d782ab0be76a
      bbe94372
  11. Oct 27, 2016
    • Corey Farrell's avatar
      Remove ASTERISK_REGISTER_FILE. · a6e5bae3
      Corey Farrell authored
      ASTERISK_REGISTER_FILE no longer has any purpose so this commit removes
      all traces of it.
      
      Previously exported symbols removed:
      * __ast_register_file
      * __ast_unregister_file
      * ast_complete_source_filename
      
      This also removes the mtx_prof static variable that was declared when
      MTX_PROFILE was enabled.  This variable was only used in lock.c so it
      is now initialized in that file only.
      
      ASTERISK-26480 #close
      
      Change-Id: I1074af07d71f9e159c48ef36631aa432c86f9966
      a6e5bae3
  12. Jun 30, 2016
    • Richard Mudgett's avatar
      features: Fix channel datastore access. · 4f7b8597
      Richard Mudgett authored
      Found as a result of the testsuite tests/callparking test crashing.
      
      Several calls to ast_get_chan_featuremap_config() and
      ast_get_chan_features_xfer_config() did not lock the channel before
      calling so the channel's datastore list was accessed without the lock's
      protection.  Apparently another thread deleted a datastore on the
      channel's list while the crashing thread was walking the list.  Crash at
      0xdeaddead due to MALLOC_DEBUG's memory filler value as a result.
      
      * Add missing channel locks to calls that were not already protected
      as the doxygen for those calls indicates.
      
      Change-Id: Id273b3d305cc616406c353cbc841b2b7655efaa1
      4f7b8597
  13. Jun 04, 2016
    • Alexei Gradinari's avatar
      core/dial: New channel variable FORWARDERNAME · 3e8d523d
      Alexei Gradinari authored
      Added a new channel variable FORWARDERNAME which indicates which
      channel was responsible for a forwarding requests received on dial attempt.
      
      Fixed a bug in the app_queue: FORWARD_CONTEXT is not used.
      
      ASTERISK-26059 #close
      
      Change-Id: I34e93e8c1b5e17776a77b319703c48c8ca48e7b2
      3e8d523d
  14. May 31, 2016
    • Mark Michelson's avatar
      Expand the scope of Dial Events · 205a31f8
      Mark Michelson authored
      Dial events up to this point have come in two flavors
      * A Dial event with no status to indicate that dialing has begun
      * A Dial event with a status to indicate that dialing has ended
      
      With this change, Dial events have been expanded to also give
      intermediate events, such as "RINGING", "PROCEEDING", and "PROGRESS".
      This is especially useful for ARI dialing, as it gives the application
      writer the opportunity to place a channel into an early bridge when
      early media is detected.
      
      AMI handles these in-progress dial events by sending a new event called
      "DialState" that simply indicates that dial state has changed but has
      not ended. ARI never distinguished between DialBegin and DialEnd, so no
      change was made to the event itself.
      
      Another change here relates to dial forwards. A forward-related event
      was previously only sent when a channel was successfully able to forward
      a call to a new channel. With this set of changes, if forwarding is
      blocked, we send a Dial event with a forwarding destination but no
      forwarding channel, since we were prevented from creating one. This is
      again useful for ARI since application writers can now handle call
      forward attempts from within their own application.
      
      ASTERISK-25925 #close
      Reported by Mark Michelson
      
      Change-Id: I42cbec7730d84640a434d143a0d172a740995543
      205a31f8
  15. Apr 20, 2016
    • Richard Mudgett's avatar
      bridge: Hold off more than one imparting channel at a time. · 1c5248c3
      Richard Mudgett authored
      An earlier patch blocked the ast_bridge_impart() call until the channel
      either entered the target bridge or it failed.  Unfortuantely, if the
      target bridge is stasis and the imprted channel is not a stasis channel,
      stasis bounces the channel out of the bridge to come back into the bridge
      as a proper stasis channel.  When the channel is bounced out, that
      released the block on ast_bridge_impart() to continue.  If the impart was
      a result of a transfer, then it became a race to see if the swap channel
      would get hung up before the imparted channel could come back into the
      stasis bridge.  If the imparted channel won then everything is fine.  If
      the swap channel gets hung up first then the transfer will fail because
      the swap channel is leaving the bridge.
      
      * Allow a chain of ast_bridge_impart()'s to happen before any are
      unblocked to prevent the race condition described above.  When the channel
      finally joins the bridge or completely fails to join the bridge then the
      ast_bridge_impart() instances are unblocked.
      
      ASTERISK-25947
      Reported by: Richard Mudgett
      
      ASTERISK-24649
      Reported by: John Bigelow
      
      ASTERISK-24782
      Reported by: John Bigelow
      
      Change-Id: I8fef369171f295f580024ab4971e95c799d0dde1
      1c5248c3
  16. Apr 18, 2016
    • Richard Mudgett's avatar
      bridge_channel.c: Ignore role setup failure in channel push. · 6365f001
      Richard Mudgett authored
      We have to setup the channel roles after the bridge class push is called
      because the bridge class push callback may have set roles on the incoming
      channel.  Since we have already partially pushed the channel into the
      bridge and reversing what we have already done could be problematic, the
      only thing we can do is press on to complete pushing the channel into the
      bridge.
      
      * Ignore any channel role setup errors after pushing the channel into a
      bridge.  The channel may behave incorrectly in the bridge but we can no
      longer abort the push at this time.
      
      Change-Id: I08a97082b729052ee65cdca6bb730cf1289ede00
      6365f001
  17. Feb 29, 2016
    • Richard Mudgett's avatar
      bridge core: Add owed T.38 terminate when channel leaves a bridge. · c7d45b84
      Richard Mudgett authored
      The channel is now going to get T.38 terminated when it leaves the
      bridging system and the bridged peers are going to get T.38 terminated as
      well.
      
      ASTERISK-25582
      
      Change-Id: I77a9205979910210e3068e1ddff400dbf35c4ca7
      c7d45b84
    • Richard Mudgett's avatar
      bridge_channel: Don't settle owed events on an optimization. · 86f7336c
      Richard Mudgett authored
      Local channel optimization could cause DTMF digits to be duplicated.
      Pending DTMF end events would be posted to a bridge when the local channel
      optimizes out and is replaced by the channel further down the chain.  When
      the real digit ends, the channel would get another DTMF end posted to the
      bridge.
      
      A -- LocalA;1/n -- LocalA;2/n -- LocalB;1 -- LocalB;2 -- B
      
      1) LocalA has the /n flag to prevent optimization.
      2) B is sending DTMF to A through the local channel chain.
      3) When LocalB optimizes out it can move B to the position of LocalB;1
      4) Without this patch, when B swaps with LocalB;1 then LocalB;1 would
      settle an owed DTMF end to the bridge toward LocalA;2.
      5) When B finally ends its DTMF it sends the DTMF end down the chain.
      6) Without this patch, A would hear the DTMF digit end when LocalB
      optimizes out and when B ends the original digit.
      
      ASTERISK-25582
      
      Change-Id: I1bbd28b8b399c0fb54985a5747f330a4cd2aa251
      86f7336c
  18. Dec 01, 2015
    • Jonathan Rose's avatar
      Unset BRIDGEPEER when leaving a bridge · b5281b74
      Jonathan Rose authored
      Currently if a channel is transferred out of a bridge, the BRIDGEPEER
      variable (also BRIDGEPVTCALLID) remain set even once the channel is
      out of the bridge. This patch removes these variables when leaving
      the bridge.
      
      ASTERISK-25600 #close
      Reported by: Mark Michelson
      
      Change-Id: I753ead2fffbfc65427ed4e9244c7066610e546da
      b5281b74
  19. Aug 24, 2015
    • Joshua Colp's avatar
      bridge: Kick channel from bridge if hung up during action. · 98d089fb
      Joshua Colp authored
      When executing an action in a bridge it is possible for the
      channel to be hung up without the bridge becoming aware of it.
      This is most easily reproducible by hanging up when the bridge
      is streaming DTMF due to a feature timeout. This change makes
      it so after action execution the channel is checked to determine
      if it has been hung up and if it has it is kicked from the bridge.
      
      ASTERISK-25341 #close
      
      Change-Id: I6dd8b0c3f5888da1c57afed9e8a802ae0a053062
      98d089fb
  20. Jul 13, 2015
    • Kevin Harwell's avatar
      bridge.c: Fixed race condition during attended transfer · c8555235
      Kevin Harwell authored
      During an attended transfer a thread is started that handles imparting the
      bridge channel. From the start of the thread to when the bridge channel is
      ready exists a gap that can potentially cause problems (for instance, the
      channel being swapped is hung up before the replacement channel enters the
      bridge thus stopping the transfer). This patch adds a condition that waits
      for the impart thread to get to a point of acceptable readiness before
      allowing the initiating thread to continue.
      
      ASTERISK-24782
      Reported by: John Bigelow
      
      Change-Id: I08fe33a2560da924e676df55b181e46fca604577
      c8555235
  21. Jun 11, 2015
    • Joshua Colp's avatar
      bridge: When performing a blonde transfer update connected line information. · 7230ee2e
      Joshua Colp authored
      When performing a blonde transfer the code uses the old masquerade
      mechanism to move a channel around. As a result of this certain information,
      such as connected line, is moved between the channels involved. Upon
      completion of the move a frame is queued which is supposed to update the
      connected line information on the channel. This does not occur as the
      code considers it a redundant update since the masquerade operation
      updated the channel (but did not inform it of the new connected line
      information). The code also does not queue a connected line update
      to be handled by the thread handling the channel. Without this any
      other channel that may be loosely involved does not know it is
      talking to a different caller.
      
      This change does the following to resolve this:
      
      1. The indicated connected line information is cleared upon
      completion of the masquerade operation when doing a blonde transfer.
      This prevents the connected line update from being considered
      redundant.
      
      2. A connected line update frame is now queued upon the completion
      of the masquerade operation so any other channel loosely involved
      knows that there is a different caller.
      
      ASTERISK-25157 #close
      Reported by: Joshua Colp
      
      Change-Id: Ibb8798184a1dab3ecd35299faecc420034adbf20
      7230ee2e
  22. Apr 13, 2015
    • Matt Jordan's avatar
      git migration: Refactor the ASTERISK_FILE_VERSION macro · 4a582616
      Matt Jordan authored
      Git does not support the ability to replace a token with a version
      string during check-in. While it does have support for replacing a
      token on clone, this is somewhat sub-optimal: the token is replaced
      with the object hash, which is not particularly easy for human
      consumption. What's more, in practice, the source file version was often
      not terribly useful. Generally, when triaging bugs, the overall version
      of Asterisk is far more useful than an individual SVN version of a file. As a
      result, this patch removes Asterisk's support for showing source file
      versions.
      
      Specifically, it does the following:
      
      * Rename ASTERISK_FILE_VERSION macro to ASTERISK_REGISTER_FILE, and
        remove passing the version in with the macro. Other facilities
        than 'core show file version' make use of the file names, such as
        setting a debug level only on a specific file. As such, the act of
        registering source files with the Asterisk core still has use. The
        macro rename now reflects the new macro purpose.
      
      * main/asterisk:
        - Refactor the file_version structure to reflect that it no longer
          tracks a version field.
        - Remove the "core show file version" CLI command. Without the file
          version, it is no longer useful.
        - Remove the ast_file_version_find function. The file version is no
          longer tracked.
        - Rename ast_register_file_version/ast_unregister_file_version to
          ast_register_file/ast_unregister_file, respectively.
      
      * main/manager: Remove value from the Version key of the ModuleCheck
        Action. The actual key itself has not been removed, as doing so would
        absolutely constitute a backwards incompatible change. However, since
        the file version is no longer tracked, there is no need to attempt to
        include it in the Version key.
      
      * UPGRADE: Add notes for:
        - Modification to the ModuleCheck AMI Action
        - Removal of the "core show file version" CLI command
      
      Change-Id: I6cf0ff280e1668bf4957dc21f32a5ff43444a40e
      4a582616
  23. Apr 07, 2015
    • Matthew Jordan's avatar
      ARI: Add the ability to intercept hold and raise an event · c2f50ba6
      Matthew Jordan authored
      For some applications - such as SLA - a phone pressing hold should not behave
      in the fashion that the Asterisk core would like it to. Instead, the hold
      action has some application specific behaviour associated with it - such as
      disconnecting the channel that initiated the hold; only playing MoH to channels
      in the bridge if the channels are of a particular type, etc.
      
      One way of accomplishing this is to use a framehook to intercept the
      hold/unhold frames, raise an event, and eat the frame. Tasty. This patch
      accomplishes that using a new dialplan function, HOLD_INTERCEPT.
      
      In addition, some general cleanup of raising hold/unhold Stasis messages was
      done, including removing some RAII_VAR usage.
      
      Review: https://reviewboard.asterisk.org/r/4549/
      
      ASTERISK-24922 #close
      ........
      
      Merged revisions 434216 from http://svn.asterisk.org/svn/asterisk/branches/13
      
      
      git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@434217 65c4cc65-6c06-0410-ace0-fbb531ad65f3
      c2f50ba6
  24. Mar 26, 2015
  25. Mar 13, 2015
  26. Jan 27, 2015
  27. Jan 26, 2015
    • David M. Lee's avatar
      Various fixes for OS X · 965777cc
      David M. Lee authored
      This patch addresses compilation errors on OS X. It's been a while, so
      there's quite a few things.
      
       * Fixed __attribute__ decls in route.h to be portable.
       * Fixed htonll and ntohll to work when they are defined as macros.
       * Replaced sem_t usage with our ast_sem wrapper.
       * Added ast_sem_timedwait to our ast_sem wrapper.
       * Fixed some GCC 4.9 warnings using sig*set() functions.
       * Fixed some format strings for portability.
       * Fixed compilation issues with res_timing_kqueue (although tests still fail
         on OS X).
       * Fixed menuconfig /sbin/launchd detection, which disables res_timing_kqueue
         on OS X).
      
      ASTERISK-24539 #close
      Reported by: George Joseph
      
      ASTERISK-24544 #close
      Reported by: George Joseph
      
      Review: https://reviewboard.asterisk.org/r/4327/
      ........
      
      Merged revisions 431092 from http://svn.asterisk.org/svn/asterisk/branches/13
      
      
      git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@431093 65c4cc65-6c06-0410-ace0-fbb531ad65f3
      965777cc
  28. Jan 22, 2015
  29. Nov 24, 2014
  30. Nov 06, 2014
  31. Oct 03, 2014
  32. Aug 20, 2014
  33. Aug 13, 2014
  34. Jul 22, 2014
  35. Jul 20, 2014
  36. Jul 17, 2014
  37. Jul 15, 2014
  38. Jul 09, 2014
Loading