UBports Robot Logo UBports Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Register
    • Login

    [TIP] MMS behind Wifi

    Scheduled Pinned Locked Moved Off topic
    1 Posts 1 Posters 36 Views 1 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
      Reply
      • Reply as topic
      Log in to reply
      This topic has been deleted. Only users with topic management privileges can see it.
      • G Offline
        gpatel-fr
        last edited by

        Hello

        this is a little hack I have done to be able to send/receive MMS on my FP5 running 24.04.1.1 stable. Skills needed: some terminal experience, use of editor, sudo, basic networking knowledge, be able to read the system journal. If you are a total newbie in Linux, it may be better to abstain to attempt the following.

        Note that if your phone supports 2 cellular links, mine does not and so I have no idea if it will work in your case.

        Preliminary: find if your system behaves like mine by running the (very slow) command:

        journalctl | grep lomiri-download-manager | grep TimeoutError
        

        if you find lines looking like this:

        janv. 05 18:49:27 ubuntu-phablet lomiri-download-manager[21916]: E20260105 18:49:27.165113 21916 file_download.cpp:527]  Download ID{ 03d5e06553d8471085141080bcff97a1 }  http://213.228.3.45/mms.php?uZmaWepeEfC3hAAmufq69A ERROR::Network error TimeoutError: the connection to the remote server timed out
        

        then the problem is that the provider is blocking access to its network (here 213.228.3.0/24) when not accessing it from the cellular link (their own network). In this case, the following hack could apply to you.

        First step: add to the system the capability to change the network manager configuration.

        cat /etc/systemd/system/etc-NetworkManager-dispatcher.d.mount 
        [Unit]
        Description=Mount unit for etc/NetworkManager/dispatcher.d
        DefaultDependencies=no
        Requires=system.slice dev-sda17.device -.mount
        Conflicts=umount.target
        Before=umount.target local-fs.target
        Before=network-pre.service
        Wants=network-pre.service
        
        [Mount]
        Where=/etc/NetworkManager/dispatcher.d
        What=/userdata/system-data/etc/NetworkManager/dispatcher.d
        Options=rw,relatime,upperdir=/userdata/system-data/etc/NetworkManager/dispatcher.d,lowerdir=/etc/NetworkManager/dispatcher.d,workdir=/userdata/system-data/tmp
        Type=overlay
        
        [Install]
        WantedBy=network.target
        

        create this file with sudo.

        then:

        sudo mkdir -P /userdata/system-data/etc/NetworkManager/dispatcher.d
        sudo mkdir /userdata/system-data/tmp
        

        then add in our dispatcher.d directory the file that will call our script:

        cat /userdata/system-data/etc/NetworkManager/dispatcher.d/99routechange 
        #!/bin/sh -e
        
        interface=$1
        status=$2
        
        #logger "99routechange: ($interface): $status"
        
        /usr/bin/python3 /home/phablet/bat/networkchange.py $interface $status
        
        

        (you will have to create the preceding file using sudo of course)

        create our work directory

        mkdir ~/bat
        

        create the script that will ask to the system the network configuration when a change is detected and run the commands adding the necessary routes to the provider:

        cat ~/bat/networkchange.py 
        
        import os
        import subprocess
        import sys
        
        DEFAULT_ROUTE = 'default via'
        
        if __name__ == '__main__':
            interface = sys.argv[1]
            status = sys.argv[2]
            with open('/home/phablet/bat/status_network.txt', 'w') as f:
                f.write(f'network {interface} : {status}')
            with subprocess.Popen(['ip', 'route'], stdout=subprocess.PIPE,  universal_newlines=True) as ipr:
                lines = ipr.communicate()[0].splitlines()
                lig1 = lines[0]
                lig2 = lines[1]
                lig3 = lines[2]
                if lig1.startswith(DEFAULT_ROUTE) and lig2.startswith(DEFAULT_ROUTE) and not lig3.startswith(DEFAULT_ROUTE):
                    if lig1.find('wlan') != -1:
                        idx = lig2.find(' dev ') + 5
                        cellular_interface = lig2[idx:][0:lig2[idx+1:].find(' ')+1]
                        with open('/home/phablet/bat/cmd_to_run', 'r') as f:
                            lines = f.readlines()
                            with open('/home/phablet/bat/status_network.txt', 'w+') as flog:
                                for l in lines:
                                    new_line = l.replace('{cellular_interface}', cellular_interface)
                                    flog.write(new_line)
                                    os.system(new_line)
        
        

        then add the specific to your configuration route commands, example for my case follows:

         cat /home/phablet/bat/cmd_to_run 
        # cellular_interface is replaced by the caller
        ip route add 213.228.2.0/24 dev {cellular_interface} proto static metric 100
        ip route add 213.228.3.0/24 dev {cellular_interface} proto static metric 100
        # this is the address for mms.free.fr
        ip route add 212.27.40.0/24 dev {cellular_interface} proto static metric 100
        

        Please note that these IP addresses will not be correct unless you happen to use Freemobile (my provider). Otherwise, you will have to replace the IP addresses in the first lines by the specific addresses for your provider that you will find by using

        journalctl | grep lomiri-download-manager | grep TimeoutError
        
        

        Note that you may have to add more lines if your provider has many networks used.
        Also, do NOT add addresses server by server, use network ranges (here /24 means 256 consecutive IP addresses) else you will spend your life trying to cover all the servers used by your provider. In the case of Freemobile, at the moment Free seems to use 2 /24 ranges. Maybe there are some that have escaped me.

        and for mms sending, for my provider the dns name for the server is found in the cellular config, you will find the IP address by using dig:

        dig mms.free.fr
        

        (replace 'mms.free.fr' by the name of your provider mms server)

        It's possible that the configuration may be different for your provider.

        Note: you MUST use IP addresses, the symbolic names will NOT work; for my use here I replace mms.free.fr by 212.27.40.0/24.
        It's quite possible that your provider uses also symbolic names (not raw IP addresses like Freemobie) for downloading MMS, in this case you should also find an appropriate IP range using dig like I did for uploading.

        Finally, enable the whole systemd configuration.

        sudo systemctl daemon-reload
        sudo systemctl enable etc-NetworkManager-dispatcher.d.mount 
        sudo systemctl start etc-NetworkManager-dispatcher.d.mount 
        

        and you should be able to send/receive mms when wifi is activated.

        I hope I did not forget anything.

        Note that testing has been minimal 🙂 but the main risk is that it will not work.

        The configuration resists reboots.

        When this merge-request will land and be added to the stable release you use, then you will be able to disable this hack, that you will do by running

        sudo systemctl stop etc-NetworkManager-dispatcher.d.mount 
        sudo systemctl disable etc-NetworkManager-dispatcher.d.mount 
        sudo rm /etc/systemd/system/etc-NetworkManager-dispatcher.d.mount
        sudo systemctl daemon-reload
        

        Until then, happy MMS with wifi enabled !

        1 Reply Last reply Reply Quote 2
        • First post
          Last post