Piero V.

VoIP Fastweb, NAT e 403 Forbidden

TL; DR

Fastweb si aspetta il vostro IP pubblico anche nei messaggi SIP (ad esempio, nel campo From).

Quindi, se il dispositivo su cui gestite il VoIP si trova dietro NAT, dovete trovare il modo per configurarlo in modo che riporti l’indirizzo assegnatovi da Fastweb.

Nel mio ATA Grandstream, il campo da popolare si chiama Use NAT IP.

Per una configurazione Asterisk, bisogna aggiungere un paio di impostazioni al transport (in pjsip.conf):

[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0
local_net=10.0.0.0/8
local_net=172.16.0.0/12
external_media_address=12.34.56.78
external_signaling_address=12.34.56.78

Questo dovrebbe risolvere i 403 Forbidden quando provate a fare delle chiamate. Un sintomo dello stesso problema è che la registrazione avviene con successo, ma le chiamate non funzionano. Un errore di autenticazione (password incorretta, per esempio) restituirebbe un 401 Unauthorized, quindi dovrebbe manifestarsi in maniera diversa anche in eventuali log e/o UI.

Inoltre, potrebbe servirvi una qualche forma di keep-alive (a meno di non aprire una porta sul vostro firewall), altrimenti dopo un po’ di tempo il vostro numero potrebbe diventare irraggiungibile. … [Leggi il resto]

Sono passato a Fastweb

Dopo numerosi anni, ho cambiato ISP.

Da tempo mi ero stufato di TIM. Ogni volta che ho avuto bisogno di assistenza sono diventato matto. Inoltre prevedono aumenti di tariffe automatici e ingiustificati. Un’operatrice una volta mi ha detto che per loro sta al cliente di accorgersi della scadenza di un’offerta e chiamarli per riceverne una nuova.

Non stavo cercando attivamente un’alternativa, ma da diverso tempo ne stavo tenendo alcune sott’occhio. Il mio requisito essenziale è che non voglio (anzi, più probabilmente posso) rinunciare all’indirizzo IP pubblico. Aggiungerei anche la portabilità del numero VoIP tra le necessità.

Invece dei plus ben graditi sono il modem libero o al più in comodato d’uso gratuito, il prezzo bloccato, l’assenza di penali nascoste per il cambio di operatore e l’assenza di costi di attivazione (in quest’ordine).

L’offerta di Fastweb

Ad un certo punto mi sono imbattuto in un promotore Fastweb e ho deciso di dare loro un’opportunità.

Fastweb è nota per offrire indirizzi in NAT, ma il venditore mi ha promesso che sarebbe stato possibile averne uno pubblico in maniera gratuita (al che io ho risposto che avrei usato il mio diritto di recesso nel caso non fosse stato così). … [Leggi il resto]

Heterogeneous comparisons in C++ containers

Occasionally, I still work with my Intel RealSense, on my RGBD toolbox, and affine topics.

Recently, I decided to allow multiple formats for the color images (initially, I had hardcoded them to JPEG only).

Therefore, I had to modify my data structures to work with pairs of paths instead of their common stems.

The UI to add new frames to the scene lists all the valid frames once and puts them into an ordered std::set, now keyed on the path pair.

With my previous assumption on fixed formats, I could do lookups on the set to quickly check if a provided stem was valid.

After the changes, this involved a heterogeneous comparison, i.e., a comparison of different types.

The trivial way to do this is a linear search, e.g., with std::find and a lambda or a range-based for.

However, this seemed a frequent case to me, and I was curious to see if there was a way to still take advantage of the optimized algorithms provided by the containers.

Indeed, there is! But it was added only since C++14.

After implementing bool operator<(const Other &, const Key &), you can pass std::less<> as a comparator to your container instead of the default std::less<Key>.

That is a particular template specialization that was developed for this purpose. It contains an is_transparent type that enables the templated version of some methods in STL containers.

This stack overflow answer contains many details. A TL; DR is that this implementation avoids unwanted conversions that could have undesired effects (e.g., the continuous creation of temporary objects from literals).

Komplete Audio 6 and DPC_WATCHDOG_VIOLATION

TL; DR

Connect your sound card to a USB hub with an external power supply.

The long story

A few months ago I changed my computer. The new one is high-end: it has a Ryzen 9 7950X processor and an Nvidia RTX 3080 GPU. Finding a motherboard was not easy: all the models compatible with that processor have a lot of compromises (or prohibitive costs). Eventually, I took an ASRock B650 PG Lightning with its pros and cons.

Everything is powered by a BitFenix Whisper 850W PSU, which has good reviews on many specialized sites.

The system is very stable with Linux: it can sustain several Firefox builds consecutively for hours without batting an eye.

Sadly, I cannot say the same for Windows, which I use almost exclusively for playing games. I often had blue screens of death with the DPC_WATCHDOG_VIOLATION error.

When I analyzed the dumps with WinDBG, I noticed the Komplete Audio 6 driver was always in the stack trace when this happened.

I tried to contact Native Instruments for help, but they were super unhelpful. I even asked them to make the driver open source since it is an old product they do not care about anymore. … [Leggi il resto]

Some tricks with range-diff

The workflows we use for Tor Browser are kinda peculiar.

When you manage a fork, you need a strategy to stay updated with upstream. We create a new branch for every new Firefox release and cherry-pick our previous commits on top of it.

The advantage over merging is that our patches always stay in a single and compact block of commits. So, it is trivial to tell our commits from upstream, and users can easily verify we do not modify Firefox outside those commits (we keep the commit hashes of gecko-dev, the official GitHub mirror of Mozilla's mercurial repositories).

There are also disadvantages: keeping fewer commits helps with this workflow. Therefore, our commits have a meaning of “feature”, not of “change”. Thus, we constantly update them, and the history of a patch becomes hard to follow.

And most importantly, this workflow requires frequent rebases, with the risk of losing some changes. To mitigate it, every new branch goes through a review process before we switch to it.

The main tools we use are git range-diff to check single commits and “diff-of-diffs” to check the patch set as a whole. … [Leggi il resto]