Project

General

Profile

CalypsoBTS » History » Version 2

fixeria, 02/19/2016 10:49 PM

1 1 fixeria
= CalypsoBTS =
2
3
This tutorial describes how to turn cheap Calypso based phone(s) into a BTS. Due to hardware limitations the CalypsoBTS setup cannot provide normal quality of service and only can be used to learn how the base stations works. Because Calypso based phone cannot perform BTS functionality itself, in this tutorial we consider how to use it with [http://openbsc.osmocom.org/trac/wiki/OsmoBTS OsmoBTS] and [http://openbts.org/ OpenBTS] front-ends.
4
5
== Requirements ==
6
7
First of all you have to understand what you're doing and possible consequences. You can use the frequencies you have valid license for. In many countries you cannot operate any GSM RF equipment unless you have obtained a proper license from the regulatory authority. Accomplishing to operate a BTS without having such a license and/or interfering with a public telecommunications network is a crime and punishable under applicable law! 
8
9
Also you need to have a [http://bb.osmocom.org/trac/wiki/Software/GettingStarted working setup] of OsmocomBB. And finally some things can be differ in your distribution, so you should be able to solve possible problems yourself because it's your machine.
10
11
== TRX preparation ==
12
There are two OsmocomBB branches provide the transceiver firmware and application. I advice you to use the jolly/testing branch because it have multiple phones support. The transceiver app is an external interface of CalypsoBTS which abstracts a BTS software from the L1 physical layer. It needs libosmo-dsp as a dependency:
13
14
{{{
15
#!sh
16
git clone git://git.osmocom.org/libosmo-dsp.git
17
cd libosmo-dsp/
18
autoreconf -i
19
./configure
20
make
21
sudo make install
22
cd ..
23
}}}
24
25
Then clone and compile the jolly/testing branch:
26
27
{{{
28
#!sh
29
# Get the sources	
30
git clone git://git.osmocom.org/osmocom-bb.git trx
31
cd trx/
32
git checkout jolly/testing
33
cd src/
34
35
# It needs TX support
36
# Just uncomment 'CFLAGS += -DCONFIG_TX_ENABLE' in target/firmware/Makefile
37
38
# And make with transceiver support
39
make HOST_layer23_CONFARGS=--enable-transceiver
40
}}}
41
42
And at this step your transceiver is ready. Let's check how it works!
43
44
==== A bit of theory ====
45
46
It is very important to have a good clock synchronization between the BTS and mobile phones. Time-division (TDMA) systems require very accurate counting of the time segments and when they start and stop. If the towers clocking were out of sync, then communications would falter as each node would be trying to deal with segments that were slightly offset and this would introduce errors. The GPS signals can be used as clock source. But there is more simple way to grab the clock from existing public mobile networks.
47
48
Using [wiki:rssi.bin RSSI] or cell_log find the strongest cell and remember it's ARFCN number.
49
50
==== Usage ====
51
52
{{{
53
Usage: ./transceiver -a arfcn_sync
54
Some useful options:
55
  -h   --help             this text
56
  -d   --debug MASK       Enable debugging (e.g. -d DL1C:DTRX)
57
  -e   --log-level LOGL   Set log level (1=debug, 3=info, 5=notice)
58
  -D   --daemonize        For the process into a background daemon
59
  -s   --disable-color    Don't use colors in stderr log output
60
  -a   --arfcn-sync ARFCN Set ARFCN to sync to
61
  -p   --arfcn-sync-pcs   The ARFCN above is PCS
62
  -2   --second-phone     Use second phone for TS 1
63
  -r   --realtime PRIO    Set realtime scheduler with given prio
64
}}}
65
66
Where --arfcn-sync or --arfcn-sync-pcs indicates the '''ARFCN of clock source cell'''. High priority scheduling required for handling bursts (-r 99). Just try to sync:
67
68
{{{
69
#!sh
70
# Load the TRX firmware in first terminal
71
cd trx/src/
72
sudo host/osmocon/osmocon -r 99 -m c123xor -p /dev/ttyUSB0 -c target/firmware/board/compal_e88/trx.highram.bin
73
74
# In second terminal run the transceiver
75
cd trx/src/host/layer23/src/transceiver/
76
sudo ./transceiver -a <ARFCN> -r 99
77
}}}
78
79
And you should see something like this:
80
81
{{{
82
<0012> l1ctl.c:383 Reset received: Starting sync.
83
<0012> l1ctl.c:338 Sync acquired, setting BTS mode ...
84
<0011> trx.c:194 TRX CLK Indication 1255520
85
<0011> trx.c:194 TRX CLK Indication 1255571
86
<0011> trx.c:194 TRX CLK Indication 1255622
87
<0011> trx.c:194 TRX CLK Indication 1255673
88
<0011> trx.c:194 TRX CLK Indication 1255724
89
<0011> trx.c:194 TRX CLK Indication 1255775
90
<0011> trx.c:194 TRX CLK Indication 1255826
91
<0011> trx.c:194 TRX CLK Indication 1255877
92
<0011> trx.c:194 TRX CLK Indication 1255928
93
<0011> trx.c:194 TRX CLK Indication 1255979
94
<0011> trx.c:194 TRX CLK Indication 1256030
95
<0011> trx.c:194 TRX CLK Indication 1256081
96
...
97
}}}
98
99
If something goes wrong, find another ARFCN and try again.
100
101 2 fixeria
= CalypsoBTS with OsmoBTS =
102 1 fixeria
[http://openbsc.osmocom.org/trac/wiki/OsmoBTS OsmoBTS] is a software implementation of Layer2/3 of a BTS. Currently it supports a few hardware back-ends only:
103
104
* Multiple indoor and outdoor BTS products called ​sysmoBTS which is sold by ​[http://sysmocom.de/ sysmocom].
105
* Multiple indoor and outdoor ​fairwaves BTSs, like UmDESK and UmSITE.
106
* Wideband SDR transceiver hardware supported by OpenBTS transceiver or [http://openbsc.osmocom.org/trac/wiki/OsmoTRX OsmoTRX] PHY layer software, including the UmTRX, the USRP family, etc.
107
* A pretty crazy experimental BTS hardware based on several OsmocomBB phones.
108
109
The simplest way to test how it works is to use OsmoBTS with OpenBSC in NiTB mode. Refer [http://openbsc.osmocom.org/trac/wiki/OpenBSC project home] for details. NiTB is a simple core network implementation - network in the box. It emulates basic core elements like MSC, HLR, VLR, etc.
110
111
=== Dependences ===
112
Make sure that you have installed [http://bb.osmocom.org/trac/wiki/libosmocore libosmocore].
113
114
Install/update the following packages in your distribution:
115
116
{{{sudo apt-get install sqlite3 libdbi-dev libdbd-sqlite3 libsctp-dev}}}
117
118
==== oRTP ====
119
This package installs the open source RTP protocol required for libosmo-abis. It can be downloaded at [http://download.savannah.gnu.org/releases/linphone/ortp/sources/]. Current OsmoBTS source works fine with **0.22.0 oRTP** version only. Otherwise there may be problems with voice support.
120
121
{{{
122
#!sh
123
wget http://download.savannah.gnu.org/releases/linphone/ortp/sources/ortp-0.22.0.tar.gz
124
tar -xvf ortp-0.22.0.tar.gz
125
cd ortp-0.22.0/
126
./configure
127
make
128
sudo make install
129
sudo ldconfig
130
cd ..
131
}}}
132
133
==== libosmo-abis ====
134
135
{{{git clone git://git.osmocom.org/libosmo-abis.git}}}
136
137
Sometimes it is necessary to point to different pkgconfig path, because your distribution may use other pkgconfig path than the default path of the packages above. Use the following prefix: 
138
139
{{{PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/ ./configure .....}}}
140
141
{{{
142
#!sh
143
cd libosmo-abis
144
autoreconf -i
145
./configure
146
(sometimes it is necessary to point to different .../lib/pkgconfig/ path: PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/ ./configure .....)
147
make
148
sudo make install
149
sudo ldconfig
150
cd ..
151
}}}
152
153
==== libosmo-netif ====
154
155
This package is dependency of OsmoNITB.
156
157
{{{
158
#!sh
159
git clone git://git.osmocom.org/libosmo-netif.git
160
cd libosmo-netif/
161
autoreconf -i
162
./configure
163
make
164
sudo make install
165
sudo ldconfig
166
cd ..
167
}}}
168
169
=== OsmoNITB ===
170
171
The latest version can downloaded via git:
172
173
{{{git clone git://git.osmocom.org/openbsc.git}}}
174
175
Finish the installation:
176
177
{{{
178
#!sh
179
cd openbsc/openbsc/
180
autoreconf -i
181
./configure
182
make
183
sudo make install
184
cd ../..
185
}}}
186
187
=== OsmoBTS ===
188
189
The latest version can downloaded via git:
190
191
{{{git clone git://git.osmocom.org/osmo-bts.git}}}
192
193
Finish the installation:
194
195
{{{
196
#!sh
197
cd osmo-bts
198
autoreconf -i
199
./configure --enable-trx
200
make
201
sudo make install
202
cd ..
203
}}}
204
205 2 fixeria
=== Basic configuration ===
206 1 fixeria
207
Now wee need to configure OpenBSC and OsmoBTS to work together with CalypsoBTS.
208
209
{{{
210
#!sh
211
# Create the configuration folder if it isn't exist yet
212
mkdir ~/.osmocom
213
214
cd ~/.osmocom
215
touch ~/.osmocom/open-bsc.cfg
216
touch ~/.osmocom/osmo-bts.cfg
217
}}}
218
219
Then init default configuration:
220
221
{{{
222
#!sh
223
# Run OpenBSC
224
osmo-nitb -c ~/.osmocom/open-bsc.cfg -l ~/.osmocom/hlr.sqlite3 -P -C --debug=DRLL:DCC:DMM:DRR:DRSL:DNM
225
226
# In another terminal
227
telnet localhost 4242
228
en
229
write file
230
exit
231
232
# Kill OpenBSC
233
Ctrl + C
234
}}}
235
236
Configure OsmoBTS manually:
237
238
{{{
239
bts 0
240
 band DCS1800
241
 ipa unit-id 1801 0
242
 oml remote-ip 127.0.0.1
243
 rtp jitter-buffer 0
244
 paging queue-size 200
245
 paging lifetime 0
246
 fn-advance 30
247
 ms-power-loop -60
248
 timing-advance-loop
249
 settsc
250
 setbsic
251
 trx 0
252
  rxgain 0
253
  power 0
254
  slotmask 1 0 0 0 0 0 0 0
255
}}}
256
257
**NOTE: "ms-power-loop" at osmo-bts.cfg should be set to -65, in order to prevent saturating the input. Also if the phone is only one or few meters away, "ms max power" should be set to 0. In case of long distance test it can be set to 30 (DCS) or 33 (GSM 900).**
258
259 2 fixeria
In case of one phone as TRX only one timeslot will be available for OsmoBTS. This is enough for basic network functionality including Location Update, SMS and USSD support. For the voice calls support you need one more phone serving a TCH channel. In case of two phones change slotmask to:
260 1 fixeria
261
{{{slotmask 1 1 0 0 0 0 0 0}}}
262
263 2 fixeria
Now find and change following initial config parameters of OpenBSC:
264 1 fixeria
265
{{{
266
# In network section
267
network country code <MNC (for test use 001)>
268
mobile network code <MCC (for test use 01)>
269
short name <NAME>
270
long name <NAME>
271
272
# In trx[0] section
273
arfcn <your BTS ARFCN (see note)>
274
}}}
275
276
'''Warning:''' Only use an ARFCN you have a '''valid license''' for.
277
278 2 fixeria
For other configuration parameters description, see [http://openbsc.osmocom.org/trac/wiki/osmo-nitb_VTY OpenBSC VTY reference].
279
280
=== Voice calls support ===
281
By default NiTB has built-in voice call routing support. In this case you need at least one timeslot serving TCH/H or TCH/F. If you do a call from one phone to another, you will need one channel for each phone. However, it is possible to allow two traffic channels on a single timeslot. To do this configure second timeslot (TS1) as TCH/H at open-bsc.cnf:
282
283
{{{
284
...
285
trx 0
286
   rf_locked 0
287
   arfcn <ARFCN>
288
   nominal power 23
289
   max_power_red 0
290
   rsl e1 tei 0
291
   timeslot 0
292
    phys_chan_config CCCH+SDCCH4
293
    hopping enabled 0
294
   timeslot 1
295
    phys_chan_config TCH/H
296
    hopping enabled 0
297
    ...
298
299
mncc-int
300
 default-codec tch-f amr
301
 default-codec tch-h amr
302
...
303
}}}
304
305
=== LCR (optional) ===
306
If you want to manage/route calls outside of NiTB, you can replace internal call control by [http://isdn.eversberg.eu/ Linux Call Router].
307
308
==== opencore-amr ====
309
This package installs GSM adaptive multirate codecs and the EFR codec. The Full-Rate and Half-Rate codecs are included in LCR's repository.
310
311
It can downloaded at [http://sourceforge.net/projects/opencore-amr/files/opencore-amr/].
312
313
{{{
314
#!sh
315
tar xvzf opencore-amr-x.x.x.tar.gz
316
cd opencore-amr-x.x.x
317
./configure
318
make
319
sudo make install
320
sudo ldconfig
321
cd ..
322
}}}
323
324
==== Sip-Sofia ====
325
326
This package installs the open source SIP stack of Nokia Research Center.
327
328
It can downloaded at [http://sourceforge.net/projects/sofia-sip/files/sofia-sip/].
329
330
{{{
331
#!sh
332
tar xvzf sofia-sip-x.xx.xx.tar.gz
333
cd sofia-sip-x.xx.xx
334
./configure
335
make
336
sudo make install
337
sudo ldconfig
338
cd ..
339
}}}
340
341
==== LCR ====
342
343
This package installs the open source PBX software to bridge ISDN (DSS1) / SIP / GSM (MNCC protocol).
344
345
The latest version can downloaded via git:
346
347
{{{git clone git://git.misdn.eu/lcr.git}}}
348
349
Now configure, as described here:
350
351
{{{
352
#!sh
353
cd lcr
354
autoreconf -i
355
./configure --with-sip --with-gsm-bs --with-gsm-ms
356
}}}
357
358
Please note, that Half-Rate codec (--enable-gsmhr) codec is so slow, that only one or two calls may occupy CPU completely. So avoid it's usage except for testing.
359
360
Sometimes it is necessary to point to different pkgconfig path, because your distribution may use other pkgconfig path than the default path of the packages above. Use the following prefix:
361
362
{{{PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/ ./configure .....}}}
363
364
The configure result should include:
365
366
{{{
367
configure: Compiled with GSM network side support 
368
configure: Compiled with GSM mobile side support
369
configure: Compiled with GSM AMR codec support
370
configure: Compiled with SIP support
371
}}}
372
373
Finish the installation:
374
375
{{{
376
#!sh
377
make
378
sudo make install
379
sudo ldconfig
380
cd ..
381
}}}
382
383
=== LCR configuration (optional) ===
384
385
==== options.conf ====
386
387
{{{edit /usr/local/etc/lcr/options.conf}}}
388
389
Add a line to show logging to the console:
390
391
{{{debug 0x100000}}}
392
393
==== interface.conf ====
394
395
The simplest configuration uses only the GSM interface. It allows LCR to forward calls from GSM to GSM or from GSM to a call test feature. 
396
397
{{{edit /usr/local/etc/lcr/interface.conf}}}
398
399
You can remove (or comment out) everything and just add this interface:
400
401
{{{
402
[gsm]
403
gsm-bs
404
tones yes
405
earlyb no
406
extern
407
}}}
408
409
==== routing.conf ====
410
411
{{{edit /usr/local/etc/lcr/routing.conf}}}
412
413
You can remove (or comment out) everything and just add these rulesets:
414
415
{{{
416
# All calls from interface 'gsm' are forwarded to rule set 'gsm'.
417
[main]
418
interface=gsm                           : goto ruleset=gsm
419
                                        : disconnect cause=31
420
421
# All calls that dial '99' prefix, will be test calls. All other calls will be forwarded back to 'gsm' interface.
422
[gsm]
423
dialing=99                              : test
424
                                        : extern interfaces=gsm
425
}}}
426
427
== Running ==
428
429
I suggest to have one shell for every process to run, rather than stating all processes as daemon from one shell. Not starting as daemon allows to easily see the debugging output.
430
431
==== 1. Transceiver ====
432
433
First load the TRX firmware. In case of one phone:
434
435
{{{
436
#!sh
437
# Shell #1
438
cd trx/src/
439
sudo host/osmocon/osmocon -m c123xor -p /dev/ttyUSB0 -c target/firmware/board/compal_e88/trx.highram.bin -r 99
440
441
# Shell #2
442
cd trx/src/host/layer23/src/transceiver/
443
sudo ./transceiver -a <ARFCN to sync> -r 99
444
}}}
445
446
In case of two phones you should run two osmocon applications:
447
448
{{{
449
#!sh
450
# Shell #1
451
cd trx/src/
452
sudo host/osmocon/osmocon -m c123xor -p /dev/ttyUSB0 -s /tmp/osmocom_l2 -c target/firmware/board/compal_e88/trx.highram.bin -r 99
453
454
# Shell #2
455
cd trx/src/
456
sudo host/osmocon/osmocon -m c123xor -p /dev/ttyUSB1 -s /tmp/osmocom_l2.2 -c target/firmware/board/compal_e88/trx.highram.bin -r 99
457
458
# Shell #3
459
cd trx/src/host/layer23/src/transceiver/
460
sudo ./transceiver -a <ARFCN> -2 -r 99
461
}}}
462
463
Make sure that transceiver successfully synchronized to the clock source BTS.
464
465
==== 2. OpenBSC ====
466
467
Open another shell and start OpenBSC:
468
469
{{{osmo-nitb -c ~/.osmocom/open-bsc.cfg -l ~/.osmocom/hlr.sqlite3 -P -C --debug=DRLL:DCC:DMM:DRR:DRSL:DNM}}}
470
471
OpenBSC runs as a stand-alone network with given config file and data base. In order to use LCR, add '-m' option. In this case the LCR replaces the built-in call control.
472
473
{{{osmo-nitb -c ~/.osmocom/open-bsc.cfg -l ~/.osmocom/hlr.sqlite3 -P -m -C --debug=DRLL:DCC:DMM:DRR:DRSL:DNM}}}
474
475
Very important is the option '-C'. On certain machines, osmo-nitb will halt from time to time while writing counters to database. This Without this option, audio might interrupt several seconds from time to time.
476
477
The debugging is useful for early tests, because you will quickly see what happens if a mobile requests something.
478
479
{{{
480
<0005> bsc_init.c:423 
481
WARNING: You are running an 'accept-all' network on a BTS that is not barred. This configuration is
482
likely to interfere with production GSM networks and should only be used in a RF shielded environment 
483
such as a faraday cage!
484
485
<001a> input/ipaccess.c:831 enabling ipaccess BSC mode
486
DB: Database initialized.
487
DB: Database prepared.
488
}}}
489
490
==== 2.1 LCR (optional) ====
491
492
Start the LCR:
493
494
{{{
495
#!sh
496
sudo lcr start
497
}}}
498
499
You should see following output:
500
501
{{{
502
** LCR  Version 1.14
503
504
000000 DEBUG (in sip.cpp/sip_init() line 1997): SIP globals initialized
505
LCR 1.14 started, waiting for calls...
506
000000 TRACE 05.02.16 00:05:03.444 --: LCR 1.14 started, waiting for calls...
507
}}}
508
509
And following message at OpenBSC log:
510
511
{{{
512
<0006> mncc_sock.c:273 MNCC Socket has connection with external call control application
513
}}}
514
515
==== 3. OsmoBTS ====
516
517
And finally start the OsmoBTS instance:
518
519
{{{sudo osmobts-trx -c ~/.osmocom/osmo-bts.cfg -r 99}}}
520
521
{{{
522
((*))
523
  |
524
 / \ OsmoBTS
525
Using MAC address of eth0: 'xx:xx:xx:xx:xx:xx'
526
...
527
<000a> trx_if.c:176 No response from tranceiver
528
<000a> trx_if.c:176 No response from tranceiver
529
<000a> trx_if.c:176 No response from tranceiver
530
}}}
531
532
== Test ==
533
534
=== Location Updating ===
535
536
Switch on the phone.
537
538
If you have a SIM card for your network MCC/MNC, you can use it and do automatic network search. If not, do a manual network and select this network. You should see debugging output on OpenBSC like this:
539
540
{{{
541
...
542
 <0002> gsm_04_08.c:424 -> LOCATION UPDATE ACCEPT
543
...
544
}}}
545
546
=== USSD ===
547
548
Request {{{*#100#}}} to know which number associated with your IMSI.
549
550
=== Call the music (LCR required) ===
551
552
Now enter phone number 995 to select the test function 5 of LCR. This test function just plays the hold music.
553
554
=== Echo and BFI test (LCR required) ===
555
556
Enter phone number 993 to select the test function 3 of LCR. This test function echoes back everything that is received. Note that it will re-transcode the speech data, so the audio from your voice is compressed and decompressed twice until you can hear a fraction of a second later.
557
558
You may experience short beeps. These beeps represent all bad frames that could not be decoded or got lost over the air. (Without this test, the missing frames will be extrapolated from previous frame, so some loss rate will not be recognized by the remote end.)
559
560
== VTY control interface ==
561
562
It is possible (of course) to control your working setup manually. Connect the OpenBSC VTY telnet interface (port 4242 by default):
563
564
{{{
565
telnet localhost 4242
566
en
567
568
# Type 'list' for help
569
# Go to 'configure terminal' if you want to change some configuration params
570
571
OpenBSC#
572
  help        Description of the interactive help system
573
  list        Print command list
574
  write       Write running configuration to memory, network, or terminal
575
  show        Show running system information
576
  exit        Exit current mode and down to previous mode
577
  disable     Turn off privileged mode command
578
  configure   Configuration from vty interface
579
  copy        Copy configuration
580
  terminal    Set terminal line parameters
581
  who         Display who is on vty
582
  logging     Configure log message to this terminal
583
  drop        Debug/Simulation command to drop Abis/IP BTS
584
  bts         BTS related commands
585
  sms         SMS related comamnds
586
  subscriber  Operations on a Subscriber
587
  sms-queue   SMS Queue
588
  meas-feed   Measurement export related
589
590
# Example: sending an SMS
591
subscriber imsi <IMSI> sms sender imsi <IMSI2> send Hello, world!
592
}}}
593
594
See [http://openbsc.osmocom.org/trac/wiki/osmo-nitb_VTY VTY reference] for details.
595
596
= CalypsoBTS with OpenBTS =
597
598
OpenBTS is another open source software project aimed to replace legacy telecommunication protocols and traditionally complex, proprietary hardware systems by IP a flexible software architecture. It implements the BTS side protocol stack and also some core network elements like OpenBSC in NiTB mode.
599
600
=== Installation and configuration ===
601
602
Follow this [https://github.com/RangeNetworks/dev/wiki howto] in the project wiki. Once you have OpenBTS up and running, you need to change the following configuration parameters in the database (/etc/OpenBTS/OpenBTS.db):
603
604
{{{
605
Control.GSMTAP.TargetIP = 127.0.0.1
606
GSM.Radio.NeedBSIC = 1
607
GSM.Radio.Band = 1800
608
GSM.CellSelection.Neighbors =   (set to empty string)
609
GSM.RACH.MaxRetrans = 3
610
GSM.RACH.TxInteger = 8
611
GSM.Radio.C0 = <your ARFCN>
612
Control.LUR.OpenRegistration = ^26242.*$ (see note)
613
}}}
614
615
**Note:** in this example only IMSIs with MCC 262 and the MNC 42 will be allowed to register to the network, change that accordingly.
616
617
=== TRX executable ===
618
619
Make sure that OpenBTS in not running. In the folder where the OpenBTS executable resides, create a script with the filename 'transceiver' with the following content:
620
621
{{{
622
#!/bin/bash
623
exec <your path to osmocom-bb>/src/host/layer23/src/transceiver/transceiver -a <ARFCN> -r 99
624
}}}
625
626
Where ARFCN is the channel of clock source cell.
627
And make it executable:
628
629
{{{
630
#!sh
631
sudo chmod +x transceiver
632
}}}
633
634
== Running ==
635
636
Run TRX application on the phone as described above.
637
638
You now can start up OpenBTS and should hopefully see the BTS by performing a manual network search with your phone. Monitor the output of osmocon and the transceiver/OpenBTS to see if all goes well. If anything should fail, reboot the phone and start over. 
639
640
The OpenBTS CLI allows you to monitor system status and change many operating parameters of OpenBTS and the Transceiver in real time. Its executable is located at /OpenBTS/OpenBTSCLI.
641
642
Have a fun!
Add picture from clipboard (Maximum size: 48.8 MB)