FRITZ!OS7 openvpn auf 7590 => kein tun Modul

Wow vielen Dank PeterPawn. Ich bin noch bis zum 23.12 im Urlaub und werde den Patch danach auf einer 7590 testen und Rückmeldung geben.

Und bei deiner 7590 wird es ein anderes Ergebnis geben weil??? Ich hatte doch schon längst Feedback gegeben!
 
Dann müßte man mal wissen, was konkret das Problem beim Crash ist ... wenn da weiterhin das "BUG_ON" als Ursache angeführt wird, stimmt wohl irgendetwas mit dem Patch nicht.

Normalerweise sieht das am Anfang beider Funktionen so aus:
Code:
00000000 <__netif_receive_skb>:
   0:   00801021        move    v0,a0
   4:   8c830010        lw      v1,16(a0)
   8:   00030336        tne     zero,v1,0xc
   c:   3c030000        lui     v1,0x0
  10:   8c630000        lw      v1,0(v1)
  14:   5460000a        bnezl   v1,40 <__netif_receive_skb+0x40>
  18:   8c830084        lw      v1,132(a0)
  1c:   00002821        move    a1,zero
  20:   08000000        j       0 <__netif_receive_skb>
  24:   00402021        move    a0,v0
Code:
00000000 <netif_receive_skb>:
   0:   27bdffd0        addiu   sp,sp,-48
   4:   afb00028        sw      s0,40(sp)
   8:   afbf002c        sw      ra,44(sp)
   c:   00808021        move    s0,a0
  10:   8c820010        lw      v0,16(a0)
  14:   00020336        tne     zero,v0,0xc
  18:   3c020000        lui     v0,0x0
  1c:   8c420018        lw      v0,24(v0)
  20:   1440000f        bnez    v0,60 <netif_receive_skb+0x60>
, wobei sich das "sk"-Feld an der Verschiebung 16 in der "skbuff"-Struktur befindet.

Im MIPS-ABI wird der erste Parameter (bei beiden Funktionen ist das die Adresse des "skbuff") in Register a0 übergeben ... das Laden eines Registers von "16(a0)" ist also offensichtlich auch die Umsetzung von "skbuff->sk" als Pointer.

Danach kommen dann (in beiden Fällen) die TNE-Instruktionen ... und die werden (nach der Anzeige zumindest) auch erfolgreich weggepatcht.

Was passiert denn, wenn man das Skript (in einer anderen Shell-Session) erneut aufruft? Dann sollte es an denselben Adressen nur noch die NOPs sehen ... wenn es dann doch noch zur Auslösung der Traps kommt (dann wäre das BUG_ON-Statement im Traceback der Gescholtene im Crash-Log), kann das fast nur noch ein COW-Problem sein.

Dabei würde nur der ändernde Prozess einen anderen Inhalt in der Speicherseite sehen (man kann das auch selbst mit "devmem 0x80A62490 32" kontrollieren, was da im Speicher steht) und alle anderen weiterhin den alten Inhalt ... käme mir aber komisch vor.

Ansonsten bin ich wieder bei der oben getroffenen Feststellung, daß die "Nebenwirkungen" nicht wirklich erforscht wurden ... die könnten bei den GRX-Boxen noch andere sein, als bei der 7490. Wenn sich jemand finden sollte, der das mal mit einer 7490 (ohne "replace kernel") testet, wäre ich dankbar ... klappt es da auch nicht, ist der Ansatz Schrott (und ich verstehe nicht, warum das so sein sollte). Funktioniert es dort, kann es bei den GRX-Boxen durchaus Besonderheiten geben (bei den ganzen Hardware-Unterstützungen - bis hin zum "Central Buffer Manager" (CBM) für die Netzwerk-Buffer), die AVM letzten Endes dazu veranlaßt haben, das einzubauen und es auch bei den VR9-Boxen drin zu lassen, weil auch da "später" in die Verarbeitungskette erst eingesprungen wird und es damit nichts schadet (bei AVM zumindest).
 
@PeterPawn:
  • habe es nicht geschafft, was sinnvolles per Mail zu antworten, sorry
  • allein die BUG_ON's rauszupatchen reicht nicht aus. Es sei nochmal auf den goto drop-Teil hingewiesen, der muss auch raus.
 
Drei Beiträge zusammengefügt:

-------------------------------------------------------------------------------------------------

OK, den hatte ich nicht auf dem Schirm ... ich schaue es mir mal an, was für die dritte Stelle noch zu patchen wäre.

Wenn @Whoopie zwischendrin noch das Crash-Log findet und da nicht länger das erste "BUG_ON"-Statement "blamed" wird, wäre das immerhin ein Zeichen dafür, daß es sich lohnt, an dieser Stelle weiterzumachen.

EDIT:
An der dritten Stelle sieht der Code dann so aus:
Code:
00000000 <ip_forward>:
   0:   27bdffc8        addiu   sp,sp,-56
   4:   afb00024        sw      s0,36(sp)
   8:   afbf0034        sw      ra,52(sp)
   c:   afb30030        sw      s3,48(sp)
  10:   afb2002c        sw      s2,44(sp)
  14:   afb10028        sw      s1,40(sp)
  18:   8c820010        lw      v0,16(a0)
  1c:   14400058        bnez    v0,180 <ip_forward+0x180>
  20:   00808021        move    s0,a0
  24:   8c820058        lw      v0,88(a0)
Entscheidend ist wieder die siebte und achte Instruktion, nur daß hier eben keine Trap ausgelöst wird, sondern zu einer anderen Adresse gesprungen wird.

Nun sind solche Sprünge bedeutend schlechter (automatisch) zu finden, weil es zu viele unterschiedliche Operationen gibt und Sprünge zu häufig auftreten.

Ich werde also hingehen und hier das
Code:
  18:   8c820010        lw      v0,16(a0)
durch das direkte Laden von v0 aus zero ersetzen, weil das beim nachfolgenden, bedingten Sprung (der nur ausgeführt wird, wenn der Inhalt von "v0" nicht 0 ist - branch on not equal zero) dann dazu führt, daß die Verzweigung nicht stattfindet. Diese "lw"-Instruktion ist dann auch wieder einigermaßen eindeutig zu lokalisieren, wenn die anderen Operanden (lade v0 mit dem Wort an Offset 16 zur Adresse in a0) bekannt sind.

Dauert etwas ... ich will das zumindest wieder gegen doppelte Aufrufe absichern und dazu auf 7490 und 7580 testen.

-------------------------------------------------------------------------------------------------

Ich habe das jetzt mal für die 7490 eingecheckt: https://github.com/PeterPawn/YourFritz/blob/master/patch_kernel/patch_kernel_VR9_skbuff_sk_checks

Das Skript funktioniert nur auf den Boxen, die in Zeile 5 mit ihren "HWRevision"-Werten aufgeführt sind - wer das außerhalb der 7490 testen will, muß also erst mal selbst die Liste ergänzen. Ich gehe zwar davon aus, daß die VR9-Kernel alle dieselben Assembler-Instruktionen an diesen Stellen haben, aber ich weiß es nicht ... daher meinerseits die Beschränkung auf die 7490, für die ich es selbst (mit dem AVM-Kernel für die 07.01) testen konnte.

Bei der 7580 steht an dieser Stelle (in "ip_forward()" am Beginn) aber eine deutlich abweichende Instruktionsfolge, die ich mir erst mal in Ruhe ansehen muß - daher für die 7490 wieder mal ein "erster Wurf". Die Schleife ist jetzt auch (absichtlich) doppelt vorhanden ... Optimierungen machen erst in einem C-Programm irgendeinen Sinn.

-------------------------------------------------------------------------------------------------

Die Annahme, daß der Code bei VR9- und GRX-Boxen identisch wäre, ist schon mal falsch ... ich hätte einfach mal vorher nachsehen sollen:
Code:
peh@vidar:~> diff -u /home/FritzBox/FB7590/GPL/linux/net/ipv4/ip_forward.c /home/FritzBox/FB7490/firmware/GPL_07.01/linux-3.10/net/ipv4/ip_forward.c
--- /home/FritzBox/FB7590/GPL/linux/net/ipv4/ip_forward.c       2018-08-30 14:14:19.000000000 +0200
+++ /home/FritzBox/FB7490/firmware/GPL_07.01/linux-3.10/net/ipv4/ip_forward.c   2018-07-26 14:01:40.000000000 +0200
@@ -38,10 +38,6 @@
 #include <linux/route.h>
 #include <net/route.h>
 #include <net/xfrm.h>
-
-#ifdef CONFIG_AVM_PA
-#include <linux/avm_pa.h>
-#endif

 static bool ip_may_fragment(const struct sk_buff *skb)
 {
@@ -108,7 +104,7 @@
        return ret;
 }

-static int __ipt_optimized ip_forward_finish(struct sk_buff *skb)
+static int ip_forward_finish(struct sk_buff *skb)
 {
        struct ip_options *opt  = &(IPCB(skb)->opt);

@@ -118,15 +114,17 @@
        if (unlikely(opt->optlen))
                ip_forward_options(skb);

-       if (ip_gso_exceeds_dst_mtu(skb))
-               return ip_forward_finish_gso(skb);
 #ifdef CONFIG_AVM_PA
        avm_pa_mark_routed(skb);
 #endif
+
+       if (ip_gso_exceeds_dst_mtu(skb))
+               return ip_forward_finish_gso(skb);
+
        return dst_output(skb);
 }

-int __ipt_optimized ip_forward(struct sk_buff *skb)
+int ip_forward(struct sk_buff *skb)
 {
        struct iphdr *iph;      /* Our header */
        struct rtable *rt;      /* Route we use */
@@ -138,10 +136,9 @@
        if (skb_warn_if_lro(skb))
                goto drop;

-/*Policy check disabled for IPSec DS MPE accelerated traffic */
-
        if (!xfrm4_policy_check(NULL, XFRM_POLICY_FWD, skb))
                goto drop;
+
        if (IPCB(skb)->opt.router_alert && ip_call_ra_chain(skb))
                return NET_RX_SUCCESS;

@@ -189,9 +186,7 @@
            !skb_sec_path(skb))
                ip_rt_send_redirect(skb);

-#ifndef CONFIG_LANTIQ_IPQOS
        skb->priority = rt_tos2priority(iph->tos);
-#endif

        return NF_HOOK(NFPROTO_IPV4, NF_INET_FORWARD, skb, skb->dev,
                       rt->dst.dev, ip_forward_finish);
peh@vidar:~> diff -u /home/FritzBox/FB7590/GPL/linux/net/core/dev.c /home/FritzBox/FB7490/firmware/GPL_07.01/linux-3.10/net/core/dev.c
--- /home/FritzBox/FB7590/GPL/linux/net/core/dev.c      2018-08-30 14:14:19.000000000 +0200
+++ /home/FritzBox/FB7490/firmware/GPL_07.01/linux-3.10/net/core/dev.c  2018-07-26 14:01:40.000000000 +0200
@@ -72,6 +72,13 @@
  *                                     - netif_rx() feedback
  */

+/**
+ * Some part of this file is modified by Ikanos Communications.
+ *
+ * Copyright (C) 2013-2014 Ikanos Communications.
+ */
+
+
 #include <asm/uaccess.h>
 #include <linux/bitops.h>
 #include <linux/capability.h>
@@ -97,14 +104,12 @@
 #include <net/net_namespace.h>
 #include <net/sock.h>
 #include <linux/rtnetlink.h>
+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
+#include <linux/imq.h>
+#endif
 #ifdef CONFIG_AVM_PA
 #include <linux/avm_pa.h>
 #endif
-#ifdef CONFIG_AVM_SIMPLE_PROFILING
-#include <linux/avm_profile.h>
-#else
-#define avm_simple_profiling_skb(a,b) do { } while(0)
-#endif
 #include <linux/stat.h>
 #include <net/dst.h>
 #include <net/pkt_sched.h>
@@ -137,18 +142,11 @@
 #include <linux/inetdevice.h>
 #include <linux/cpu_rmap.h>
 #include <linux/static_key.h>
-#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-#include <linux/imq.h>
-#endif

 #include "net-sysfs.h"
-
-#if defined(CONFIG_LTQ_UDP_REDIRECT) || defined(CONFIG_LTQ_UDP_REDIRECT_MODULE)
-#include <net/udp.h>
-#include <linux/udp_redirect.h>
+#ifdef CONFIG_FUSIV_KERNEL_PROFILER_MODULE
+extern int loggerProfile(unsigned long event);
 #endif
-
-
 /* Instead of increasing this, you should create a hash table. */
 #define MAX_GRO_SKBS 8

@@ -160,12 +158,8 @@
 struct list_head ptype_base[PTYPE_HASH_SIZE] __read_mostly;
 struct list_head ptype_all __read_mostly;      /* Taps */
 static struct list_head offload_base __read_mostly;
-
-#ifdef CONFIG_LANTIQ_MCAST_HELPER_MODULE
-int (*mcast_helper_sig_check_update_ptr)(struct sk_buff *skb) = NULL;
-EXPORT_SYMBOL(mcast_helper_sig_check_update_ptr);
-#endif
-
+static int (*avm_recvhook)(struct sk_buff *skb);
+static int (*avm_early_recvhook)(struct sk_buff *skb);

 /*
  * The @dev_base_head list is protected by @dev_base_lock and the rtnl
@@ -191,8 +185,6 @@

 seqcount_t devnet_rename_seq;

-struct sk_buff *handle_ing(struct sk_buff *skb, struct packet_type **pt_prev,
-                                        int *ret, struct net_device *orig_dev);
 static inline void dev_base_seq_inc(struct net *net)
 {
        while (++net->dev_base_seq == 0);
@@ -360,10 +352,6 @@

 *******************************************************************************/

-#ifdef CONFIG_AVM_RECV_HOOKS
-static int (*avm_recvhook)(struct sk_buff *skb);
-static int (*avm_early_recvhook)(struct sk_buff *skb);
-
 void set_avm_recvhook(int (*recvhook)(struct sk_buff *skb))
 {
        avm_recvhook = recvhook;
@@ -375,7 +363,6 @@
        avm_early_recvhook = recvhook;
 }
 EXPORT_SYMBOL(set_avm_early_recvhook);
-#endif

 /*
  *     Add a protocol ID to the list. Now that the input handler is
@@ -699,8 +686,14 @@
 struct net_device *__dev_get_by_name(struct net *net, const char *name)
 {
        struct net_device *dev;
-       struct hlist_head *head = dev_name_hash(net, name);
+       struct hlist_head *head;

+#if defined(CONFIG_IFX_PPA_API) || defined(CONFIG_IFX_PPA_API_MODULE)
+       if (net == NULL) {
+               net = &init_net;
+       }
+#endif
+    head = dev_name_hash(net, name);
        hlist_for_each_entry(dev, head, name_hlist)
                if (!strncmp(dev->name, name, IFNAMSIZ))
                        return dev;
@@ -1601,37 +1594,59 @@

 static struct static_key netstamp_needed __read_mostly;
 #ifdef HAVE_JUMP_LABEL
-/* We are not allowed to call static_key_slow_dec() from irq context
- * If net_disable_timestamp() is called from irq context, defer the
- * static_key_slow_dec() calls.
- */
 static atomic_t netstamp_needed_deferred;
+static atomic_t netstamp_wanted;
+static void netstamp_clear(struct work_struct *work)
+{
+       int deferred = atomic_xchg(&netstamp_needed_deferred, 0);
+       int wanted;
+
+       wanted = atomic_add_return(deferred, &netstamp_wanted);
+       if (wanted > 0)
+               static_key_enable(&netstamp_needed);
+       else
+               static_key_disable(&netstamp_needed);
+}
+static DECLARE_WORK(netstamp_work, netstamp_clear);
 #endif

 void net_enable_timestamp(void)
 {
 #ifdef HAVE_JUMP_LABEL
-       int deferred = atomic_xchg(&netstamp_needed_deferred, 0);
+       int wanted;

-       if (deferred) {
-               while (--deferred)
-                       static_key_slow_dec(&netstamp_needed);
-               return;
+       while (1) {
+               wanted = atomic_read(&netstamp_wanted);
+               if (wanted <= 0)
+                       break;
+               if (atomic_cmpxchg(&netstamp_wanted, wanted, wanted + 1) == wanted)
+                       return;
        }
-#endif
+       atomic_inc(&netstamp_needed_deferred);
+       schedule_work(&netstamp_work);
+#else
        static_key_slow_inc(&netstamp_needed);
+#endif
 }
 EXPORT_SYMBOL(net_enable_timestamp);

 void net_disable_timestamp(void)
 {
 #ifdef HAVE_JUMP_LABEL
-       if (in_interrupt()) {
-               atomic_inc(&netstamp_needed_deferred);
-               return;
+       int wanted;
+
+       while (1) {
+               wanted = atomic_read(&netstamp_wanted);
+               if (wanted <= 1)
+                       break;
+               if (atomic_cmpxchg(&netstamp_wanted, wanted, wanted - 1) == wanted)
+                       return;
        }
-#endif
+       atomic_dec(&netstamp_needed_deferred);
+       schedule_work(&netstamp_work);
+#else
        static_key_slow_dec(&netstamp_needed);
+#endif
 }
 EXPORT_SYMBOL(net_disable_timestamp);

@@ -1648,8 +1663,7 @@
                        __net_timestamp(SKB);           \
        }                                               \

-static inline bool is_skb_forwardable(struct net_device *dev,
-                                     struct sk_buff *skb)
+bool is_skb_forwardable(struct net_device *dev, struct sk_buff *skb)
 {
        unsigned int len;

@@ -1668,6 +1682,7 @@

        return false;
 }
+EXPORT_SYMBOL_GPL(is_skb_forwardable);

 /**
  * dev_forward_skb - loopback an skb to another netif
@@ -2276,7 +2291,7 @@
                        goto out;
        }

-       *(__sum16 *)(skb->data + offset) = csum_fold(csum);
+       *(__sum16 *)(skb->data + offset) = csum_fold(csum) ?: CSUM_MANGLED_0;
 out_set_summed:
        skb->ip_summed = CHECKSUM_NONE;
 out:
@@ -2503,9 +2518,9 @@
        if (skb->ip_summed != CHECKSUM_NONE &&
            !can_checksum_protocol(features, protocol)) {
                features &= ~NETIF_F_ALL_CSUM;
-       } else if (illegal_highdma(dev, skb)) {
-               features &= ~NETIF_F_SG;
        }
+       if (illegal_highdma(dev, skb))
+               features &= ~NETIF_F_SG;

        return features;
 }
@@ -2564,13 +2579,13 @@
        int rc = NETDEV_TX_OK;
        unsigned int skb_len;

-#ifdef CONFIG_AVM_PA
-       (void)avm_pa_dev_snoop_transmit(AVM_PA_DEVINFO(dev), skb);
-#endif
-
        if (likely(!skb->next)) {
                netdev_features_t features;

+        /* TODO: #if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE) patch
+         * left out !!!
+         */
+
                /*
                 * If device doesn't need skb->dst, release it right now while
                 * its hot in this cpu cache
@@ -2624,32 +2639,16 @@
                        }
                }

-#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-               if (!list_empty(&ptype_all) &&
-                                       !(skb->imq_flags & IMQ_F_ENQUEUE))
-#else
                if (!list_empty(&ptype_all))
-#endif
                        dev_queue_xmit_nit(skb, dev);

-#ifdef CONFIG_ETHERNET_PACKET_MANGLE
-               if (!dev->eth_mangle_tx ||
-                   (skb = dev->eth_mangle_tx(dev, skb)) != NULL)
-#else
-               if (1)
+               skb_len = skb->len;
+#ifdef CONFIG_NET_DEBUG_SKBUFF_LEAK
+        skb_track_funccall(skb, ops->ndo_start_xmit);
 #endif
-               {
-                       skb_len = skb->len;
-                       rc = ops->ndo_start_xmit(skb, dev);
-                       trace_net_dev_xmit(skb, rc, dev, skb_len);
-               } else {
-                       rc = NETDEV_TX_OK;
-               }
-               #ifdef CONFIG_LTQ_IPQOS_BRIDGE_EBT_IMQ
-               if (txq && (rc == NETDEV_TX_OK))
-               #else
+               rc = ops->ndo_start_xmit(skb, dev);
+               trace_net_dev_xmit(skb, rc, dev, skb_len);
                if (rc == NETDEV_TX_OK)
-               #endif
                        txq_trans_update(txq);
                return rc;
        }
@@ -2664,19 +2663,9 @@
                if (!list_empty(&ptype_all))
                        dev_queue_xmit_nit(nskb, dev);

-#ifdef CONFIG_ETHERNET_PACKET_MANGLE
-               if (!dev->eth_mangle_tx ||
-                   (nskb = dev->eth_mangle_tx(dev, nskb)) != NULL)
-#else
-               if (1)
-#endif
-               {
-                       skb_len = nskb->len;
-                       rc = ops->ndo_start_xmit(nskb, dev);
-                       trace_net_dev_xmit(nskb, rc, dev, skb_len);
-               } else {
-                       rc = NETDEV_TX_OK;
-               }
+               skb_len = nskb->len;
+               rc = ops->ndo_start_xmit(nskb, dev);
+               trace_net_dev_xmit(nskb, rc, dev, skb_len);
                if (unlikely(rc != NETDEV_TX_OK)) {
                        if (rc & ~NETDEV_TX_MASK)
                                goto out_kfree_gso_skb;
@@ -2684,9 +2673,6 @@
                        skb->next = nskb;
                        return rc;
                }
-               #ifdef CONFIG_LTQ_IPQOS_BRIDGE_EBT_IMQ
-               if (txq)
-               #endif
                txq_trans_update(txq);
                if (unlikely(netif_xmit_stopped(txq) && skb->next))
                        return NETDEV_TX_BUSY;
@@ -2782,9 +2768,6 @@
                rc = NET_XMIT_SUCCESS;
        } else {
                skb_dst_force(skb);
-#if defined(CONFIG_AVM_PA) && defined(AVM_PA_MARK_SHAPED)
-               avm_pa_mark_shaped(skb);
-#endif
                rc = q->enqueue(skb, q) & NET_XMIT_MASK;
                if (qdisc_run_begin(q)) {
                        if (unlikely(contended)) {
@@ -2867,41 +2850,32 @@
        struct netdev_queue *txq;
        struct Qdisc *q;
        int rc = -ENOMEM;
-       int ret=0;
+
+#ifdef CONFIG_NET_DEBUG_SKBUFF_LEAK
+       skb_track_caller(skb);
+#endif

        skb_reset_mac_header(skb);

-       avm_simple_profiling_skb(0, skb);
+#ifdef CONFIG_AVM_PA
+       if (vlan_tx_tag_present(skb)) {
+               skb = __vlan_put_tag(skb, skb->vlan_proto,
+                                        vlan_tx_tag_get(skb));
+               if (unlikely(!skb))
+                       return rc;
+
+               skb->vlan_tci = 0;
+       }
+       (void)avm_pa_dev_snoop_transmit(AVM_PA_DEVINFO(dev), skb);
+#endif

        /* Disable soft irqs for various locks below. Also
         * stops preemption for RCU.
         */
        rcu_read_lock_bh();

-#ifdef CONFIG_LANTIQ_MCAST_HELPER_MODULE
-       if(mcast_helper_sig_check_update_ptr != NULL)
-       {
-               ret = mcast_helper_sig_check_update_ptr(skb);
-               if (ret == 1)
-               {
-                       //dev_kfree_skb_any(skb);
-                       //rcu_read_unlock_bh();
-                       //return rc;
-               }
-       }
-#endif
-
        skb_update_prio(skb);

-#ifdef CONFIG_OFFLOAD_FWD_MARK
- /* Don't forward if offload device already forwarded */
- if (skb->offload_fwd_mark &&
-     skb->offload_fwd_mark == dev->offload_fwd_mark) {
-   consume_skb(skb);
-   rc = NET_XMIT_SUCCESS;
-   goto out;
- }
-#endif
        txq = netdev_pick_tx(dev, skb);
        q = rcu_dereference_bh(txq->qdisc);

@@ -2989,10 +2963,6 @@
        __raise_softirq_irqoff(NET_RX_SOFTIRQ);
 }

-#if defined(CONFIG_LTQ_PPA_API_SW_FASTPATH)
-extern int32_t (*ppa_hook_sw_fastpath_send_fn)(struct sk_buff *skb);
-#endif
-
 #ifdef CONFIG_RPS

 /* One global table that all flow-based protocols share. */
@@ -3278,6 +3248,10 @@
 {
        int ret;

+#ifdef CONFIG_NET_DEBUG_SKBUFF_LEAK
+       skb_track_caller(skb);
+#endif
+
        /* if netpoll wants it, pretend we never saw it */
        if (netpoll_rx(skb))
                return NET_RX_DROP;
@@ -3285,14 +3259,6 @@
        net_timestamp_check(netdev_tstamp_prequeue, skb);

        trace_netif_rx(skb);
-
-#if defined(CONFIG_LTQ_PPA_API_SW_FASTPATH)
-        if(ppa_hook_sw_fastpath_send_fn!=NULL) {
-                if(ppa_hook_sw_fastpath_send_fn(skb) == 0)
-                        return NET_RX_SUCCESS;
-        }
-#endif
-
 #ifdef CONFIG_RPS
        if (static_key_false(&rps_needed)) {
                struct rps_dev_flow voidflow, *rflow = &voidflow;
@@ -3338,6 +3304,10 @@
 {
        struct softnet_data *sd = &__get_cpu_var(softnet_data);

+#ifdef CONFIG_FUSIV_KERNEL_PROFILER_MODULE
+  int profileResult;
+        profileResult = loggerProfile(net_tx_action);
+#endif
        if (sd->completion_queue) {
                struct sk_buff *clist;

@@ -3390,6 +3360,10 @@
                        }
                }
        }
+#ifdef CONFIG_FUSIV_KERNEL_PROFILER_MODULE
+        if(profileResult == 0)
+                profileResult = loggerProfile(net_tx_action);
+#endif
 }

 #if (defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE)) && \
@@ -3427,7 +3401,6 @@

        q = rxq->qdisc;
        if (q != &noop_qdisc) {
-               BUG_ON(!in_softirq());
                spin_lock(qdisc_lock(q));
                if (likely(!test_bit(__QDISC_STATE_DEACTIVATED, &q->state)))
                        result = qdisc_enqueue_root(skb, q);
@@ -3437,17 +3410,7 @@
        return result;
 }

-int check_ingress(struct sk_buff *skb)
-{
-       struct netdev_queue *rxq = rcu_dereference(skb->dev->ingress_queue);
-
-       if (!rxq || rxq->qdisc == &noop_qdisc)
-               return 1;
-       return 0;
-}
-EXPORT_SYMBOL(check_ingress);
-
-struct sk_buff *handle_ing(struct sk_buff *skb,
+static inline struct sk_buff *handle_ing(struct sk_buff *skb,
                                         struct packet_type **pt_prev,
                                         int *ret, struct net_device *orig_dev)
 {
@@ -3472,10 +3435,25 @@
        skb->tc_verd = 0;
        return skb;
 }
-EXPORT_SYMBOL(handle_ing);
 #endif

 /**
+ *     netdev_is_rx_handler_busy - check if receive handler is registered
+ *     @dev: device to check
+ *
+ *     Check if a receive handler is already registered for a given device.
+ *     Return true if there one.
+ *
+ *     The caller must hold the rtnl_mutex.
+ */
+bool netdev_is_rx_handler_busy(struct net_device *dev)
+{
+       ASSERT_RTNL();
+       return dev && rtnl_dereference(dev->rx_handler);
+}
+EXPORT_SYMBOL_GPL(netdev_is_rx_handler_busy);
+
+/**
  *     netdev_rx_handler_register - register receive handler
  *     @dev: device to register a handler for
  *     @rx_handler: receive handler to register
@@ -3620,8 +3598,8 @@
                goto drop;

 #ifdef CONFIG_AVM_PA
-#ifdef CONFIG_AVM_NET_DEBUG_SKBUFF_LEAK
-       skb_track_funccall(skb, avm_pa_dev_receive);
+#ifdef CONFIG_NET_DEBUG_SKBUFF_LEAK
+    skb_track_funccall(skb, avm_pa_dev_receive);
 #endif
        if (avm_pa_dev_receive(AVM_PA_DEVINFO(skb->dev), skb) == 0) {
                ret = NET_RX_SUCCESS;
@@ -3629,7 +3607,6 @@
        }
 #endif

-#ifdef CONFIG_AVM_RECV_HOOKS
        if (avm_early_recvhook && (*avm_early_recvhook)(skb)) {
                /*
                 * paket consumed by hook
@@ -3637,7 +3614,6 @@
                ret = NET_RX_SUCCESS;
                goto out;
        }
-#endif

        if (vlan_tx_tag_present(skb)) {
                if (pt_prev) {
@@ -3681,15 +3657,13 @@
                skb->vlan_tci = 0;
        }

-#ifdef CONFIG_AVM_RECV_HOOKS
-       if (avm_recvhook && (*avm_recvhook)(skb)) {
+       if (skb && avm_recvhook && (*avm_recvhook)(skb)) {
                /*
                 * paket consumed by hook
                 */
                ret = NET_RX_SUCCESS;
                goto out;
        }
-#endif

        /* deliver only exact match when indicated */
        null_or_dev = deliver_exact ? skb->dev : NULL;
@@ -3770,7 +3744,6 @@
 {
        int ret;

-       BUG_ON(!in_softirq());
        BUG_ON(skb->sk);
        net_timestamp_check(netdev_tstamp_prequeue, skb);

@@ -4048,7 +4021,9 @@
            pinfo->nr_frags &&
            !PageHighMem(skb_frag_page(frag0))) {
                NAPI_GRO_CB(skb)->frag0 = skb_frag_address(frag0);
-               NAPI_GRO_CB(skb)->frag0_len = skb_frag_size(frag0);
+               NAPI_GRO_CB(skb)->frag0_len = min_t(unsigned int,
+                                                   skb_frag_size(frag0),
+                                                   skb->end - skb->tail);
        }
 }

@@ -4337,6 +4312,10 @@
        unsigned long time_limit = jiffies + 2;
        int budget = netdev_budget;
        void *have;
+#ifdef CONFIG_FUSIV_KERNEL_PROFILER_MODULE
+  int profileResult;
+  profileResult = loggerProfile(net_rx_action);
+#endif

        local_irq_disable();

@@ -4417,7 +4396,10 @@
         */
        dma_issue_pending_all();
 #endif
-
+#ifdef CONFIG_FUSIV_KERNEL_PROFILER_MODULE
+        if(profileResult == 0)
+                profileResult = loggerProfile(net_rx_action);
+#endif
        return;

 softnet_break:
@@ -4858,8 +4840,7 @@

        dev->flags = (flags & (IFF_DEBUG | IFF_NOTRAILERS | IFF_NOARP |
                               IFF_DYNAMIC | IFF_MULTICAST | IFF_PORTSEL |
-                              IFF_AUTOMEDIA | IFF_NOMULTIPATH | IFF_MPBACKUP |
-                              IFF_MPMASTER)) |
+                              IFF_AUTOMEDIA)) |
                     (dev->flags & (IFF_UP | IFF_VOLATILE | IFF_PROMISC |
                                    IFF_ALLMULTI));

@@ -4893,13 +4874,6 @@
                dev_set_promiscuity(dev, inc);
        }

-       /* hack handling for MULTIPATH, interface down and up shouldn't set multipath
-        * on only Traffic Steering should do it, this is not clean.
-        */
-        if ((old_flags ^ flags) & IFF_UP) {     /* Bit is different  ? */
-           dev->flags |= IFF_NOMULTIPATH;
-        }
-
        /* NOTE: order of synchronization of IFF_PROMISC and IFF_ALLMULTI
           is important. Some (broken) drivers set IFF_PROMISC, when
           IFF_ALLMULTI is requested not asking us and not reporting.
@@ -5722,8 +5696,9 @@
                WARN_ON(rcu_access_pointer(dev->ip6_ptr));
                WARN_ON(dev->dn_ptr);
 #ifdef CONFIG_AVM_PA
-               avm_pa_dev_unregister(AVM_PA_DEVINFO(dev));
+        avm_pa_dev_unregister(AVM_PA_DEVINFO(dev));
 #endif
+
                if (dev->destructor)
                        dev->destructor(dev);

@@ -5754,12 +5729,6 @@
 }
 EXPORT_SYMBOL(netdev_stats_to_stats64);

-#if (defined(CONFIG_LTQ_STAT_HELPER) || defined(CONFIG_LTQ_STAT_HELPER_MODULE))
-struct rtnl_link_stats64* (*dev_get_extended_stats64_fn)(struct net_device *dev,
-                                            struct rtnl_link_stats64 *storage) = NULL;
-EXPORT_SYMBOL(dev_get_extended_stats64_fn);
-#endif
-
 /**
  *     dev_get_stats   - get network device statistics
  *     @dev: device to get statistics from
@@ -5783,10 +5752,6 @@
        } else {
                netdev_stats_to_stats64(storage, &dev->stats);
        }
-#if (defined(CONFIG_LTQ_STAT_HELPER) || defined(CONFIG_LTQ_STAT_HELPER_MODULE))
-       if (dev_get_extended_stats64_fn)
-               dev_get_extended_stats64_fn(dev, storage);
-#endif
        storage->rx_dropped += atomic_long_read(&dev->rx_dropped);
        return storage;
 }
@@ -5891,7 +5856,7 @@
        INIT_LIST_HEAD(&dev->upper_dev_list);
        dev->priv_flags = IFF_XMIT_DST_RELEASE;
 #ifdef CONFIG_AVM_PA
-       avm_pa_dev_init(AVM_PA_DEVINFO(dev));
+    avm_pa_dev_init(AVM_PA_DEVINFO(dev));
 #endif
        setup(dev);

peh@vidar:~>
Auch wenn man's am Pfad vielleicht nicht gleich sieht, aber hier wird tatsächlich der Stand der 7590 für 07.01 (die Dateien wurden von AVM am 25.09.2018 zusammengestellt) und der Stand der 7490 für 07.01 (Dateien vom 26.09.2018) verglichen.

Die "Gleichbehandlung" macht also ohnehin keinen Sinn ... und wenn man sich (alleine in der "net/core/dev.c" und "net/ipv4/ip_forward.c") die Unterschiede zwischen der 07.00 bei der 7590 und der 7580 ansieht, dann ist es wohl sogar ausgeschlossen, daß man die Quellen der 7590 für die 7580 verwendet (keine Ahnung bisher, wie die 7560 da wieder reinpaßt und welcher Box sie mehr ähnelt):
Code:
peh@vidar:~> diff -u /home/FritzBox/FB7590/GPL_07.00/linux/net/core/dev.c /home/FritzBox/FB7580/GPL/linux-3.10/net/core/dev.c
--- /home/FritzBox/FB7590/GPL_07.00/linux/net/core/dev.c        2018-07-13 11:40:29.000000000 +0200
+++ /home/FritzBox/FB7580/GPL/linux-3.10/net/core/dev.c 2016-10-19 18:48:11.000000000 +0200
@@ -100,11 +100,7 @@
 #ifdef CONFIG_AVM_PA
 #include <linux/avm_pa.h>
 #endif
-#ifdef CONFIG_AVM_SIMPLE_PROFILING
 #include <linux/avm_profile.h>
-#else
-#define avm_simple_profiling_skb(a,b) do { } while(0)
-#endif
 #include <linux/stat.h>
 #include <net/dst.h>
 #include <net/pkt_sched.h>
@@ -969,7 +965,7 @@
                return false;

        while (*name) {
-               if (*name == '/' || *name == ':' || isspace(*name))
+               if (*name == '/' || isspace(*name))
                        return false;
                name++;
        }
@@ -1712,7 +1708,7 @@
        skb->protocol = eth_type_trans(skb, dev);
        skb->mark = 0;
        secpath_reset(skb);
-       nf_reset_no_generic_ct(skb);
+       nf_reset(skb);
        nf_reset_trace(skb);
        return netif_rx(skb);
 }
@@ -2161,6 +2157,7 @@

 void dev_kfree_skb_irq(struct sk_buff *skb)
 {
+       avm_simple_profiling_skb(0, skb);
        if (atomic_dec_and_test(&skb->users)) {
                struct softnet_data *sd;
                unsigned long flags;
@@ -2177,6 +2174,7 @@

 void dev_kfree_skb_any(struct sk_buff *skb)
 {
+
        if (in_irq() || irqs_disabled())
                dev_kfree_skb_irq(skb);
        else
@@ -2416,7 +2414,7 @@
  * 2. No high memory really exists on this machine.
  */

-static int illegal_highdma(const struct net_device *dev, struct sk_buff *skb)
+static int illegal_highdma(struct net_device *dev, struct sk_buff *skb)
 {
 #ifdef CONFIG_HIGHMEM
        int i;
@@ -2496,51 +2494,46 @@
 }

 static netdev_features_t harmonize_features(struct sk_buff *skb,
-                                           __be16 protocol,
-                                           const struct net_device *dev,
-                                           netdev_features_t features)
+       __be16 protocol, netdev_features_t features)
 {
        if (skb->ip_summed != CHECKSUM_NONE &&
            !can_checksum_protocol(features, protocol)) {
                features &= ~NETIF_F_ALL_CSUM;
-       } else if (illegal_highdma(dev, skb)) {
+       } else if (illegal_highdma(skb->dev, skb)) {
                features &= ~NETIF_F_SG;
        }

        return features;
 }

-netdev_features_t netif_skb_dev_features(struct sk_buff *skb,
-                                        const struct net_device *dev)
+netdev_features_t netif_skb_features(struct sk_buff *skb)
 {
        __be16 protocol = skb->protocol;
-       netdev_features_t features = dev->features;
+       netdev_features_t features = skb->dev->features;

-       if (skb_shinfo(skb)->gso_segs > dev->gso_max_segs)
+       if (skb_shinfo(skb)->gso_segs > skb->dev->gso_max_segs)
                features &= ~NETIF_F_GSO_MASK;

        if (protocol == htons(ETH_P_8021Q) || protocol == htons(ETH_P_8021AD)) {
                struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data;
                protocol = veh->h_vlan_encapsulated_proto;
        } else if (!vlan_tx_tag_present(skb)) {
-               return harmonize_features(skb, protocol, dev, features);
+               return harmonize_features(skb, protocol, features);
        }

-       features &= (dev->vlan_features | NETIF_F_HW_VLAN_CTAG_TX |
+       features &= (skb->dev->vlan_features | NETIF_F_HW_VLAN_CTAG_TX |
                                               NETIF_F_HW_VLAN_STAG_TX);

        if (protocol != htons(ETH_P_8021Q) && protocol != htons(ETH_P_8021AD)) {
-               return harmonize_features(skb, protocol, dev, features);
+               return harmonize_features(skb, protocol, features);
        } else {
                features &= NETIF_F_SG | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST |
                                NETIF_F_GEN_CSUM | NETIF_F_HW_VLAN_CTAG_TX |
                                NETIF_F_HW_VLAN_STAG_TX;
-               return harmonize_features(skb, protocol, dev, features);
+               return harmonize_features(skb, protocol, features);
        }
-
-       return harmonize_features(skb, protocol, dev, features);
 }
-EXPORT_SYMBOL(netif_skb_dev_features);
+EXPORT_SYMBOL(netif_skb_features);

 /*
  * Returns true if either:
@@ -2564,10 +2557,6 @@
        int rc = NETDEV_TX_OK;
        unsigned int skb_len;

-#ifdef CONFIG_AVM_PA
-       (void)avm_pa_dev_snoop_transmit(AVM_PA_DEVINFO(dev), skb);
-#endif
-
        if (likely(!skb->next)) {
                netdev_features_t features;

@@ -2782,9 +2771,6 @@
                rc = NET_XMIT_SUCCESS;
        } else {
                skb_dst_force(skb);
-#if defined(CONFIG_AVM_PA) && defined(AVM_PA_MARK_SHAPED)
-               avm_pa_mark_shaped(skb);
-#endif
                rc = q->enqueue(skb, q) & NET_XMIT_MASK;
                if (qdisc_run_begin(q)) {
                        if (unlikely(contended)) {
@@ -2871,7 +2857,18 @@

        skb_reset_mac_header(skb);

-       avm_simple_profiling_skb(0, skb);
+       avm_simple_profiling_skb(0, skb);
+#ifdef CONFIG_AVM_PA
+       if (vlan_tx_tag_present(skb)) {
+               skb = __vlan_put_tag(skb, skb->vlan_proto,
+                                        vlan_tx_tag_get(skb));
+               if (unlikely(!skb))
+                       return rc;
+
+               skb->vlan_tci = 0;
+       }
+       (void)avm_pa_dev_snoop_transmit(AVM_PA_DEVINFO(dev), skb);
+#endif

        /* Disable soft irqs for various locks below. Also
         * stops preemption for RCU.
@@ -2893,15 +2890,6 @@

        skb_update_prio(skb);

-#ifdef CONFIG_OFFLOAD_FWD_MARK
- /* Don't forward if offload device already forwarded */
- if (skb->offload_fwd_mark &&
-     skb->offload_fwd_mark == dev->offload_fwd_mark) {
-   consume_skb(skb);
-   rc = NET_XMIT_SUCCESS;
-   goto out;
- }
-#endif
        txq = netdev_pick_tx(dev, skb);
        q = rcu_dereference_bh(txq->qdisc);

@@ -2990,7 +2978,7 @@
 }

 #if defined(CONFIG_LTQ_PPA_API_SW_FASTPATH)
-extern int32_t (*ppa_hook_sw_fastpath_send_fn)(struct sk_buff *skb);
+extern int32_t (*ppa_sw_fastpath_send_hook)(struct sk_buff *skb);
 #endif

 #ifdef CONFIG_RPS
@@ -3287,8 +3275,8 @@
        trace_netif_rx(skb);

 #if defined(CONFIG_LTQ_PPA_API_SW_FASTPATH)
-        if(ppa_hook_sw_fastpath_send_fn!=NULL) {
-                if(ppa_hook_sw_fastpath_send_fn(skb) == 0)
+        if(ppa_sw_fastpath_send_hook!=NULL) {
+                if(ppa_sw_fastpath_send_hook(skb) == 0)
                         return NET_RX_SUCCESS;
         }
 #endif
@@ -3573,6 +3561,8 @@

        pt_prev = NULL;

+       rcu_read_lock();
+
 #if IS_ENABLED(CONFIG_AVM_NET_SKB_INPUT_DEV)
        if (!skb->input_dev)
                skb->input_dev = skb->dev;
@@ -3587,7 +3577,7 @@
            skb->protocol == cpu_to_be16(ETH_P_8021AD)) {
                skb = vlan_untag(skb);
                if (unlikely(!skb))
-                       goto out;
+                       goto unlock;
        }

 #ifdef CONFIG_NET_CLS_ACT
@@ -3612,7 +3602,7 @@
 #ifdef CONFIG_NET_CLS_ACT
        skb = handle_ing(skb, &pt_prev, &ret, orig_dev);
        if (!skb)
-               goto out;
+               goto unlock;
 ncls:
 #endif

@@ -3625,7 +3615,7 @@
 #endif
        if (avm_pa_dev_receive(AVM_PA_DEVINFO(skb->dev), skb) == 0) {
                ret = NET_RX_SUCCESS;
-               goto out;
+               goto unlock;
        }
 #endif

@@ -3635,7 +3625,7 @@
                 * paket consumed by hook
                 */
                ret = NET_RX_SUCCESS;
-               goto out;
+               goto unlock;
        }
 #endif

@@ -3647,7 +3637,7 @@
                if (vlan_do_receive(&skb))
                        goto another_round;
                else if (unlikely(!skb))
-                       goto out;
+                       goto unlock;
        }

        rx_handler = rcu_dereference(skb->dev->rx_handler);
@@ -3659,7 +3649,7 @@
                switch (rx_handler(&skb)) {
                case RX_HANDLER_CONSUMED:
                        ret = NET_RX_SUCCESS;
-                       goto out;
+                       goto unlock;
                case RX_HANDLER_ANOTHER:
                        goto another_round;
                case RX_HANDLER_EXACT:
@@ -3687,7 +3677,7 @@
                 * paket consumed by hook
                 */
                ret = NET_RX_SUCCESS;
-               goto out;
+               goto unlock;
        }
 #endif

@@ -3721,6 +3711,8 @@
                ret = NET_RX_DROP;
        }

+unlock:
+       rcu_read_unlock();
 out:
        return ret;
 }
@@ -3729,7 +3721,6 @@
 {
        int ret;

-       BUG_ON(skb->sk);
        if (sk_memalloc_socks() && skb_pfmemalloc(skb)) {
                unsigned long pflags = current->flags;

@@ -3768,32 +3759,30 @@
  */
 int netif_receive_skb(struct sk_buff *skb)
 {
-       int ret;
-
        BUG_ON(!in_softirq());
-       BUG_ON(skb->sk);
        net_timestamp_check(netdev_tstamp_prequeue, skb);

        if (skb_defer_rx_timestamp(skb))
                return NET_RX_SUCCESS;

-       rcu_read_lock();
-
 #ifdef CONFIG_RPS
        if (static_key_false(&rps_needed)) {
                struct rps_dev_flow voidflow, *rflow = &voidflow;
-               int cpu = get_rps_cpu(skb->dev, skb, &rflow);
+               int cpu, ret;
+
+               rcu_read_lock();
+
+               cpu = get_rps_cpu(skb->dev, skb, &rflow);

                if (cpu >= 0) {
                        ret = enqueue_to_backlog(skb, cpu, &rflow->last_qtail);
                        rcu_read_unlock();
                        return ret;
                }
+               rcu_read_unlock();
        }
 #endif
-       ret = __netif_receive_skb(skb);
-       rcu_read_unlock();
-       return ret;
+       return __netif_receive_skb(skb);
 }
 EXPORT_SYMBOL(netif_receive_skb);

@@ -4016,15 +4005,10 @@
                break;

        case GRO_MERGED_FREE:
-               if (NAPI_GRO_CB(skb)->free == NAPI_GRO_FREE_STOLEN_HEAD) {
-#if defined(CONFIG_AVM_SKB_CACHE_SPLIT)
-                       kfree(skb); /*--- find out your own cachep ---*/
-#else/*--- #if defined(CONFIG_AVM_SKB_CACHE_SPLIT) ---*/
+               if (NAPI_GRO_CB(skb)->free == NAPI_GRO_FREE_STOLEN_HEAD)
                        kmem_cache_free(skbuff_head_cache, skb);
-#endif/*--- #else ---*//*--- #if defined(CONFIG_AVM_SKB_CACHE_SPLIT) ---*/
-               } else {
+               else
                        __kfree_skb(skb);
-               }
                break;

        case GRO_HELD:
@@ -4068,7 +4052,6 @@
        skb->vlan_tci = 0;
        skb->dev = napi->dev;
        skb->skb_iif = 0;
-       skb->truesize = SKB_TRUESIZE(skb_end_offset(skb));

        napi->skb = skb;
 }
@@ -4208,10 +4191,8 @@
                unsigned int qlen;

                while ((skb = __skb_dequeue(&sd->process_queue))) {
-                       rcu_read_lock();
                        local_irq_enable();
                        __netif_receive_skb(skb);
-                       rcu_read_unlock();
                        local_irq_disable();
                        input_queue_head_incr(sd);
                        if (++work >= quota) {
@@ -4656,7 +4637,7 @@
 {
        const struct net_device_ops *ops = dev->netdev_ops;

-       if (ops->ndo_change_rx_flags)
+       if ((dev->flags & IFF_UP) && ops->ndo_change_rx_flags)
                ops->ndo_change_rx_flags(dev, flags);
 }

@@ -4805,7 +4786,6 @@
        if (ops->ndo_set_rx_mode)
                ops->ndo_set_rx_mode(dev);
 }
-EXPORT_SYMBOL(__dev_set_rx_mode);

 void dev_set_rx_mode(struct net_device *dev)
 {
@@ -4858,8 +4838,7 @@

        dev->flags = (flags & (IFF_DEBUG | IFF_NOTRAILERS | IFF_NOARP |
                               IFF_DYNAMIC | IFF_MULTICAST | IFF_PORTSEL |
-                              IFF_AUTOMEDIA | IFF_NOMULTIPATH | IFF_MPBACKUP |
-                              IFF_MPMASTER)) |
+                              IFF_AUTOMEDIA)) |
                     (dev->flags & (IFF_UP | IFF_VOLATILE | IFF_PROMISC |
                                    IFF_ALLMULTI));

@@ -4893,13 +4872,6 @@
                dev_set_promiscuity(dev, inc);
        }

-       /* hack handling for MULTIPATH, interface down and up shouldn't set multipath
-        * on only Traffic Steering should do it, this is not clean.
-        */
-        if ((old_flags ^ flags) & IFF_UP) {     /* Bit is different  ? */
-           dev->flags |= IFF_NOMULTIPATH;
-        }
-
        /* NOTE: order of synchronization of IFF_PROMISC and IFF_ALLMULTI
           is important. Some (broken) drivers set IFF_PROMISC, when
           IFF_ALLMULTI is requested not asking us and not reporting.
@@ -6020,9 +5992,6 @@
 /**
  *     unregister_netdevice_many - unregister many devices
  *     @head: list of devices
- *
- *  Note: As most callers use a stack allocated list_head,
- *  we force a list_del() to make sure stack wont be corrupted later.
  */
 void unregister_netdevice_many(struct list_head *head)
 {
@@ -6032,7 +6001,6 @@
                rollback_registered_many(head);
                list_for_each_entry(dev, head, unreg_list)
                        net_set_todo(dev);
-               list_del(head);
        }
 }
 EXPORT_SYMBOL(unregister_netdevice_many);
@@ -6208,20 +6176,10 @@
                oldsd->output_queue = NULL;
                oldsd->output_queue_tailp = &oldsd->output_queue;
        }
-       /* Append NAPI poll list from offline CPU, with one exception :
-        * process_backlog() must be called by cpu owning percpu backlog.
-        * We properly handle process_queue & input_pkt_queue later.
-        */
-       while (!list_empty(&oldsd->poll_list)) {
-               struct napi_struct *napi = list_first_entry(&oldsd->poll_list,
-                                                           struct napi_struct,
-                                                           poll_list);
-
-               list_del_init(&napi->poll_list);
-               if (napi->poll == process_backlog)
-                       napi->state = 0;
-               else
-                       ____napi_schedule(sd, napi);
+       /* Append NAPI poll list from offline CPU. */
+       if (!list_empty(&oldsd->poll_list)) {
+               list_splice_init(&oldsd->poll_list, &sd->poll_list);
+               raise_softirq_irqoff(NET_RX_SOFTIRQ);
        }

        raise_softirq_irqoff(NET_TX_SOFTIRQ);
@@ -6232,7 +6190,7 @@
                netif_rx(skb);
                input_queue_head_incr(oldsd);
        }
-       while ((skb = skb_dequeue(&oldsd->input_pkt_queue))) {
+       while ((skb = __skb_dequeue(&oldsd->input_pkt_queue))) {
                netif_rx(skb);
                input_queue_head_incr(oldsd);
        }
@@ -6459,6 +6417,7 @@
                }
        }
        unregister_netdevice_many(&dev_kill_list);
+       list_del(&dev_kill_list);
        rtnl_unlock();
 }

peh@vidar:~>
Der Witz ist ja, daß bei der 7590 das "BUG_ON" in der Funktion "netif_receive_skb()" sowohl in den Quellen der 07.00 als auch der 07.01 vorhanden ist, bei der 7580 hingegen nicht in den (GPL-)Dateien, die AVM aber bisher nur für die 07.00 veröffentlicht hat (http://osp.avm.de/fritzbox/fritzbox-7580/). Wenn man sich das genauer anschaut, wird aber auch bei der 153.07.01 wohl nur das "BUG_ON(!in_softirq())" vorhanden sein und bei der Suche in der 7580 wurde dann die TNE-Instruktion für dieses Statement gefunden und nicht die für den "skb->sk == 0"-Test, den ich nur bei der 7490 durchs Disassemblieren in beiden Funktionsaufrufen gefunden hatte.
Code:
@@ -3768,32 +3759,30 @@
  */
 int netif_receive_skb(struct sk_buff *skb)
 {
-       int ret;
-
        BUG_ON(!in_softirq());
-       BUG_ON(skb->sk);
        net_timestamp_check(netdev_tstamp_prequeue, skb);

        if (skb_defer_rx_timestamp(skb))
                return NET_RX_SUCCESS;

-       rcu_read_lock();
-
 #ifdef CONFIG_RPS
        if (static_key_false(&rps_needed)) {
                struct rps_dev_flow voidflow, *rflow = &voidflow;
-               int cpu = get_rps_cpu(skb->dev, skb, &rflow);
+               int cpu, ret;
+
+               rcu_read_lock();
+
+               cpu = get_rps_cpu(skb->dev, skb, &rflow);

                if (cpu >= 0) {
                        ret = enqueue_to_backlog(skb, cpu, &rflow->last_qtail);
                        rcu_read_unlock();
                        return ret;
                }
+               rcu_read_unlock();
        }
 #endif
-       ret = __netif_receive_skb(skb);
-       rcu_read_unlock();
-       return ret;
+       return __netif_receive_skb(skb);
 }
 EXPORT_SYMBOL(netif_receive_skb);
Diese doch einigermaßen extremen Unterschiede zwischen der 7590 und der 7580 waren (mir zumindest) gar nicht so klar ... damit ist die 7580 eben doch nicht nur eine 7590 ohne externe Telefonie und ohne Supervectoring. Die internen Unterschiede im Kernel kann man zwar für die 07.01 noch nicht richtig abschätzen (dafür fehlen noch die Quellen der 153.07.01 - ich werde AVM nachher gleich mal dazu anschreiben), aber ehe man sich selbst verwirrt, sollte man die Analogien nicht nur annehmen, sondern überprüfen (hätte mir einiges an Kopfschmerzen erspart).

Es macht also erst mal gar keinen Sinn mehr zu versuchen, hier die GRX-Boxen über einen Kamm zu scheren ... und für die 07.01 der 7580 fehlen die Quellen. Ja, mit etwas "Glück" ist es sogar wieder so, daß diese "BUG_ON"-Statements bei der 7580 gar nicht in den 07.01-Quellen sind ... dann müßte OpenVPN auf der 7580 (wenn es nicht noch andere Stellen gibt, wo es kracht) funktionieren oder zumindest mal nicht mit dem BUG_ON in "netif_receive_skb()" crashen.

Ich kann mir zwar einen 7590-Kernel entpacken und den auch mit ein paar Berechnungen im Speicher richtig relozieren, aber die Symboltabelle ist i.d.R. gepackt und das auch noch von Hand nachzuverfolgen, ist mir dann wieder zu anstrengend. Daher wäre es nett, wenn sich ein 7590-Besitzer mit Kernel 07.01 mal die Ausgaben der folgenden Kommandos heraussucht und sie hier postet:
Code:
grep netif_receive_skb /proc/kallsyms
grep ip_forward /proc/kallsyms
Das sollte die (Speicher-)Adressen der drei Funktionen liefern, die bei der 7490 von @er13 geändert wurden und wo es - dem Vernehmen nach - danach wieder mit einem "dev tun" funktioniert. Den Code an diesen Stellen kann ich mir dann aus dem entpackten Kernel zusammensuchen.

Wobei es mich schon wieder komplett irritiert, daß bei @Whoopie bei der 7590 der Patch genau an derselben Stelle "gegriffen" hat, wie bei meiner 7580 mit der 07.01 (auch wenn die wohl ohnehin falsch war) - das heißt ja wieder, daß die 153.07.01 sich von der 154.07.01 eigentlich nicht wirklich unterscheiden kann, wenn irgendwo mitten im Kernel die Funktionen an denselben Speicheradressen beginnen - deshalb würde ich die Adressen gerne noch einmal mit meinen vergleichen:
Code:
~ # grep netif_receive_skb /proc/kallsyms
80a61da0 t __netif_receive_skb_core
80a623f0 t __netif_receive_skb
80a62474 T netif_receive_skb
~ # grep ip_forward /proc/kallsyms
80ab9574 t ip_forward_finish
80ab97a4 T ip_forward
80abb06c T ip_forward_options
8a51bf44 t ip_forward_hook_wrapper      [userman_mod]
~ #
Wenn die übereinstimmen, hat AVM vermutlich die ganzen 7590-Patches auch bei der 7580 inzwischen verwurstet ... nur paßt dazu eigentlich der Code gleich am Beginn von "netif_receive_skb()" wieder nicht, denn da ist bei der 7580 kein Test von "skbuff+16" auf 0 zu sehen.

---------------------------------------------------------------------------------

Hours later ...

Das aber paßt wiederum zur komplett anders aufgebauten "skbuff"-Struktur, wenn es nach den Quellen für die 154.07.01 geht:
Code:
 431 struct sk_buff {
 432         /* These two members must be first. */
 433         struct sk_buff          *next;
 434         struct sk_buff          *prev;
 435
 436 #if defined(CONFIG_LTQ_CBM) || IS_ENABLED(CONFIG_DIRECTCONNECT_DP_API)
 437         __u32 DW0, DW1, DW2, DW3;
 438 #endif
 439
 440 #ifdef CONFIG_LTQ_DP_MPE_FASTHOOK_TEST
 441         struct ltq_mpe_fasthook_info *mpe_skb_info; /*for MPE fast hooking test*/
 442 #endif
 443         ktime_t                 tstamp;
 444
 445         struct sock             *sk;
 446         struct net_device       *dev;
 447 #if IS_ENABLED(CONFIG_AVM_NET_SKB_INPUT_DEV)
 448         struct net_device       *input_dev;
 449 #endif
(aus include/linux/skbuff.h)
Da hatte ich mit meiner Vermutung (ich hätte ja auch einfach vorher mal nachsehen können), daß der CBM für Unterschiede sorgt bei den GRX-Modellen, ja mal ausnahmsweise ins Schwarze getroffen. Die vier "uint32"-Werte (DW0, DW1, DW2, DW3) sorgen dann schon mal dafür, daß das "sk"-Feld nicht mehr am Offset 16, sondern am Offset 32 steht. Damit ist dann die Folge:
netif_receive_skb_7580.png
(hier ist mir das Kopieren zu mühsam, weil das der ODA ist) bei der 7580 wieder nachvollziehbar, wobei die erste TNE-Instruktion dann zum "BUG_ON(!in_softirq())" gehört und die zweite (die nach dem Laden von v0 mit dem Wert an Offset 32 von a0 -> lw v0,32(a0)) erst die für das "BUG_ON(skbuff->sk)" wäre. Damit war der Patch also für die 7580/7590 definitiv schon mal falsch, weil die zweite TNE-Instruktion zu patchen wäre.

Zusammengefaßt: Das Patchen könnte funktionieren, aber so einfach, wie ich es mir machen wollte, indem ich VR9-Modelle und die GRX-Boxen über einen Kamm schere, ist es doch nicht. Es ist (ohne die Quellen für die 153.07.01) nicht mal sicher, daß 7590 und 7580 bei der 07.01 identisch sind, auch wenn übereinstimmende Adressen von Kernelfunktionen das nahelegen würden.

Ich versuche nun doch noch (wenn ich weiß, daß die Adressen übereinstimmen bei 7580 und 7590) einen Patch für die GRX-Modelle zu erstellen ... aber dazu muß ich erst mal die Funktionen noch einmal genau disassemblieren an den betreffenden Stellen.
 
Zuletzt bearbeitet:
Ich habe mal eine Version für 7580 und 7590 eingecheckt (Verzeichnis wie vorher, dann an den Dateinamen orientieren) ... wenn bei der 7590 dieselben Ausgaben zu sehen sind (inkl. derselben Speicheradressen), wie hier:
Code:
~ # sh /var/media/ftp/patch_kernel_7580_skbuff_sk_checks
Found supported firmware version 07.01.
Found supported HWRevision 225.
Found symbol 'netif_receive_skb' at memory address 0x80A62474.
Looking for TNE instruction with max. distance of 15.
Found 'lw v[0|1],32(a0)' instruction at 0x80A62494, checking next instruction now.
Found TNE instruction (0x00020336) at 0x80A62498, replacing it with a NOP instruction.
Found symbol '__netif_receive_skb' at memory address 0x80A623F0.
Looking for TNE instruction with max. distance of 5.
Found 'lw v[0|1],32(a0)' instruction at 0x80A623F4, checking next instruction now.
Found TNE instruction (0x00030336) at 0x80A623F8, replacing it with a NOP instruction.
Found symbol 'ip_forward' at memory address 0x80AB97A4.
Looking for 'lw v0,32(a0)' instruction with max. distance of 10.
Found 'lw v0,32(a0)' instruction (0x8C820020) at 0x80AB97C0, replacing it with a 'li v0,0' instruction.
~ #
, dann wären zumindest die drei Stellen aus den Quellen der 7590 (154.07.01) damit auch gepatcht. Ob das auf OpenVPN den gewünschten Eindruck macht oder nicht, habe ich nicht getestet.

Anders als bei der 7490 gibt es eben noch das "BUG_ON(!in_softirq())" in "netif_receive_skb()" und ich kann gerade keine Sources für den Vanilla-Kernel 3.10 finden, um zu prüfen, ob das ein AVM- oder Lantiq-Patch ist oder ob das da "hingehört" - ein "in_softirq()" liefert ja die Schachtelungstiefe der Interrupt-Behandlung zurück (alles in "include/linux/hardirq.h" definiert und nachzulesen). Geht man davon aus, daß die Anweisung in der 3.10.107 der 7490 fehlt, gehört sie wohl zu den Lantiq- oder AVM-Patches und es kann gut sein, daß es hier bei der 7580/7590 doch schon das nächste Mal in die Hose geht (bzw. das wäre dann sogar das erste, denn dieses Statement kommt noch vor der "skbuff->sk"-Prüfung).
 
Ich bin seit gestern freetz-frei und kann daher nichts mehr zu diesem Thema beitragen.
 
Ok, dann würde ich mit meiner FB7590 einspringen, die Familienmitglieder werden mich zwar hassen, möchte aber gerne endlich FritzOS7 auf meiner 7590 installieren können.
Was genau soll ich testen, am besten so detailliert wie möglich beschreiben.
Ubuntu Mate 18.04.1, Windows10 und Windows7 vorhanden.
 
@Whoopie:
Schade, wenn Du dabei sogar den Shell-Zugriff komplett mit aufgegeben hast ... denn schließlich hätte es zum Vergleich der Adressen nichts weiter gebraucht, als die Ausgabe aus /proc/kallsyms bzw. einen "Testlauf" des Skripts für die passende Box.

@JokerGermany:
Das genau ist es auch, was im ersten Schritt auszuführen wäre ... die Ausgabe der zwei "grep"-Befehle aus #44 bei der 7590 zeigen und als zweiten Schritt das passende Skript aus dem Repo (immer vorausgesetzt, das "devmem"-Applet ist bei Dir vorhanden, wie ich es weiter oben beschrieben habe) auf der Box ausführen lassen (das geht auch, wenn die Adressen nicht 100% übereinstimmen sollten) und die Ausgabe (der zweimaligen Ausführung) hier zeigen.

Wenn Du dann noch zu denen gehören solltest, die bereits ein 7590-Image mit OpenVPN (und dem tun-Driver) erstellt haben und dann feststellen mußten, daß die Box beim Start einer OpenVPN-Verbindung (nämlich dann, wenn sie das erste Paket über das TAP- oder TUN-Device empfängt) crasht, dann könntest Du das auch noch probieren nach dem Patchen.

Ansonsten werden keine dauerhaften Änderungen vorgenommen (und damit auch das System nicht unbrauchbar gemacht) ... nach einem Neustart der Box wäre alles wieder beim alten Stand.

--------------------------------------------------------------------------------------------------------

Ich habe mich inzwischen etwas weiter umgesehen und versucht, irgendwelche "Vorarbeiten" im Internet zu lokalisieren, die in die Richtung eines "universellen Kernel-Patchers" gehen ... so etwas wie das legendäre IMASPZAP (aka SuperZap) von IBM auf deren OS/360- bzw. OS/370-Rechnern, mit denen ich aufgewachsen bin (mein Gott bin ich alt).

Ich habe aber nichts gefunden und am Ende ging mir auf, daß die "live patches" der neuen Linux-Kernel (wo das aber erst ab Versionen jenseits der 4 implementiert ist) eigentlich - zumindest vom Prinzip her - auch nichts anderes sind (mal von etwas Synchronisation abgesehen, damit nicht an gerade genutztem Code herumgedoktert wird, was beim einfachen Ersetzen "in place" aber auch kein übergroßes Problem ist) und man das dann auch einfach auf diesem Wege machen kann ... ja, daß man damit sogar den Mechanismus zum "Ein- und Ausschalten" für das gesamte System und die Möglichkeit der Abfrage praktisch frei Haus geliefert bekommt, wenn man das einfach als Kernel-Module umsetzt, welches beim Laden die Änderungen vornimmt und sie beim Entladen auch wieder rückgängig macht.

Damit hat man auch gleich noch die Chance, die tatsächliche Verschiebung von "sk" innerhalb von "skbuff" in dem Module zu berücksichtigen, indem man einfach die "skbuff.h" inkludiert ... das macht die Suche nach der richtigen Assembler-Instruktion dann noch einmal leichter und der Code läßt sich für unterschiedliche Prozessor-Typen doch wieder besser vereinheitlichen.

Damit würde das also (vorausgesetzt, es funktioniert und das stellt jemand fest, der es hier auch mitteilt) als LKM enden ... das läßt sich ja auch hinzufügen zu einem System, bei dem man den Kernel eben nicht ausgetauscht hat.

Nun klingt zwar LKM gleich etwas kompliziert ... ist es aber im Prinzip nicht und wenn das nicht erst Heiligabend (oder in drei Tagen) als "proof-of-concept" bestätigt wird, könnte ich mir vorstellen, daß unterm Weihnachtsbaum auch dieses Module liegen könnte.
 
Das genau ist es auch, was im ersten Schritt auszuführen wäre ... die Ausgabe der zwei "grep"-Befehle aus #44 bei der 7590 zeigen und als zweiten Schritt das passende Skript aus dem Repo (immer vorausgesetzt, das "devmem"-Applet ist bei Dir vorhanden, wie ich es weiter oben beschrieben habe) auf der Box ausführen lassen (das geht auch, wenn die Adressen nicht 100% übereinstimmen sollten) und die Ausgabe (der zweimaligen Ausführung) hier zeigen.

Wenn Du dann noch zu denen gehören solltest, die bereits ein 7590-Image mit OpenVPN (und dem tun-Driver) erstellt haben und dann feststellen mußten, daß die Box beim Start einer OpenVPN-Verbindung (nämlich dann, wenn sie das erste Paket über das TAP- oder TUN-Device empfängt) crasht, dann könntest Du das auch noch probieren nach dem Patchen.

Ich bin ganz schnell wieder zurück gewechselt, als ich gemerkt habe, dass OpenVPN crasht. OpenVPN wird zwar mittlerweile weniger genutzt als früher, würde es aber gerne noch nutzen können...
Muss mir nochmal nen neues Fritz7 Image basteln, momentan läuft devel-14827M mit FritzOS 6.92.

Was oder Wer ist das "devmem"-Applet?

Schonmal die beiden grep Befehle noch mit Fritz!OS 6.92 ausgeführt auf der Rudi-Shell:
grep ip_forward /proc/kallsyms
Code:
80a496b8 t ip_forward_finish
80a497c4 T ip_forward
80a4afec T ip_forward_options
8a304a5c t ip_forward_hook_step1    [userman_mod]

grep netif_receive_skb /proc/kallsyms
Code:
809f3060 t __netif_receive_skb_core
809f3abc t __netif_receive_skb
809f3b38 T netif_receive_skb
 
Das nutzt nichts, weil die "grep"s schon mit dem richtigen Kernel (also dem der 07.01) aufgerufen werden müssen, denn das sind ja die Adressen von Kernel-Funktionen in der Ausgabe und die verschieben sich bei einem anderen Kernel (zumindest hier einigermaßen sicher, weil zur 07.0x hin ein größerer Umbruch erfolgte).

Das "devmem" ist ein BusyBox-Applet und ist (soweit ich weiß) im Normalfall in Freetz nicht aktiviert.

Das muß man also erst noch einschließen beim Build und zwar irgendwo bei der BusyBox-Konfiguration - so oft mache ich das mit Freetz jetzt auch wieder nicht, das ist bei mir "ferner liefen" und meine Konfigurationen kopiere ich auf anderem Weg (https://github.com/Freetz/freetz/pull/55) von einem Modell zum anderen, ohne das jedesmal von vorne machen zu müssen.
 
Das nutzt nichts, weil die "grep"s schon mit dem richtigen Kernel (also dem der 07.01) aufgerufen werden müssen, denn das sind ja die Adressen von Kernel-Funktionen in der Ausgabe und die verschieben sich bei einem anderen Kernel (zumindest hier einigermaßen sicher, weil zur 07.0x hin ein größerer Umbruch erfolgte).

Ich weiß, muss noch nen Freetz Image mit devmem compilieren....
 
Zuletzt bearbeitet:
Gibt es das svn von Freetz nicht mehr?
Nehme jetzt git...
 
@Whoopie:
Schade, wenn Du dabei sogar den Shell-Zugriff komplett mit aufgegeben hast ... denn schließlich hätte es zum Vergleich der Adressen nichts weiter gebraucht, als die Ausgabe aus /proc/kallsyms bzw. einen "Testlauf" des Skripts für die passende Box.

Shell-Zugriff per Telnet ist noch vorhanden, aber keine busybox mit devmem-Applet. Und die busybox aus deinem GIT-Repo liefert nur "Trace/breakpoint trap".
 
Schonmal die beiden grep Befehle noch mit Fritz!OS 6.92 ausgeführt auf der Rudi-Shell:
grep ip_forward /proc/kallsyms
Code:
80a496b8 t ip_forward_finish
80a497c4 T ip_forward
80a4afec T ip_forward_options
8a304a5c t ip_forward_hook_step1    [userman_mod]

grep netif_receive_skb /proc/kallsyms
Code:
809f3060 t __netif_receive_skb_core
809f3abc t __netif_receive_skb
809f3b38 T netif_receive_skb

Fritz!OS 7.01 ausgeführt auf der Rudi-Shell:
grep ip_forward /proc/kallsyms
Code:
80ab9574 t ip_forward_finish
80ab97a4 T ip_forward
80abb06c T ip_forward_options
8a342f44 t ip_forward_hook_wrapper    [userman_mod]

grep netif_receive_skb /proc/kallsyms
Code:
80a61da0 t __netif_receive_skb_core
80a623f0 t __netif_receive_skb
80a62474 T netif_receive_skb

So jetzt such ich das Skript was ich ausführen sollte^^


€dit:
https://github.com/PeterPawn/YourFritz/blob/master/patch_kernel/patch_kernel_7590_skbuff_sk_checks
Code:
Found supported firmware version 07.01.
Found supported HWRevision 226.
Found symbol 'netif_receive_skb' at memory address 0x80A62474.
Looking for TNE instruction with max. distance of 15.
Found 'lw v[0|1],32(a0)' instruction at 0x80A62494, checking next instruction now.
Found TNE instruction (0x00020336) at 0x80A62498, replacing it with a NOP instruction.
Found symbol '__netif_receive_skb' at memory address 0x80A623F0.
Looking for TNE instruction with max. distance of 5.
Found 'lw v[0|1],32(a0)' instruction at 0x80A623F4, checking next instruction now.
Found TNE instruction (0x00030336) at 0x80A623F8, replacing it with a NOP instruction.
Found symbol 'ip_forward' at memory address 0x80AB97A4.
Looking for 'lw v0,32(a0)' instruction with max. distance of 10.
Found 'lw v0,32(a0)' instruction (0x8C820020) at 0x80AB97C0, replacing it with a 'li v0,0' instruction.
Code:
Found supported firmware version 07.01.
Found supported HWRevision 226.
Found symbol 'netif_receive_skb' at memory address 0x80A62474.
Looking for TNE instruction with max. distance of 15.
Found 'lw v[0|1],32(a0)' instruction at 0x80A62494, checking next instruction now.
Found NOP instruction after loading v[0|1], looks like the patch was applied already.
Found symbol '__netif_receive_skb' at memory address 0x80A623F0.
Looking for TNE instruction with max. distance of 5.
Found 'lw v[0|1],32(a0)' instruction at 0x80A623F4, checking next instruction now.
Found NOP instruction after loading v[0|1], looks like the patch was applied already.
Found symbol 'ip_forward' at memory address 0x80AB97A4.
Looking for 'lw v0,32(a0)' instruction with max. distance of 10.
Found 'li v0,0' instruction at 0x80AB97C0, looks like the patch was applied already.

€dit2:
VPN funzt
Aber war schon meiner Meinung nach direkt nach dem Freetz install sehr langsam mit dem deaktivieren von OpenVPN, sodass ich nicht weiß ob du schuld bist oder ein anderer Freetz patch.

Auf jedenfall konnte ich den VPN starten und mich über LTE mit dem Router verbinden =)

Hauptsache es funzt =)

€dit3:
Es juckt mir in den Fingern, ich starte mal die Fritz!Box neu, dann sollte dein Patch ja weg sein...

€dit4:
Jap, ohne Skript crasht die Fritz!Box.

Hab jetzt das Skript in die rc.custom eingetragen und es funzt.

Vielen Dank @PeterPawn
 
Zuletzt bearbeitet:
Und die busybox aus deinem GIT-Repo liefert nur "Trace/breakpoint trap".
Auch die für die korrekte uClibc-ng-Version (und damit für den Kernel 3.10.104)? Ich habe halt keine 7590 ... aber die Version auf der 7580 durchaus getestet und im Einsatz - die Ausgaben der 7580 weiter oben basieren ja genau auf dieser BusyBox, deren "sh" ich in einer ansonsten unveränderten 7580 mit Shell über die serielle Schnittstelle aufgerufen habe, damit das Applet (dank "PREFER_APPLETS") gefunden wird vom Skript.

Da die auch noch statisch gelinkt ist, wird das ja um so mysteriöser, wenn die auf der 7590 nicht will.

EDIT:
Ich nehme das von @JokerGermany dann mal als Bestätigung, daß der prinzipielle Weg funktioniert. Ich schaue mal, was ich mit einem LKM hinbekomme, das (wie oben erwähnt) beim Laden die Instruktionen verändert. Dann braucht man auch nicht mehr unbedingt die BusyBox mit dem "devmem"-Applet ...
 
Zuletzt bearbeitet:
Sollte sich herausstellen, dass das Herauspatchen von BUG_ON's/drop zu keinen negativen Nebeneffekten führt (die Methode von @PeterPawn ist dabei insofern im Vergleich zu der Freetz-Methode mit dem ersetzten Kernel besser, dass dabei wirklich nur die 3 Stellen geändert werden - also der Umfang der Änderungen minimal ist), so frage ich mich, wozu in aller Welt AVM diese BUG_ON's/drop überhaupt eingebaut hat?

Ist es eine Kompetenzfrage? AVM bastelt am Linux Kernel rum ohne die geänderten Stellen genau zu verstehen bzw. ohne die Auswirkungen der eigenen Änderungen zu verstehen? Oder wie würdet Ihr das interpretieren?
 
Ich halte das eher für übriggebliebene "Sperren", die AVM bei der Suche nach allen möglichen Stellen verwendet hat, wo ein Aufruf mit "skbuff"-Pointern in ungeeignetem Speicher erfolgte und die Behandlung damit zu viele Ressourcen verschlungen hat ... vom Umkopieren von Buffer-Inhalten im Speicher bis zur Notwendigket, diese Daten immer an einer DMA-fähigen Adresse zu haben (denn die werden m.E. per DMA an die Netzwerk-Hardware übermittelt).

Auch die Buffer-Verwaltung in Hardware (der bereits angesprochene "central buffer manager" (CBM) von Lantiq/Intel) dürfte damit zu tun haben ... da werden wohl ein paar überflüssige Interrupts (die ansonsten für die Freigabe nicht länger benötigter Buffer, z.B. wenn deren Inhalt erfolgreich "gesendet" wurde von der Hardware, zusätzlich notwendig wären) vermieden.

Angesichts der angepeilten Durchsatzraten ist das vermutlich (bei der geringen "Power", die MIPS-Architekturen ansonsten haben im Vergleich zu ARM oder x86) der einzige Weg, daß man versucht, die Anzahl der kompletten Kontextwechsel auf ein Minimum zu begrenzen ... das bereits mehrfach aufgefallene "Yield()"-Konzept von AVM dürfte auch in diese Richtung gehen und die Tatsache, daß dieser "CBM" bei Lantiq durch irgendwelche Hardware "supported" wird, zeigt für meine Begriffe auch, daß man sich bei Lantiq dieses Problems durchaus bewußt war/ist und es durch zusätzliche Hardware-Unterstützung abmildern wollte.

Bei den AVM-Geräten kommt dann ja auch immer noch dazu (im Gegensatz zu "reinen Routern"), daß die noch einiges parallel machen sollen und dabei durchaus auch Aufgaben sind (z.B. das TDM fürs DECT, wenn ich einige ältere Crashes nicht komplett falsch interpretiert habe), die "just in time" ablaufen müssen.

Daher bin ich auch etwas irritiert, daß AVM das am Ende wieder alles in ein "großes System" packt, anstatt es auf mehrere VMs zu verteilen, denen dann jeweils ein Prozessor-Kern zur Verfügung gestellt wird. Ich bin mal gespannt, wie das beim Puma7 (und damit wohl bei der 6591) dann aussieht bei AVM ... auch da hat Intel ja m.W. "virtual machines" angekündigt für die Trennung der verschiedenen Funktionen.

Jedenfalls denke ich mal, daß das "virtuelle Interface" für den TUN-Driver dann ein Punkt ist, an dem AVM sich nicht weiter darum gekümmert hat, daß darüber gesendete und empfangene Pakete dann weiterhin auf dem "normalen" Weg durch die Verarbeitungskette wandern ... aber immerhin scheint man es ja bemerkt zu haben, denn vorher war ja (m.W.) auch bei den GRX-Modellen der TUN-Driver fest in den Kernel gelinkt, oder?

Solange der TUN-Driver nicht dabei ist, machen die anderen Interfaces offenbar keine Probleme mehr ... die springen dann wohl erst später (vermutlich direkt in die "...core"-Funktionen) in diese Kette ein und haben dabei jeweils schon Buffer, die an den richtigen Stellen im Speicher liegen und kein Umkopieren, etc. mehr brauchen.

Und da die Statements bei AVM halt im Kernel verblieben sind, kann man auch nicht einfach nur den (selbstkompilierten) TUN-Driver dazuladen ... abgesehen davon, daß auch der natürlich schon den jeweils korrekten Aufbau des "skbuff" kennen muß, der bei den GRX-Modellen mit CBM und den zusätzlichen vier "Worten" gleich am Beginn (bei Offset 16) deutlich anders ist als bei den VR9-Boxen.

AVM interessiert es halt nicht (solange man dort den TUN-Driver nicht selbst braucht), wenn die anderen Treiber nicht funktionieren ... die Kernel-Quellen sollen ja auch nur den tatsächlich verwendeten Kernel reproduzieren (auch das machen sie ja nicht, wie wir wissen) und AVM ist nicht "verpflichtet", die eigenen Änderungen am Kernel so klein wie möglich zu halten bzw. dafür zu sorgen, daß Software von Dritten damit auch arbeiten kann.

Trotzdem würde ich hier weder bösen Willen noch planloses Vorgehen unterstellen ... es sind m.E. eben "Überbleibsel" einer "Implementierungshilfe", die vermutlich dabei geholfen hat, "wilde Aufrufe" dieser beiden Funktionen (bzw. der drei, wenn man den Beginn von "ip_forward" noch dazunimmt, was bei AVM vermutlich auch nicht "in use" ist) zu entdecken und dadurch zu beheben, daß da dann andere Aufrufe verwendet werden in den AVM-Treibern.
 
Hurra! und vielen, vielen Dank PeterPawn! OVPN laueft stabil!
Boxtyp 7590
AVM-Firmwareversion 07.01
Kernelversion 3.10.104 (jpluschke@GU_IQ17p2_NL1_grx5) (gcc version 5.4.0 (Buildroot 2016.05-g4d7c863-dirty) )
Freetz-Version freetz-devel-14913
Firmwareversion 154.07.01
AVM-Revision 61378
Sprache de
Erstellungsdatum (AVM) 17.09.2018 15:45:09
Bootloaderversion 1.3258
 
Gratulation PeterPawn,

des script funzt auch bei meine 7490 gut

was hab ich gemacht!:

-freetz mit dem "devmem" Modul gebaut und auf die Box geflasht
-dein script/patch in rc.external eingetragen, so das es beim Start ausgeführt wird

jetzt ist der Zugriff via Openvpn auf meine FB wieder möglich...Nebenwirkungen sind mir noch keine aufgefallen...

..wäre schön wenn das problem gleich beim bauen des Images durch einen Patch gelöst würde!!?

Danke..... schöne Weihnacht

--------------------------------------------------------------------------------------------------------------------------------
Boxtyp7490
AVM-Firmwareversion 07.01
Sprachede
Kernelversion 3.10.107 (jpluschke@GU_IQ17p2_NL1_vr9) (gcc version 5.4.0 (Buildroot 2016.05-g4d7c863) )
Freetz-Version freetz-devel-14994
Erstellungsdatum 23.12.2018 11:29:49
Ursprünglicher Dateiname 7490_07.01-freetz-devel-14994.de_20181223-112949.image
 
..wäre schön wenn das problem gleich beim bauen des Images durch einen Patch gelöst würde!!?
Das ist tatsächlich deutlich komplizierter.

Die Adressen der Funktionen kann man am einfachsten bei einem geladenen Kernel aus "/proc/kallsyms" ermitteln und will man das von Hand bei einem machen, der nur als Datei vorliegt, braucht das mehr Aufwand.

Zwar kann man für einen bestimmten Kernel die Adressen aus einer Box kopieren und dann den Patch "fix" auf diese Adresse ansetzen - das geht aber beim nächsten Kernel mit hoher Wahrscheinlichkeit wieder schief (die 07.08 könnte mit demselben Patch funktionieren) und ich bin mir auch nicht sicher, ob z.B. alle VR9-Modelle denselben Kernel verwenden.

Das LKM wird dann ja die Änderungen beim Entladen mittels "rmmod" auch wieder rückgängig machen ... und liegt es erst einmal vor, kann man es auch von Freetz zusammen mit den anderen (zusätzlichen) Modulen laden lassen.

Ob's heute tatsächlich noch fertig wird (wie ich es mir vorgenommen hatte), kann ich nicht versprechen ... zwischendrin hat mich ein Acer Aspire V5 jede Menge zusätzliche Nerven und Zeit gekostet, wo ich "nur mal schnell" das Windows 10 wieder gängig machen wollte und es am Ende auseinandergeschraubt hatte.
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.