lkml.org 
[lkml]   [2000]   [Feb]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subjecthh_cache question.
    Hello.


    I have a question about hardware header caching in kernel 2.2.x.

    Currently the size of the hh_data (in hh_cache structure) defined 16
    bytes long, but what if I want to cache bigger header? How can I do
    that?

    I can't simply enlarge this buffer because ip_finish_output (in
    include/net/ip.h) assumes that the size of the buffer is 16. The changes
    in ip_finish_output will cause changes in every hard_header_cache
    function out there (there is no much I should say).


    I wrote small patch (against 2.2.14) that allows bigger header to be
    cached (up to 32 bytes). It also changes ip_finish_output in such a way
    that if larger cache will be needed one can simply enlarge size of
    hh_data without changes in other parts of the kernel. But perhaps I've
    missed something and there is better solution?


    Thanks.

    Gleb.diff -ur -X exclude 2.2.14-fixed/drivers/net/myri_sbus.c linux/drivers/net/myri_sbus.c
    --- 2.2.14-fixed/drivers/net/myri_sbus.c Tue Jan 4 20:12:17 2000
    +++ linux/drivers/net/myri_sbus.c Tue Feb 29 09:40:50 2000
    @@ -743,16 +743,12 @@
    {
    unsigned short type = hh->hh_type;
    unsigned char *pad = (unsigned char *)hh->hh_data;
    - struct ethhdr *eth = (struct ethhdr *)(pad + MYRI_PAD_LEN);
    + struct ethhdr *eth = (struct ethhdr *)pad;
    struct device *dev = neigh->dev;

    if (type == __constant_htons(ETH_P_802_3))
    return -1;

    - /* Refill MyriNet padding identifiers, this is just being anal. */
    - pad[0] = MYRI_PAD_LEN;
    - pad[1] = 0xab;
    -
    eth->h_proto = type;
    memcpy(eth->h_source, dev->dev_addr, dev->addr_len);
    memcpy(eth->h_dest, neigh->ha, dev->addr_len);
    @@ -763,7 +759,7 @@
    /* Called by Address Resolution module to notify changes in address. */
    void myri_header_cache_update(struct hh_cache *hh, struct device *dev, unsigned char * haddr)
    {
    - memcpy(((u8*)hh->hh_data) + 2, haddr, dev->addr_len);
    + memcpy((u8*)hh->hh_data, haddr, dev->addr_len);
    }

    static int myri_change_mtu(struct device *dev, int new_mtu)
    diff -ur -X exclude 2.2.14-fixed/drivers/net/sbni.c linux/drivers/net/sbni.c
    --- 2.2.14-fixed/drivers/net/sbni.c Tue Jan 4 20:12:17 2000
    +++ linux/drivers/net/sbni.c Tue Feb 29 09:44:09 2000
    @@ -287,7 +287,7 @@
    {
    unsigned short type = hh->hh_type;
    struct sbni_hard_header *sbni = (struct sbni_hard_header*)
    - (((u8*)hh->hh_data) - 8);
    + ((u8*)hh->hh_data);
    struct device *dev = neigh->dev;


    @@ -320,7 +320,7 @@

    static void sbni_header_cache_update(struct hh_cache *hh, struct device *dev, unsigned char * haddr)
    {
    - memcpy(((u8*)hh->hh_data) + 2, haddr, dev->addr_len);
    + memcpy(((u8*)hh->hh_data) + 8, haddr, dev->addr_len);
    }


    diff -ur -X exclude 2.2.14-fixed/include/linux/netdevice.h linux/include/linux/netdevice.h
    --- 2.2.14-fixed/include/linux/netdevice.h Tue Jan 4 20:12:25 2000
    +++ linux/include/linux/netdevice.h Tue Feb 29 10:50:56 2000
    @@ -157,7 +157,7 @@
    int (*hh_output)(struct sk_buff *skb);
    rwlock_t hh_lock;
    /* cached hardware header; allow for machine alignment needs. */
    - unsigned long hh_data[16/sizeof(unsigned long)];
    + unsigned long hh_data[32/sizeof(unsigned long)];
    };


    diff -ur -X exclude 2.2.14-fixed/include/net/ip.h linux/include/net/ip.h
    --- 2.2.14-fixed/include/net/ip.h Wed Oct 27 02:53:42 1999
    +++ linux/include/net/ip.h Mon Feb 28 19:34:46 2000
    @@ -148,7 +148,8 @@

    if (hh) {
    read_lock_irq(&hh->hh_lock);
    - memcpy(skb->data - 16, hh->hh_data, 16);
    + memcpy(skb->data - dev->hard_header_len, hh->hh_data,
    + dev->hard_header_len);
    read_unlock_irq(&hh->hh_lock);
    skb_push(skb, dev->hard_header_len);
    return hh->hh_output(skb);
    diff -ur -X exclude 2.2.14-fixed/net/ethernet/eth.c linux/net/ethernet/eth.c
    --- 2.2.14-fixed/net/ethernet/eth.c Tue Jan 4 20:12:26 2000
    +++ linux/net/ethernet/eth.c Mon Feb 28 19:28:38 2000
    @@ -237,7 +237,7 @@
    int eth_header_cache(struct neighbour *neigh, struct hh_cache *hh)
    {
    unsigned short type = hh->hh_type;
    - struct ethhdr *eth = (struct ethhdr*)(((u8*)hh->hh_data) + 2);
    + struct ethhdr *eth = (struct ethhdr*)((u8*)hh->hh_data);
    struct device *dev = neigh->dev;

    if (type == __constant_htons(ETH_P_802_3))
    @@ -255,7 +255,7 @@

    void eth_header_cache_update(struct hh_cache *hh, struct device *dev, unsigned char * haddr)
    {
    - memcpy(((u8*)hh->hh_data) + 2, haddr, dev->addr_len);
    + memcpy((u8*)hh->hh_data, haddr, dev->addr_len);
    }

    #ifndef CONFIG_IP_ROUTER
    \
     
     \ /
      Last update: 2005-03-22 13:56    [W:0.025 / U:29.708 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site