• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] patch schreiben

Conax

Hacker
Code:
commit fffd6e63ea75850dafbf2ccfb38a4189f43c0282
Author: Maxim Levitsky <maximlevitsky@xxxxxxxxx>
Date:   Tue Jun 1 15:43:21 2010 +0300

    wireless: allow to retrieve the channel set on monitor interface
    
    This will allow to preserve compatibility with userspace
    
    Signed-off-by: Maxim Levitsky <maximlevitsky@xxxxxxxxx>

diff --git a/net/wireless/chan.c b/net/wireless/chan.c
index b01a6f6..09d979b 100644
--- a/net/wireless/chan.c
+++ b/net/wireless/chan.c
@@ -49,9 +49,12 @@ int cfg80211_set_freq(struct cfg80211_registered_device *rdev,
 {
 	struct ieee80211_channel *chan;
 	int result;
+	struct wireless_dev *mon_dev = NULL;
 
-	if (wdev && wdev->iftype == NL80211_IFTYPE_MONITOR)
+	if (wdev && wdev->iftype == NL80211_IFTYPE_MONITOR) {
+		mon_dev = wdev;
 		wdev = NULL;
+	}
 
 	if (wdev) {
 		ASSERT_WDEV_LOCK(wdev);

Ich will selber einen patch schreiben allerdings verstehe ich nicht was "@@ -49,9 +49,12 @@" das genau bedeutet?


--- a/net/wireless/chan.c
+++ b/net/wireless/chan.c


also das /net/wireless/chan.c der Pfad zur chan.c Datei ist ist mir klar aber was hat es mit dem +++b und ---a auf sich

Das was innerhalb der {} steht ist mir klar einfach besagten Code aus der Datei entfernen und durch Code ersetzen (erklärt sich ja mit dem plus und minus).

Und zum schluss würde mich noch interessieren was dieser "index b01a6f6..09d979b 100644" bedeutet?

danke
 
A

Anonymous

Gast
einen patch schreibt man nicht, zumindestens nicht so wie du dir das vorstellst. Ein patch ist ein Vergleich zwischen 2 Dateien oder mehreren Dateien in unterschiedlichen Verzeichnissen mit hilfe des Kommando diff

Beispiel:
alte Datei ist datei.org mit folgendem Inhalt
Code:
Das ist die Orginaldatei
vor der Änderung
1
2
3
4
Daraus wurde die Datei datei.neu gemacht
Code:
Das ist die geänderte Orginaldatei
nach der Änderung
1
2
2.5
4
4.5
jetzt wird daraus mit dem Befehl diff der Patch erstellt, der die Differnzen der Dateien anzeigt.
Code:
# diff -Nau datei.org datei.neu
--- datei.org   2011-03-20 23:55:59.000000000 +0100
+++ datei.neu   2011-03-20 23:57:52.000000000 +0100
@@ -1,7 +1,8 @@
-Das ist die Orginaldatei
-vor der Änderung
+Das ist die geänderte Orginaldatei
+nach der Änderung
 1
 2
-3
+2.5
 4
+4.5
Oder umgeleitet gleich in eine datei namens patch
Code:
diff -Nau datei.org datei.neu > patch
Und was da rauskommt ist der Patch. Hier musst du nur die Optionen von diff entsprechend anpassen. Im Beispiel wurden einfache Optionen "-Nau" verwendet, (in deinem Beispiel wurde das aus einem git-Archiv heraus gemacht mit einer modifizierten Version von diff gemacht, da sind mehrere Einträge vorhanden die sich auf den genaue Version innerhalb des Archives stützen.) Mit Hilfe dieses patches kann jetzt jeder die Orginaldatei auf den neusten Stand bringen.
Code:
patch datei.org < patch
danach hat dann die datei.org den geändeten Inhalt.


Das ganze geht auch rekursiv über ganze Verzeichnisbäume. Die verwendeten Optionen sollten im Patch immer oben mit drinstehen, zumindestens wenn es sich um einen Patch über mehrere Dateien handelt. Je nach verwendeten Optionen kann der Patch auch unterschiedlich aussehen. Eventuell sind auch vorher noch LC-Variablen zu setzen damit es zB keine Probleme mit deutschen oder anderen Sonderzeichen gibt wenn jemand eine andere Ländereinstellungen auf seinem Rechner hat. erste Hilfe sollte es in den Manpage von diff und patch geben.

robi
 
OP
C

Conax

Hacker
Hier mal das Ergebnis meiner Arbeit:

Code:
diff -u --recursive a/drivers/net/wireless//mac80211_hwsim.c b/drivers/net/wireless//mac80211_hwsim.c
--- a/drivers/net/wireless//mac80211_hwsim.c	2011-03-21 23:51:30.000000000 +0100
+++ b/drivers/net/wireless//mac80211_hwsim.c	2011-03-22 00:10:19.796726001 +0100
@@ -204,14 +204,14 @@
 	.band = IEEE80211_BAND_2GHZ, \
 	.center_freq = (_freq), \
 	.hw_value = (_freq), \
-	.max_power = 20, \
+	.max_power = 30, \
 }
 
 #define CHAN5G(_freq) { \
 	.band = IEEE80211_BAND_5GHZ, \
 	.center_freq = (_freq), \
 	.hw_value = (_freq), \
-	.max_power = 20, \
+	.max_power = 30, \
 }
 
 static const struct ieee80211_channel hwsim_channels_2ghz[] = {

Code:
stefan@linux-ufn8:~/src/compat-wireless-2.6.37-4> patch -p1 < maximum_output_power.patch 
patching file drivers/net/wireless//mac80211_hwsim.c

Habe nachgeschaut und hat alles prima geklappt. Bei einem Kernel update muss ich nämlich compat wireless neu einspielen und damit alles läuft müssen ein paar dateien modifiziert werden (das mit der ausgangsleistung oben ist nur eines davon). Langfristig können diese patches mir meine Arbeit dabei erleichtern.

Wenn alle patches dann mal fertig sind möchte ich mich dann an ein kleines script heranwagen.
 
OP
C

Conax

Hacker
So jetzt ist der patch für compat wireless so weit fertig (finale version) und er funktioniert richtig gut. Hier mal das Resultat:

Code:
diff -u --recursive a//config.mk b//config.mk
--- a//config.mk	2011-01-13 02:03:11.000000000 +0100
+++ b//config.mk	2011-03-27 06:39:01.000000000 +0200
@@ -207,14 +207,14 @@
 ifdef CONFIG_PCI
 
 CONFIG_ATH5K=m
-# CONFIG_ATH5K_DEBUG=y
+CONFIG_ATH5K_DEBUG=y
 CONFIG_ATH9K_HW=m
 CONFIG_ATH9K=m
 # Note: once ath9k_htc is added we'll have to move
 # CONFIG_ATH9K_COMMON to an area that doesn't depend on PCI
 # as you could then have ath9k disabled but ath9k_htc enabled.
 CONFIG_ATH9K_COMMON=m
-# CONFIG_ATH9K_DEBUGFS=y
+CONFIG_ATH9K_DEBUGFS=y
 # CONFIG_ATH9K_PKTLOG=y
 # Disable this to get minstrel as default, we leave the ath9k
 # rate control algorithm as the default for now as that is also
@@ -553,7 +553,7 @@
 else #CONFIG_COMPAT_KERNEL_25
 CONFIG_RT2X00_LIB_LEDS=y
 endif #CONFIG_COMPAT_KERNEL_25
-# CONFIG_RT2X00_DEBUG=y
+CONFIG_RT2X00_DEBUG=y
 # CONFIG_RT2X00_LIB_DEBUGFS
 endif
 
@@ -567,7 +567,7 @@
 
 # Atheros
 CONFIG_ATH_COMMON=m
-# CONFIG_ATH_DEBUG=y
+CONFIG_ATH_DEBUG=y
 
 CONFIG_WL12XX=y
 ifdef CONFIG_CRC7
Nur in b/: config.mk~.
diff -u --recursive a//drivers/net/wireless/ath/ath5k/base.c b//drivers/net/wireless/ath/ath5k/base.c
--- a//drivers/net/wireless/ath/ath5k/base.c	2011-01-13 02:05:00.000000000 +0100
+++ b//drivers/net/wireless/ath/ath5k/base.c	2011-03-27 05:19:07.000000000 +0200
@@ -3072,8 +3072,6 @@
 	struct ath5k_hw *ah = sc->ah;
 	u32 mfilt[2], rfilt;
 
-	mutex_lock(&sc->lock);
-
 	mfilt[0] = multicast;
 	mfilt[1] = multicast >> 32;
 
@@ -3153,8 +3151,6 @@
 	/* Set the cached hw filter flags, this will later actually
 	 * be set in HW */
 	sc->filter_flags = rfilt;
-
-	mutex_unlock(&sc->lock);
 }
 
 static int
Nur in b//drivers/net/wireless/ath/ath5k: base.c.orig.
Nur in b//drivers/net/wireless/ath/ath5k: base.c.rej.
diff -u --recursive a//drivers/net/wireless/ath/regd.c b//drivers/net/wireless/ath/regd.c
--- a//drivers/net/wireless/ath/regd.c	2011-01-13 02:05:00.000000000 +0100
+++ b//drivers/net/wireless/ath/regd.c	2011-03-27 06:55:09.000000000 +0200
@@ -28,12 +28,12 @@
  */
 
 /* Only these channels all allow active scan on all world regulatory domains */
-#define ATH9K_2GHZ_CH01_11	REG_RULE(2412-10, 2462+10, 40, 0, 20, 0)
+#define ATH9K_2GHZ_CH01_11	REG_RULE(2412-10, 2462+10, 40, 0, 30, 0)
 
 /* We enable active scan on these a case by case basis by regulatory domain */
-#define ATH9K_2GHZ_CH12_13	REG_RULE(2467-10, 2472+10, 40, 0, 20,\
+#define ATH9K_2GHZ_CH12_13	REG_RULE(2467-10, 2472+10, 40, 0, 30,\
 					NL80211_RRF_PASSIVE_SCAN)
-#define ATH9K_2GHZ_CH14		REG_RULE(2484-10, 2484+10, 40, 0, 20,\
+#define ATH9K_2GHZ_CH14		REG_RULE(2484-10, 2484+10, 40, 0, 30,\
 				NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_OFDM)
 
 /* We allow IBSS on these on a case by case basis by regulatory domain */
Nur in b//drivers/net/wireless/ath: regd.c~.
diff -u --recursive a//drivers/net/wireless/mac80211_hwsim.c b//drivers/net/wireless/mac80211_hwsim.c
--- a//drivers/net/wireless/mac80211_hwsim.c	2011-01-13 02:05:00.000000000 +0100
+++ b//drivers/net/wireless/mac80211_hwsim.c	2011-03-27 05:16:39.000000000 +0200
@@ -127,8 +127,8 @@
 	.n_reg_rules = 4,
 	.alpha2 =  "99",
 	.reg_rules = {
-		REG_RULE(2412-10, 2462+10, 40, 0, 20, 0),
-		REG_RULE(2484-10, 2484+10, 40, 0, 20, 0),
+		REG_RULE(2412-10, 2462+10, 40, 0, 30, 0),
+		REG_RULE(2484-10, 2484+10, 40, 0, 30, 0),
 		REG_RULE(5150-10, 5240+10, 40, 0, 30, 0),
 		REG_RULE(5745-10, 5825+10, 40, 0, 30, 0),
 	}
@@ -138,7 +138,7 @@
 	.n_reg_rules = 2,
 	.alpha2 =  "99",
 	.reg_rules = {
-		REG_RULE(2412-10, 2462+10, 40, 0, 20, 0),
+		REG_RULE(2412-10, 2462+10, 40, 0, 30, 0),
 		REG_RULE(5725-10, 5850+10, 40, 0, 30,
 			NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS),
 	}
@@ -203,14 +203,14 @@
 	.band = IEEE80211_BAND_2GHZ, \
 	.center_freq = (_freq), \
 	.hw_value = (_freq), \
-	.max_power = 20, \
+	.max_power = 30, \
 }
 
 #define CHAN5G(_freq) { \
 	.band = IEEE80211_BAND_5GHZ, \
 	.center_freq = (_freq), \
 	.hw_value = (_freq), \
-	.max_power = 20, \
+	.max_power = 30, \
 }
 
 static const struct ieee80211_channel hwsim_channels_2ghz[] = {
Nur in b//drivers/net/wireless: mac80211_hwsim.c~.
Nur in b//drivers/net/wireless: mac80211_hwsim.c.orig.
diff -u --recursive a//include/net/ieee80211_radiotap.h b//include/net/ieee80211_radiotap.h
--- a//include/net/ieee80211_radiotap.h	2011-01-13 02:04:59.000000000 +0100
+++ b//include/net/ieee80211_radiotap.h	2011-03-27 05:28:47.000000000 +0200
@@ -244,6 +244,9 @@
 						 * retries */
 #define IEEE80211_RADIOTAP_F_TX_CTS	0x0002	/* used cts 'protection' */
 #define IEEE80211_RADIOTAP_F_TX_RTS	0x0004	/* used rts/cts handshake */
+#define IEEE80211_RADIOTAP_F_TX_NOACK	0x0008	/* frame should not be ACKed */
+#define IEEE80211_RADIOTAP_F_TX_NOSEQ	0x0010	/* sequence number handled
+						 * by userspace */
 
 /* Ugly macro to convert literal channel numbers into their mhz equivalents
  * There are certianly some conditions that will break this (like feeding it '30')
Nur in b//include/net: ieee80211_radiotap.h.orig.
diff -u --recursive a//net/mac80211/tx.c b//net/mac80211/tx.c
--- a//net/mac80211/tx.c	2011-01-13 02:05:00.000000000 +0100
+++ b//net/mac80211/tx.c	2011-03-27 05:28:47.000000000 +0200
@@ -775,6 +775,10 @@
 	u8 *qc;
 	int tid;
 
+	if (unlikely(!(info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ)))
+		return TX_CONTINUE;
+	info->flags &= ~IEEE80211_TX_CTL_ASSIGN_SEQ;
+
 	/*
 	 * Packet injection may want to control the sequence
 	 * number, if we have no matching interface then we
@@ -1081,6 +1085,12 @@
 			if (*iterator.this_arg & IEEE80211_RADIOTAP_F_FRAG)
 				tx->flags |= IEEE80211_TX_FRAGMENTED;
 			break;
+		case IEEE80211_RADIOTAP_TX_FLAGS:
+			if (*iterator.this_arg & IEEE80211_RADIOTAP_F_TX_NOACK)
+				info->flags |= IEEE80211_TX_CTL_NO_ACK;
+			if (*iterator.this_arg & IEEE80211_RADIOTAP_F_TX_NOSEQ)
+				info->flags &= ~IEEE80211_TX_CTL_ASSIGN_SEQ;
+			break;
 
 		/*
 		 * Please update the file
@@ -1183,6 +1193,8 @@
 	 * it will be cleared/left by radiotap as desired.
 	 */
 	tx->flags |= IEEE80211_TX_FRAGMENTED;
+	/* Same here, controlled by radiotap and the stack */
+	info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ;
 
 	/* process and remove the injection radiotap header */
 	if (unlikely(info->flags & IEEE80211_TX_INTFL_HAS_RADIOTAP)) {
@@ -1235,16 +1247,10 @@
 		}
 	}
 
-	if (is_multicast_ether_addr(hdr->addr1)) {
-		tx->flags &= ~IEEE80211_TX_UNICAST;
+	if (is_multicast_ether_addr(hdr->addr1))
 		info->flags |= IEEE80211_TX_CTL_NO_ACK;
-	} else {
+	else
 		tx->flags |= IEEE80211_TX_UNICAST;
-		if (unlikely(local->wifi_wme_noack_test))
-			info->flags |= IEEE80211_TX_CTL_NO_ACK;
-		else
-			info->flags &= ~IEEE80211_TX_CTL_NO_ACK;
-	}
 
 	if (tx->flags & IEEE80211_TX_FRAGMENTED) {
 		if ((tx->flags & IEEE80211_TX_UNICAST) &&
Nur in b//net/mac80211: tx.c.orig.
diff -u --recursive a//net/wireless/chan.c b//net/wireless/chan.c
--- a//net/wireless/chan.c	2011-01-13 02:04:59.000000000 +0100
+++ b//net/wireless/chan.c	2011-03-27 05:18:36.000000000 +0200
@@ -82,9 +82,12 @@
 {
 	struct ieee80211_channel *chan;
 	int result;
+	struct wireless_dev *mon_dev = NULL;
 
-	if (wdev && wdev->iftype == NL80211_IFTYPE_MONITOR)
+	if (wdev && wdev->iftype == NL80211_IFTYPE_MONITOR) {
+		mon_dev = wdev;
 		wdev = NULL;
+	}
 
 	if (wdev) {
 		ASSERT_WDEV_LOCK(wdev);
@@ -131,5 +134,8 @@
 	if (wdev)
 		wdev->channel = chan;
 
+	if (mon_dev)
+		mon_dev->channel = chan;
+
 	return 0;
 }
Nur in b//net/wireless: chan.c.orig.

und der patching vorgang klappte erfolgreich:

Code:
stefan@linux-ufn8:~/src/compat-wireless-2.6.37-4> patch -p1 < compat-wireless-full.patch 
patching file config.mk
patching file drivers/net/wireless/ath/ath5k/base.c
patching file drivers/net/wireless/ath/regd.c
patching file drivers/net/wireless/mac80211_hwsim.c
patching file include/net/ieee80211_radiotap.h
patching file net/mac80211/tx.c
patching file net/wireless/chan.c

Jetzt müsste nur noch eine Art skript gebaut werden damit es das anschließend selbst kompiliert und instaliert.

Eine andere Alternative wäre die Erstellung eines rpms ich habe mich da auch nach dieser Anleitung gerichtet: http://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2003/07/RPM-Pakete-selbst-bauen

aber irgendwie klappte das nicht so ganz.
 

spoensche

Moderator
Teammitglied
Das Shellscript sollte doch kein Problem sein oder?

Wenn der Patch für die Funktionalität des ATH5K nötig ist, dann sei doch bitte so gut und reiche den Patch bei den Entwicklern ein.
 
OP
C

Conax

Hacker
Der Patch ist nicht für die Funktionalität notwendig. Diesen Patch habe ich für mich geschrieben für das wardriving Project - dort sind gewisse Dinge notwendig (monitor mode, injection etc.). Die Treiber laufen für ihre normale Verwendung einwandfrei.
 
Oben