[Click] patches to build linuxmodule on 2.6.12

David Claffey dclaffey at jjplus.com
Tue May 23 13:49:53 EDT 2006


I also have some minor patches I didn't post.  I made the changes to build the 
linuxmodule on a 2.6.12 kernel running on a different architecture (LinkGear-100 
SH4 platform).  I didn't post them because I haven't had time to comfirm my 
changes are correct or if there were a better solution.  But maybe they are useful.

For example, the SH4 is sensitive to alignment and I needed to change some #ifs 
to #ifdefs for the build to work.  Now maybe I needed to change how and if the 
macro HAVE_INDIFFERENT_ALIGNMENT is defined.  Not sure.

I also have a 2.6.12 kernel patch generated from the 2.6.11.6 that was in CVS, 
if anyone needs it.

- David


diff -Naur --exclude '*.orig' --exclude '*~' --exclude '#*' --exclude CVS 
--exclude '.#*' click/config.h.in click-sh4/config.h.in
--- click/config.h.in	2006-03-28 10:16:58.000000000 -0500
+++ click-sh4/config.h.in	2006-04-06 13:40:42.000000000 -0400
@@ -17,6 +17,7 @@
  /* Define if PollDevice should run fast to get good benchmark numbers */
  #undef CLICK_WARP9

+#ifndef __KERNEL__
  /* Define if you have the __builtin_clz function. */
  #undef HAVE___BUILTIN_CLZ

@@ -34,6 +35,7 @@

  /* Define if you have the __builtin_ffsll function. */
  #undef HAVE___BUILTIN_FFSLL
+#endif /* __KERNEL__ */

  /* Define if the va_list type is addressable. */
  #undef HAVE_ADDRESSABLE_VA_LIST
@@ -150,8 +152,10 @@
  #endif

  /* Define stuff under tools or a user-level driver. */
-#if defined(CLICK_USERLEVEL) || defined(CLICK_TOOL)
-# include <click/config-userlevel.h>
+#ifndef __KERNEL__
+# if defined(CLICK_USERLEVEL) || defined(CLICK_TOOL)
+#  include <click/config-userlevel.h>
+# endif
  #endif

  #endif /* CLICK_CONFIG_H */
diff -Naur --exclude '*.orig' --exclude '*~' --exclude '#*' --exclude CVS 
--exclude '.#*' click/elements/tcpudp/tcprewriter.cc 
click-sh4/elements/tcpudp/tcprewriter.cc
--- click/elements/tcpudp/tcprewriter.cc	2006-02-22 02:50:07.000000000 -0500
+++ click-sh4/elements/tcpudp/tcprewriter.cc	2006-04-06 13:40:42.000000000 -0400
@@ -77,7 +77,7 @@
  		      csum_delta += ~*csum & 0xFFFF;
  		
  		  for (opt += 2; opt < end_sack; opt += 8) {
-#if HAVE_INDIFFERENT_ALIGNMENT
+#ifdef HAVE_INDIFFERENT_ALIGNMENT
  		      uint32_t *uopt = reinterpret_cast<uint32_t *>(opt);
  		      uopt[0] = htonl(new_ack(ntohl(uopt[0])));
  		      uopt[1] = htonl(new_ack(ntohl(uopt[1])));
diff -Naur --exclude '*.orig' --exclude '*~' --exclude '#*' --exclude CVS 
--exclude '.#*' click/elements/userlevel/fakepcap.cc 
click-sh4/elements/userlevel/fakepcap.cc
--- click/elements/userlevel/fakepcap.cc	2005-03-14 11:55:33.000000000 -0500
+++ click-sh4/elements/userlevel/fakepcap.cc	2006-04-06 13:40:42.000000000 -0400
@@ -98,7 +98,7 @@
  	return dlt;
  }

-#if HAVE_INDIFFERENT_ALIGNMENT
+#ifdef HAVE_INDIFFERENT_ALIGNMENT
  #define unaligned_net_short(v) (ntohs(*reinterpret_cast<const uint16_t*>(v)))
  #define UNALIGNED_NET_SHORT_EQ(x, y) ((x) == htons((y)))
  #else
@@ -286,7 +286,7 @@
      if (!iph)
  	return false;

-#if !HAVE_INDIFFERENT_ALIGNMENT
+#ifndef HAVE_INDIFFERENT_ALIGNMENT
      // Machine may crash if we try to access 'iph'. Align it on a word
      // boundary.
      uintptr_t header_ptr = reinterpret_cast<uintptr_t>(iph);
diff -Naur --exclude '*.orig' --exclude '*~' --exclude '#*' --exclude CVS 
--exclude '.#*' click/elements/userlevel/fromfile.cc 
click-sh4/elements/userlevel/fromfile.cc
--- click/elements/userlevel/fromfile.cc	2006-01-09 14:03:47.000000000 -0500
+++ click-sh4/elements/userlevel/fromfile.cc	2006-04-06 13:40:42.000000000 -0400
@@ -435,7 +435,7 @@
      if (_pos + size <= _len) {
  	const uint8_t *chunk = _buffer + _pos;
  	_pos += size;
-#if HAVE_INDIFFERENT_ALIGNMENT
+#ifdef HAVE_INDIFFERENT_ALIGNMENT
  	return reinterpret_cast<const uint8_t *>(chunk);
  #else
  	// make a copy if required for alignment
diff -Naur --exclude '*.orig' --exclude '*~' --exclude '#*' --exclude CVS 
--exclude '.#*' click/include/click/atomic.hh click-sh4/include/click/atomic.hh
--- click/include/click/atomic.hh	2006-01-05 13:33:54.000000000 -0500
+++ click-sh4/include/click/atomic.hh	2006-04-06 13:40:42.000000000 -0400
@@ -8,6 +8,10 @@
  # else
  #  define CLICK_ATOMIC_VAL	__atomic_fool_gcc(&_val)
  # endif
+# if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)
+# define __save_flags_cli(x)    local_irq_save(x)
+# define __restore_flags(x)     local_irq_restore(x)
+# endif
  # ifdef __SMP__
  #  define CLICK_ATOMIC_LOCK	"lock ; "
  # else
diff -Naur --exclude '*.orig' --exclude '*~' --exclude '#*' --exclude CVS 
--exclude '.#*' click/linuxmodule/Makefile.in click-sh4/linuxmodule/Makefile.in
--- click/linuxmodule/Makefile.in	2006-03-22 15:13:54.000000000 -0500
+++ click-sh4/linuxmodule/Makefile.in	2006-04-06 13:40:42.000000000 -0400
@@ -79,7 +79,7 @@
  LINUXCFLAGS = $(shell echo "$(CFLAGS)" | sed -e s,-fno-unit-at-a-time,, \
  	-e s,-Wstrict-prototypes,, -e s,-Wdeclaration-after-statement,, \
  	-e s,-Wno-pointer-sign,, -e s,-fno-common,,)
-CLICKCPPFLAGS = @CPPFLAGS@ -DCLICK_LINUXMODULE
+CLICKCPPFLAGS = @CPPFLAGS@ $(CPPFLAGS) -DCLICK_LINUXMODULE
  CLICKCFLAGS = @CFLAGS_NDEBUG@
  CLICKCXXFLAGS = @CXXFLAGS_NDEBUG@
  CLICKDEPCFLAGS = -Wp,-MD,$(depfile)
@@ -106,7 +106,7 @@

  obj-m += $(INSTALLOBJS)

-click-objs := $(LIB_C_OBJS) $(LIB_CXX_OBJS) $(STD_ELEMENT_OBJS) \
+click-objs = $(LIB_C_OBJS) $(LIB_CXX_OBJS) $(STD_ELEMENT_OBJS) \
  	$(ELEMENT_OBJS) $(LINUXMODULE_C_OBJS) $(LINUXMODULE_CXX_OBJS) \
  	elements.o
  proclikefs-objs := proclikefs_.o



Eddie Kohler wrote:
> And thanks, also, for this!
> 
> Eddie
> 
> 
> David Claffey wrote:
>> I have the click linuxmodule and the madwifi-ng driver running on 
>> linux-2.6.12.   I'm using todevice() to send packets out the ath 
>> device in monitor mode.  But this only works after adding the 
>> following patch:
>> --- click/elements/linuxmodule/todevice.cc
>> +++ tmp/elements/linuxmodule/todevice.cc
>> @@ -383,6 +383,12 @@
>>       skb_put(skb1, 60 - skb1->len);
>>       }
>>
>> +    skb1->dev = _dev;
>> +
>>       int ret;
>>   #if HAVE_LINUX_POLLING
>>       if (_dev->polling > 0)
>>     ret = _dev->tx_queue(_dev, skb1);
>>      else
>> #endif
>>     {
>>         ret = _dev->hard_start_xmit(skb1, _dev);
>>         _hard_start++;
>>     }
>>
>> Todevice() passes the skb to ieee80211_hardstart(struct sk_buff *skb, 
>> struct net_device *dev) which then calls 
>> ieee80211_monitor_encap(struct ieee80211vap *vap, struct sk_buff 
>> *skb).  The problem arises when ieee80211_monitor_encap() references 
>> skb->dev->type with skb->dev NULL. Can anyone suggest which function 
>> should set skb->dev, todevice or ieee80211_hardstart?
>>
>> - David
>> _______________________________________________
>> click mailing list
>> click at amsterdam.lcs.mit.edu
>> https://amsterdam.lcs.mit.edu/mailman/listinfo/click
> 


More information about the click mailing list