이번에 닥친일은 ethaddr 중 특정 부분을 추출하는 일인데
sed를 써야 하나? shell에서 해야 하나? 이래저래 테스트 하는데..

sh 에서는.. busybox의 ash 라서 그런지 $(string:n:m) 방식의 추출이 되지 않았고
유일하게 되는게 $(string#substr) 로 일치하는 스트링을 삭제하는 것 뿐이었다.
그리고 sed는 .. 라인단위로 하다 보니. 일치하는 문자만을 삭제하려니.. OTL

그런 이유로 tr이라는 녀석이 걸려 나오게 되었다.
tr은 translate or delete characters 라는데.. 도대체 r은 어디서 튀어 나온 녀석일까 ㄱ-




아무튼, uboot 에서 사용하는 예약어인 ethaddr 에서 MAC 부분을 추출하려고 하면
fw_printenv 와 쉘 그리고 tr을 조합하면 된다.

일단 fw_printenv의 값은
 ethaddr=00:00:00:00:00:00
으로 출력되고 이 값을 변수에 넣어준다.

ETH_TEMP=`fw_printenv ethaddr`
ETH_ADDR=echo ${ETH_TEMP#ethaddr=} | tr -d :

그러면 간단하게 ethaddr= 뒤의 MAC 어드레스가 : 없이 나오게 된다.


[링크 : http://k.daum.net/qna/view.html?qid=2f8nN&l_cid=Q&l_st=1] tr
[링크 : http://linux.die.net/man/1/tr] tr man page
[링크 : http://www.faqs.org/docs/abs/HTML/string-manipulation.html]  sh 에서 스트링
[링크 : http://www.ibm.com/developerworks/kr/library/l-sed1.html]      sed 사용법
신고
Posted by 구차니

댓글을 달아 주세요

fw_printenv는 uboot에 포함된 tool이다
uboot/tool/env 에 존재하는 녀석인데
ethaddr을 값을 변경하려고 하니 에러가 발생하였다.

fw_setenv()의 리턴값은 30인데 아마도 EROFS가 30인듯 하다(errno.h에서는 발견하지 못한 변수이다.)
눈에 들어온 부분은 아래의 strcmp() 이다.
	/*
	 * Delete any existing definition
	 */
	if (oldval) {
		/*
		 * Ethernet Address and serial# can be set only once
		 */
		if ((strcmp (name, "ethaddr") == 0) ||
			(strcmp (name, "serial#") == 0)) {
			fprintf (stderr, "Can't overwrite \"%s\"\n", name);
			return (EROFS);
		}

		if (*++nxt == '\0') {
			*env = '\0';
		} else {
			for (;;) {
				*env = *nxt++;
				if ((*env == '\0') && (*nxt == '\0'))
					break;
				++env;
			}
		}
		*++env = '\0';
	}

아무튼, uboot에서 기본적으로 ethaddr과 serial#을 지원하고
이값들은, 한번만 write되고 수정되서는 안되기 때문에 제약사항으로 묶어놓은 듯 하다.
신고
Posted by 구차니

댓글을 달아 주세요

  1. Hmm. Syntax Highligher was upgraded to 2.0.320.
    http://alexgorbatchev.com/wiki/SyntaxHighlighter

    In Germany, I cannot type Korean!!!

    2009.08.19 23:36 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 영어로 된 글을 스팸으로 처리 고고싱! ㅋㅋ
      독일에서 수고가 많으세요 ㅠ.ㅠ

      2009.08.20 09:21 신고 [ ADDR : EDIT/ DEL ]
  2. 안녕하세요~ 구차니님~~~~^^
    임베리눅스 하면서 구차니님 참 많이 찾아 오고 있습니다..ㅠ ㅠ
    여기 저기 막 알아 보다가 질문이 하나 있어서..ㅠ ㅠ
    tftp 를 위하여 mac 을 그떄 그때 생성하려고 하는데...
    srand rand 이 녀석들은 쓸 수 없는 건가요..ㅠ ㅠ
    ㅎㅎㅎ 막연히 구글 세상 돌아다니다가...
    오늘은 여쭈어 보려고 왔습니다 ^^

    2011.09.22 12:45 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • MAC은 48비트로 이루어져서 6번만 256 으로 % 연산해서 값을 만들면 충분히 가능은 하지만 음.. 매번 맥을 생성하시려는 의도를 모르니 적용을 해도 될지는 잘 모르겠네요 ^^;

      2011.09.22 12:52 신고 [ ADDR : EDIT/ DEL ]
  3. 아.. 여기로 계속 여쭈어도 될런지요 ^^;;;
    기본 xx:xx:xx:00:00:01 로 ethaddr 은 code 로 설정을 하였습니다...
    kernel 부팅 후 어플에서는 MAC 을 eeprom 에 저장을 하고 쓰고 있죠...
    단지 복구용으로 tftp 를 사용하여고 하는데..
    eeprom 접근은 일이 커질 것 같고...
    하여 간단하게 mac 뒷자리 00:00:00 부분에 필요 할떄 생성을 하려고 합니다..
    그런데 mac 과 ip 가 같으면 tftp 접근이 안되어서...
    ip gate 등은 고정을 하고 mac 만 고때고때 접속을 시키려고 합니다..
    2대 이상의 board 가 tftp 접속을 위해서요..ㅠ ㅠ
    하여 난수를 발생 시키려고 하는데...
    srand rand 등 표준 함수?? 는 사용이 안되는 것 같아서 ㅎㅎㅎ
    tools/gen_eth_addr.c 이녀석을 찾아서 사용해 보려고 하였으나...
    이녀석은 단지 pc 용 프로그램인가요? ㅠ ㅠ
    uboot 소스 main.c 에서 srand 는 쓸수가 없기에..ㅠ ㅠ
    구글 찾아보니 표준 라이브러리 사용을 안한다고 ㅠ ㅠ
    잘 몰라서 막 돌아 다니다 결국은 구차니님 구찮게 해드리네요 ^^;;;

    그런데 댓글이 이렇게 길어도 되나요.. 죄송합니다..ㅠ ㅠ

    2011.09.22 13:12 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 일반적으로 rand()나 srand()는 표준라이브러리(stdlib) 사용하는데 u-boot나 busybox의 경우 용량을 줄이는게 목적이다 보니 표준라이브러리를 사용하지 않고 이런 이유로 인해 발생하는 것으로 알고 있습니다. 실제로 MAC이 부여된 녀석이라면 정식으로 EEPROM을 읽어 오는게 정석이죠 ^^:

      tools 의 녀석들은 말그대로 유틸리티이기 때문에
      부팅이 된후 u-boot의 저장역영을 함께 건드리는 프로그램들입니다.

      2011.09.22 13:48 신고 [ ADDR : EDIT/ DEL ]
  4. 아.. 두서가 없었는데요...ㅠㅠ
    결론적 요지는 ㅎㅎㅎ
    srand 와 rand 를 uboot source 의 어딘가에서 쓸수가 있을까...
    아니면 다른 난수를 만들 수 있는 방법이 있는가... 해서 여쭈어 봅니다 ^^*

    2011.09.22 13:20 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 일반적인 알고리즘이 시간정보를 받아와서 그걸 기준으로 랜덤값을 생성하는데 이러한 경우 대부분 동일한 값을 만들어 내는 문제가 있습니다. 그래서 입력전압을 시드값을 준다거나 하지만 만약 유일하게 들어가는 값이 uboot 상에 있다면(시리얼) 그 값을 사용하여 랜덤생성 알고리즘을 구해서 u-boot에 같이 넣고 컴파일 후 사용하시면 될것으로 생각됩니다.

      2011.09.22 13:50 신고 [ ADDR : EDIT/ DEL ]
    • http://www.daniweb.com/software-development/c/code/216329 이런 c code가 보이는데 도움이 되실진 잘 모르겠네요 ^^;

      2011.09.22 13:52 신고 [ ADDR : EDIT/ DEL ]
  5. 아...
    두서 없는 질문에 답해 주셔서 감사 합니다 ^^
    역시 삽질과 구글링은 진리 군요 ~
    앞으로도 열심히 찾아보고 질문도 드릴께요~*

    2011.09.22 13:53 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 저의 경우에는 USB 바코드 리더로 u-boot에 박아버렸기 때문에 ^^;
      이런 고생을 하진 않아서 잘 모르겠습니다 ㅠ.ㅠ

      2011.09.22 13:54 신고 [ ADDR : EDIT/ DEL ]
  6. 오홋...
    uboot 에서 USB 바코드를 이용하여서 환경변수 설정 하신건가요? ^^
    아.. 제가 진행하고 있는 플젝은 그게 안되네요 어흑...
    위에 링크 완젼 감사 합니다~
    매번 표준 함수를 편하게 가져다 쓰다보니...
    직접 구현하려니 머리가 둥~ 하네요 ^^;;

    2011.09.22 14:00 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • u-boot에서 바로 한건 아니고 PC 에서 시리얼 번호에 맞추어서
      MAC을 생성하고 그걸 부팅이 완료된 셋트로 전송하여
      fw_setenv 를 통해 macaddr을 넣어 준거랍니다.
      물론 uboot에서 macaddr은 변수를 수정할수 없게 되어 있어서 그걸 풀어주어야 했구요 ^^

      2011.09.22 14:08 신고 [ ADDR : EDIT/ DEL ]
  7. 헛...
    fw_setenv...
    이녀석 make 하고 어디에 생성되는 녀석인가요? ^^
    제가 생각하는 것에서 가장 이상적으로 해결되는 것인것 같내요...

    너무 많은걸 여쭈어서 죄송합니다.
    그런데 진작 여쭈어 볼껄 그럴껄 하는 생각도 마구 듭니다..ㅠ ㅠ

    2011.09.22 16:59 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • uboot/tool/env 에 있었는데 uboot 한게 작년이니.. 어디에 짱박혔을수도 있고...

      아무튼 예전에는 make가 잘안되서 억지로 gcc로 링크걸고 해서 컴파일을 했던 기억이 나는군요 ^^;

      2011.09.22 17:06 신고 [ ADDR : EDIT/ DEL ]
  8. ㅎㅎㅎ 감사합니다^^
    어플에서 mac 넣을때...
    uboot 환경 변수 flash 에서 읽어다가 때려 박아야 겠네요 ㅋㅋ
    진즉 이런 아이디어가 왜 안떠올랐을까요 ㅎㅎ

    2011.09.22 17:16 신고 [ ADDR : EDIT/ DEL : REPLY ]